这是我的情景。该程序是使用发布者/订阅者方法开发的。在生产者和消费者部分中有两个主题(topic1,topic2)。我需要从生产者程序中的使用者那里获得对收到的topic1的确认,这样当确认状态为真时,生产者程序将必须在topic2上发送消息。
有谷歌搜索链接暗示消费者session.CLIENT_ACKNOWLEDGE
。但我需要将确认状态返回给生产者以进行进一步处理。
答案 0 :(得分:3)
JMS规范没有为发布者定义任何API,以便知道订阅者是否使用了消息。发布者只是发布消息,而消息提供者/代理将该消息传递给订阅者。如果存在订阅,则代理将传递消息,否则将丢弃该消息。
session.CLIENT_ACKNOWLEDGE
选项是消费者告诉消息提供者(非生产者)从其队列/内存中删除消息的方式之一。还有其他一些确认选项,但所有这些选项都是为了告诉消息提供商删除消息,但不告诉制作人。
如果生产者需要来自消费者的确认,那么消费者将不得不在另一个主题上发布确认消息,并且生产者订阅该主题以接收这些确认。例如:
制片人在TOPIC1
发表
制片人订阅TOPIC1/ACKS
消费者订阅TOPIC1
收到消息后
消费者向TOPIC1/ACKS
发布确认消息
制片人将收到确认信息
然后它可以在TOPIC2上发布
您必须注意,可能有多条确认消息,因为TOPIC1上可能有多个订阅者。
答案 1 :(得分:0)
如果您的程序只包含一个消息生产者,您可以在消息使用者中创建一个队列,并让生产者订阅该队列。在队列模式下,它是点对点的。因此,消息将仅从消费者传递给生产者。
或者,您也可以使用setJMSReplyTo方法指定消费者在收到来自生产者的消息时要回复的队列。这样您就不需要在使用者中显式创建队列,但您也可以在生成器中创建队列。但你仍然需要让制作人听那个队列收到确认。