我知道在我们在类上实现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();
}
答案 0 :(得分:2)
receive()
方法和MessageListener
都用于接收邮件。
1)receive()
方法是一个阻塞调用,这意味着在收到消息或关闭连接之前,该方法不会返回。
2)MessageListener
是callback
接收邮件的方式。应用程序将MessageListener附加到使用者/订阅者对象实例。只要有消息要传递给应用程序,JMS实现就会回调onMessage
MessageListener
方法。简单来说,MessageListener.onMessage
方法是从不同的线程调用的,因此它不像receive
方法那样阻塞应用程序线程。
为什么receive()方法没有获得任何出版物的可能原因
1)没有收到的出版物。因此接收方法正在等待。
2)你没有显示整个代码,所以我猜测:你正在从同一个线程接收和发布。由于接收呼叫被阻止,因此发布永远不会执行receive()
之后的代码。