【问题标题】:MessageConsumer.receive() vs MessageConsumer.setMessageListener(new ClassName());MessageConsumer.receive() 与 MessageConsumer.setMessageListener(new ClassName());
【发布时间】:2016-05-29 17:26:45
【问题描述】:

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

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()); 应用程序运行良好。请告诉我第一次实现时出了什么问题。

  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();
    }

【问题讨论】:

    标签: jms message-listener


    【解决方案1】:

    receive() 方法和MessageListener 都用于接收消息。

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

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

    receive() 方法未获得任何发布的可能原因

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      相关资源
      最近更新 更多