【发布时间】:2017-06-02 05:26:37
【问题描述】:
我有一个动态主题树,每个主题的最后一条消息都“保留”在其中。当我订阅主题树(使用 JMS/Java/MQLibs)时,由于它是动态的并且我使用通配符“#”订阅,我无法知道我会提前收到哪些主题。所以,
我怎样才能知道我已经阅读了所有可用主题至少一次?
我如何知道阅读的主题是订阅前存在的原始“保留”消息还是订阅后的更新? (我是否需要根据主题保留 MessageID 的本地映射?我假设我无法将订阅时的时间戳与消息创建时间进行比较,因为服务器和客户端上的时钟可能不同)。
我添加了一些示例代码,以表明我访问的是主题而不是队列。
public class JMSServerSubscriber implements MessageListener {
public JMSServerSubscriber() throws JMSException {
TopicConnection topicCon = JmsTopicConnectionFactory.createTopicConnection();
TopicSession topicSes = topicCon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = topicSes.createTopic("#");
TopicSubscriber topicSub = topicSes.createSubscriber(topic);
topicSub.setMessageListener(this);
topicCon.start();
}
@Override
public void onMessage(Message arg0) {
BytesMessage bm = (BytesMessage) arg0;
try {
String destination = bm.getJMSDestination().toString();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
【问题讨论】:
-
我不明白这个问题。当您订阅一个主题时,您指定一个队列,MQ 会将发布到该主题的消息放入该队列。当该队列为空时,您已阅读发布到该主题的所有消息。我看不出订阅主题树的一部分有何不同。
-
让我们说实际的主题树看起来像这样;
/BusRoute/1/BusRoute/2,我订阅了/BusRoute/#。我会立即收到1和2的回复,但我怎么知道这就是全部内容?