2016-08-18 3 views
0

그래서 JBoss가있는 Java Message Service에 대해 this youtube 튜토리얼을 따르고 있습니다. 내 코드는 동영상과 동일하지만 내 TopicConsumerTopicProducer 애플리케이션을 실행하면 둘 다 종료되고 내 메시지를받을 수 있습니다. 나는 setMessageListener이 새 스레드를 만들었으므로 주 스레드가 종료되었지만 여전히 메시지를받지 못하는 경우에도 메시지를 받아야한다고 읽었습니다.JMS 소비자가 종료하고 메시지를 수신하지 않습니다.

나는 onMessage을 호출하지 않는다는 것을 알았습니다. TopicConsumer이 (가) 종료되기 전에 종료 되었습니까?

동영상에서와 마찬가지로 JBoss 5.0 서버가 실행 중이므로 TopicConsumer을 먼저 실행합니다 (그러나 인쇄문과 달리 인쇄 문을 종료 한 후) TopicProduver (인쇄 문 바로 다음에서 종료 됨) 내 메시지를받지 못한다.

감사합니다.

TopicConsumer.java

package jmspubsubtutorial; 

import java.util.Properties; 

import javax.jms.JMSException; 
import javax.jms.Message; 
import javax.jms.MessageListener; 
import javax.jms.TextMessage; 
import javax.jms.Topic; 
import javax.jms.TopicConnection; 
import javax.jms.TopicConnectionFactory; 
import javax.jms.TopicSession; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 

public class TopicConsumer implements MessageListener { 

    public static void main(String[] args) throws JMSException, NamingException{ 
     System.out.println("---Starting TopicConsumer---"); 
     Context context = TopicConsumer.getInitialContext(); 
     TopicConnectionFactory topicConnectionFactory = (TopicConnectionFactory) context.lookup("ConnectionFactory"); 
     Topic topic = (Topic) context.lookup("topic/JMS_tutorial"); 
     TopicConnection topicConnection = topicConnectionFactory.createTopicConnection(); 
     TopicSession topicSession = topicConnection.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE); 

     topicSession.createSubscriber(topic).setMessageListener(new TopicConsumer()); 
     topicConnection.start(); 

     System.out.println("---Exiting TopicConsumer---"); 
    } 

    @Override 
    public void onMessage(Message message) { 
     System.out.println("--- onMessage ---"); 
     try { 
      System.out.println("Incoming message: " + ((TextMessage)message).getText()); 
     } catch (JMSException e) { 
      System.out.println("onMessage failed"); 
      e.printStackTrace(); 
     } 
    } 

    public static Context getInitialContext() throws JMSException, NamingException { 
     Properties props = new Properties(); 
     props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); 
     props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming"); 
     props.setProperty("java.naming.provider.url", "localhost:1099"); 
     Context context = new InitialContext(props); 
     return context; 
    } 
} 

TopicProducer.java

package jmspubsubtutorial; 

import javax.jms.JMSException; 
import javax.jms.TextMessage; 
import javax.jms.Topic; 
import javax.jms.TopicConnection; 
import javax.jms.TopicConnectionFactory; 
import javax.jms.TopicPublisher; 
import javax.jms.TopicSession; 
import javax.naming.Context; 
import javax.naming.NamingException; 

public class TopicProducer { 

    public static void main(String[] args) throws JMSException, NamingException{ 
     System.out.println("---Starting TopicProducer---"); 
     Context context = TopicConsumer.getInitialContext(); 
     TopicConnectionFactory topicConnectionFactory = (TopicConnectionFactory) context.lookup("ConnectionFactory"); 
     Topic topic = (Topic) context.lookup("topic/JMS_tutorial"); 
     TopicConnection topicConnection = topicConnectionFactory.createTopicConnection(); 
     TopicSession topicSession = topicConnection.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE); 
     topicConnection.start(); 
     TopicProducer topicProducer = new TopicProducer(); 
     String text = "message 1 from TopicProducer..."; 
     topicProducer.sendMessage(text, topicSession, topic); 

     System.out.println("---Exiting TopicProducer---"); 
    } 

    public void sendMessage(String text, TopicSession topicSession, Topic topic) throws JMSException { 
     System.out.println("Send Message: " + text + " " + topicSession + " " + topic); 
     TopicPublisher topicPublisher = topicSession.createPublisher(topic); 
     TextMessage textMessage = topicSession.createTextMessage(text); 
     topicPublisher.publish(textMessage); 
     topicPublisher.close(); 
    } 
} 

답변

0

그래서 문제는 유지하기 위해 적어도 하나의 비 데몬 스레드를 유지하기 위해 JMS 라이브러리에 의존한다는 것이다 당신의 응용 프로그램을 생성하고 메시지 수신기를 할당 한 후에도 응용 프로그램을 계속 사용할 수 있지만 실제로는 이러한 작업을 수행 할 것이라는 보장은 없습니다.

많은 JMS 공급자가 실제로 내부적으로 실행되는 하나의 비 데몬 스레드를 항상 보유하려고 시도하지만 사실 항상 그렇다고 가정하면 실제로는 바람직하지 않습니다. 특정 공급자가이 작업을 수행하지 않는 것으로 보였으므로 응용 프로그램이 계속 실행되도록하려면 직접 수행해야합니다.

관련 문제