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