客户端个人ACK的持久订阅者不起作用

时间:2019-05-13 18:57:09

标签: python activemq stomp consumer jms-topic

我有一个固定的主题订阅者(例如:topic_a)。我正在尝试提供客户端个人的ACK。在try块的末尾,我提供了手动确认,而在异常块中,我没有进行确认。每当发生错误时,消费者(订户)都会挂断电话并最终停止。 我正尝试在基于主题(PUB-SUB)的实现中进行手动确认。 1)。可能吗? 2)。邮件是否将重新发送给相同的持久订户?

在主类内部执行方法:

        self.conn = stomp.Connection11(self.conn_param, encoding=self.ENCODE_FORMAT)
        self.conn.start()
        self.conn.connect(wait=True, headers={'client-id': self.CLIENT_ID})
        self.conn.set_listener('', CustomListener(self.conn))

监听器类:

class CustomListener(stomp.ConnectionListener):
    def __init__(self, conn, func_to_exec):
        self.conn = conn

    def on_message(self, headers, message):
        try:
            message = json.loads(message)

            /**DO SOME BUSINESS LOGIC**/

            self.conn.ack(headers.get("message-id"), int(headers.get("subscription")))
            print("message ack done..!")
        except Exception as ex:
            print("Exception in processing message :: %s"%(ex))
on_message侦听器中的

,如果在处理期间发生任何异常。那么邮件需要重新发送。

1 个答案:

答案 0 :(得分:1)

如果使用客户端个人确认模式,则您的代码有责任确认发送给它的消息,如果您未能确认足够的确认,则代理将停止向您发送更多消息,因为您已经用尽了已配置的可用信用。代理将假定未确认的消息处于待处理状态,直到您对它们进行确认或否定。您可以使用NACK毒化邮件,然后将其发送到DLQ或(如果配置了代理方,则重新安排发送)让代理重新传递邮件。