MessageConsumer.receive() vs MessageConsumer.setMessageListe



我知道在类上实现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.received()我使用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();
}

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

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

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

receive()方法未获得任何出版物的可能原因

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

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

最新更新