2016-08-18 14 views
0

したがって、私はthisのJBossを使用したJava Message Serviceに関するYouTubeチュートリアルに従います。私のコードはビデオと同じですが、TopicConsumerTopicProducerのアプリケーションを実行すると、両方とも終了し、私のメッセージを受け取るために生きていません。 setMessageListenerは新しいスレッドを作成しているので、メインスレッドが終了してもメッセージを受信する必要がありますが、まだメッセージを受信して​​いないと読んでいます。JMSコンシューマが終了し、メッセージを受信しません。

onMessageが呼び出されていないことが判明しました。TopicConsumerが終了する可能性があるため、終了していますか?

ビデオの場合と同じように私はJBoss 5.0サーバーを実行していますが、最初にTopicConsumerを実行します(ただし、printステートメントの後で終了します)。TopicProduver(printステートメントの直後に終了します)私のメッセージを受け取りません。

ありがとうございました。

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

だから、問題は、あなたを維持するために、少なくとも1つの非デーモンスレッドを維持するためにJMSライブラリに依存しているということです消費者を作成してメッセージリスナを割り当てた後で、アプリケーションが生きているのですが、実際にそのようなことをする保証はありません。

多くのJMSプロバイダは、実際には内部的に実行される単一の非デーモンスレッドを常に作成しようとしていますが、これが常に当てはまると仮定すれば、実際にはお勧めできません。特定のプロバイダがこれを行うわけではないことが分かったので、アプリケーションを確実に実行したい場合は、これを自分で実行する必要があります。

関連する問題