MessageConsumer.receive()vs MessageConsumer.setMessageListener(new ClassName());

时间:2016-05-29 17:26:45

标签: jms message-listener

我知道在我们在类上实现MessageListener时使用setMessageListener的一小部分。 以下课程适用于接收人。 subscribe和publish方法都在同一个类中。当我尝试执行此操作时,我的应用程序将不会收到消息。它也不会产生消息,可能是因为订阅方法有些错误,我不确定。

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接口扩展的类而不是 Message message = topicSubscriber.receive(); 我使用 topicSubscriber.setMessageListener(new Chat()); < / strong>应用程序运行正常。请告诉我第一次实现时出了什么问题。

  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 个答案:

答案 0 :(得分:2)

receive()方法和MessageListener都用于接收邮件。

1)receive()方法是一个阻塞调用,这意味着在收到消息或关闭连接之前,该方法不会返回。

2)MessageListenercallback接收邮件的方式。应用程序将MessageListener附加到使用者/订阅者对象实例。只要有消息要传递给应用程序,JMS实现就会回调onMessage MessageListener方法。简单来说,MessageListener.onMessage方法是从不同的线程调用的,因此它不像receive方法那样阻塞应用程序线程。

为什么receive()方法没有获得任何出版物的可能原因

1)没有收到的出版物。因此接收方法正在等待。

2)你没有显示整个代码,所以我猜测:你正在从同一个线程接收和发布。由于接收呼叫被阻止,因此发布永远不会执行receive()之后的代码。