主题订阅者没有收到消息
Topic subscriber didn't receive a message
我最近在 jms 中使用 Topic 时遇到了问题。我的 TopicSubscriber 没有收到发布者的消息,我不明白为什么。
这是我的 TopicPublisher:
public class Publisher
{
private static final String CONNECTION_URL = "tcp://localhost:61616";
public static void main(String[] args) throws Exception
{
BrokerService service = BrokerFactory.createBroker(new URI("broker:(" + CONNECTION_URL + ")"));
service.start();
TopicConnectionFactory connectionFactory = new ActiveMQConnectionFactory(CONNECTION_URL);
// create a topic connection
TopicConnection topicConn = connectionFactory.createTopicConnection();
// create a topic session
TopicSession topicSession = topicConn.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
// lookup the topic object
Topic topic = topicSession.createTopic("test");
// create a topic publisher
TopicPublisher topicPublisher = topicSession.createPublisher(topic);
topicPublisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// create the "Hello World" message
TextMessage message = topicSession.createTextMessage();
message.setText("Hello World");
// publish the messages
topicPublisher.publish(message);
// print what we did
System.out.println("Message published: " + message.getText());
// close the topic connection
topicConn.close();
}
}
我的主题订阅者:
public class Subscriber
{
private static final String CONNECTION_URL = "tcp://localhost:61616";
public static void main(String[] args) throws Exception
{
TopicConnectionFactory connectionFactory = new ActiveMQConnectionFactory(CONNECTION_URL);
// create a topic connection
TopicConnection topicConn = connectionFactory.createTopicConnection();
// create a topic session
TopicSession topicSession = topicConn.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
Topic topic = topicSession.createTopic("test");
// create a topic subscriber
TopicSubscriber topicSubscriber = topicSession.createSubscriber(topic);
// start the connection
topicConn.start();
// receive the message
TextMessage message = (TextMessage) topicSubscriber.receiveNoWait();
// print the message
System.out.println("Message received: " + message.getText());
// close the topic connection
topicConn.close();
}
}
在我的订户中,我在 message.getText()
上有一个 NullPointer
那是什么问题?我做错了什么以及如何解决?
您似乎是在创建订阅之前发送消息。 JMS 主题使用发布-订阅语义,其中发布的任何消息都会发送到所有订阅。如果没有订阅,则消息将被丢弃。
此外,由于您使用的是 receiveNoWait()
,因此您的客户收到消息的可能性大大降低了。为了让您的客户真正收到消息,消息必须在您调用 createSubscriber(topic)
和调用 receiveNoWait()
之间发送。由于这 2 个调用非常接近,因此 window 的时间非常短。
如果你真的想让你的订阅者收到消息,那么先 运行 Subscriber
并使用 receive()
而不是 receiveNoWait()
然后 运行 Publisher
。这将确保订阅在发送消息时存在,并且客户端在退出之前等待接收消息。
我最近在 jms 中使用 Topic 时遇到了问题。我的 TopicSubscriber 没有收到发布者的消息,我不明白为什么。
这是我的 TopicPublisher:
public class Publisher
{
private static final String CONNECTION_URL = "tcp://localhost:61616";
public static void main(String[] args) throws Exception
{
BrokerService service = BrokerFactory.createBroker(new URI("broker:(" + CONNECTION_URL + ")"));
service.start();
TopicConnectionFactory connectionFactory = new ActiveMQConnectionFactory(CONNECTION_URL);
// create a topic connection
TopicConnection topicConn = connectionFactory.createTopicConnection();
// create a topic session
TopicSession topicSession = topicConn.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
// lookup the topic object
Topic topic = topicSession.createTopic("test");
// create a topic publisher
TopicPublisher topicPublisher = topicSession.createPublisher(topic);
topicPublisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// create the "Hello World" message
TextMessage message = topicSession.createTextMessage();
message.setText("Hello World");
// publish the messages
topicPublisher.publish(message);
// print what we did
System.out.println("Message published: " + message.getText());
// close the topic connection
topicConn.close();
}
}
我的主题订阅者:
public class Subscriber
{
private static final String CONNECTION_URL = "tcp://localhost:61616";
public static void main(String[] args) throws Exception
{
TopicConnectionFactory connectionFactory = new ActiveMQConnectionFactory(CONNECTION_URL);
// create a topic connection
TopicConnection topicConn = connectionFactory.createTopicConnection();
// create a topic session
TopicSession topicSession = topicConn.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
Topic topic = topicSession.createTopic("test");
// create a topic subscriber
TopicSubscriber topicSubscriber = topicSession.createSubscriber(topic);
// start the connection
topicConn.start();
// receive the message
TextMessage message = (TextMessage) topicSubscriber.receiveNoWait();
// print the message
System.out.println("Message received: " + message.getText());
// close the topic connection
topicConn.close();
}
}
在我的订户中,我在 message.getText()
上有一个 NullPointer
那是什么问题?我做错了什么以及如何解决?
您似乎是在创建订阅之前发送消息。 JMS 主题使用发布-订阅语义,其中发布的任何消息都会发送到所有订阅。如果没有订阅,则消息将被丢弃。
此外,由于您使用的是 receiveNoWait()
,因此您的客户收到消息的可能性大大降低了。为了让您的客户真正收到消息,消息必须在您调用 createSubscriber(topic)
和调用 receiveNoWait()
之间发送。由于这 2 个调用非常接近,因此 window 的时间非常短。
如果你真的想让你的订阅者收到消息,那么先 运行 Subscriber
并使用 receive()
而不是 receiveNoWait()
然后 运行 Publisher
。这将确保订阅在发送消息时存在,并且客户端在退出之前等待接收消息。