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

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

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

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

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

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

更新:

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

【问题讨论】:

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

标签: java jms activemq message-queue worker


【解决方案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 重新传递消息,即使在某一时刻,连接在没有确认的情况下断开
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 2019-12-20
  • 2018-06-03
  • 2018-12-31
  • 2012-08-13
  • 2016-11-08
  • 1970-01-01
相关资源
最近更新 更多