2016-05-29 3 views
0

私は、クラスにMessageListenerを実装するときにsetMessageListenerが使用される小さな部分を知っています。 以下のクラスはレシーバ用です。 subscribeメソッドとpublishメソッドは同じクラスにあります。これを実行しようとすると、アプリケーションはメッセージを受信しません。それはおそらく購読方法のいくつかのエラーのためにメッセージを生成していません、私は確信していません。MessageConsumer.receive()とMessageConsumer.setMessageListener(新しいClassName());

public void subscribe(Connection topicConnection, Topic topic) throws JMSException{   
    TopicSession subscribeSession= (TopicSession) topicConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);    
    topic=subscribeSession.createTopic("topic/mohit");    
    TopicSubscriber topicSubscriber=subscribeSession.createSubscriber(topic);    
    topicConnection.start();    
    Message message=topicSubscriber.receive();    
    TextMessage textmessage=(TextMessage) message;    
    System.out.println(textmessage.getText());     
}    

}

私はクラスがMessageListenerインタフェースから延び、代わりメッセージメッセージ= topicSubscriber.receive()のコードの下付き有します。私はを使用していますtopicSubscriber.setMessageListener(new Chat());アプリケーションは正常に動作します。最初の実装で何が間違っているか教えてください。

public void subscribe(Connection topicConnection, Topic topic) throws JMSException{ 
    TopicSession subscribeSession= (TopicSession) topicConnection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
    topic=subscribeSession.createTopic("topic/mohit"); 
    TopicSubscriber topicSubscriber=subscribeSession.createSubscriber(topic); 
    topicSubscriber.setMessageListener(new Chat()); 
} 

@Override 
public void onMessage(Message message) { 
    try { 
     System.out.println(((TextMessage) message).getText()); 
    } catch (JMSException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

答えて

1

方法両方MessageListenerは、両方のメッセージを受信するために使用されます。

1)メソッドは、メッセージが受信されるか接続が閉じられるまでメソッドが返されないことを意味するブロッキング呼び出しです。

2)MessageListenerは、メッセージを受信するcallbackです。アプリケーションは、MessageListenerをコンシューマ/サブスクライバオブジェクトインスタンスにアタッチします。 JMS実装では、アプリケーションに配信されるメッセージがあるときはいつでも、メソッドをMessageListenerにコールバックします。簡単に言えば、MessageListener.onMessageメソッドは別のスレッドから呼び出されるため、receiveメソッドのようにアプリケーションスレッドをブロックしません。 ()メソッドを受ける理由について

考えられる理由は、あらゆる出版物

1)受信する一切の出版物はありませんでしたが取得されていません。したがって、受信メソッドは待機しています。

2)コード全体が表示されていないため、推測しています。同じスレッドから受信して公開しています。受信コールがブロックされているため、以降のコードは実行されません。

関連する問題