如何拒绝消息

Posted

技术标签:

【中文标题】如何拒绝消息【英文标题】:How to reject a message 【发布时间】:2013-10-16 01:20:50 【问题描述】:

我正在使用 ActiveMQ 实现客户端/工作人员系统,我想实现手动消息确认和消息拒绝。

为什么拒绝邮件?如果某个工作人员有太多任务要处理,我希望该工作人员告诉代理重新排队原始消息。

我知道有一些方法可以自动确认或实施交易,但我宁愿有这样的东西:

    消息需要在 5 秒内得到确认 如果未确认,代理会将消息发送给其他工作人员 作品可以随时手动拒绝消息

我怎样才能实现这一点(不只是手动将消息重新发送到代理)

更新:

稍微改述一下这个问题: 如何确保将未确认的消息重新添加回队列(并且重新传递可以返回到以前甚至没有确认的同一消费者 - 假设消费者离线然后又回来了)强>

【问题讨论】:

如果有像“message.reject()”这样的方法可以自动处理这一切,那实际上就完美了! 【参考方案1】:

关于队列的 ActiveMQ 网页:

如果消费者收到一条消息但之前没有确认 关闭然后消息将被重新传递给另一个消费者。

这就是你想要的,对吧?因此,您必须关闭 AUTO_ACKNOWLEDGEMENT 模式并使用另一种模式:CLIENT_ACKNOWLEDGE 或可能更具选择性的 INDIVIDUAL_ACKNOWLEDGE。

拒绝消息是不可能的,见ActiveMQ-Docu:

没有 JMS 'unacknowledge'。

【讨论】:

“关闭”是指在 Listener 类中调用关闭函数吗?如果有,是哪一个?这里还有时间方面。即,如果消息在传递后 5 秒内未得到确认,则假定它没有被传递? “关闭”是指“关闭消费者”。这是工人说“我现在无法处理消息,我太忙了”的一种方式。正好 5 秒会很困难,但你可以试试 'maxInactivityDuration'。我认为,issues.apache.org/jira/browse/AMQ-3394 是你想要的。在此处查看进一步讨论:activemq.2283324.n4.nabble.com/… 这实际上是行不通的。我将会话切换到 INDIVIDUAL_ACKNOWLEDGE 并且只要我可以接受数据,我就会调用 map.acknowledge() 。当我无法接受数据时,我向消费者发出停止命令(我还尝试了 Connection 对象)。发生的情况是工作人员确实停止接收消息,但 ActiveMQ 也会清空其队列,因此消息永远不会被传递!我确实希望 ActiveMQ 重新传递消息,即使在某一时刻,连接在没有确认的情况下断开

以上是关于如何拒绝消息的主要内容,如果未能解决你的问题,请参考以下文章

如何将拒绝消息添加到 Discord py 角色限制命令

如何解决等待消息中未处理的 Promise 拒绝?

拒绝访问消息队列系统

DRF:自定义权限被拒绝消息

排除来自“du”的所有权限被拒绝消息

如何在 web api Authentication Failed 场景中获取详细错误而不是“消息”:“此请求的授权已被拒绝。”?