【问题标题】:Rollback/Delete message from queue by producer before receiving it生产者在收到消息之前从队列中回滚/删除消息
【发布时间】:2013-01-16 04:50:06
【问题描述】:

生产者正在向队列发送许多消息。现在队列存储了这些消息。因此,在从消费者消费这些消息之前,如果生产者想要删除队列中的一些消息,他错误地发送了它并且他不希望接收者应该接收这个消息。我怎么能做到这一点。或任何其他建议,thnx

【问题讨论】:

    标签: jms hornetq


    【解决方案1】:

    您应该将会话保持为事务状态,并在最后提交或回滚。

    如果您打算提交并且现在需要回滚,那么您的应用程序存在严重的设计问题,您应该对其进行审查。除此以外的任何操作都需要您的应用程序有一个数据库来处理接收并忽略它们,但是如果您可以为此使用数据库,那么您在以同步方式访问数据时会遇到性能问题。

    【讨论】:

    • 不......我正在以异步方式访问数据......我将如何使用 hornetq 内置功能从队列中删除味精......我希望你明白这一点......thnx。 ..
    • 我认为您对什么是消息系统存在误解。消息系统不是数据库,您可以在其中根据数据添加和删除内容。这是火灾和忘记。您实际上需要删除消息的事实告诉我您存在架构问题。在异步系统上,您可以使用事务来确定是否可以提交消息......在消息系统上混合数据库概念是一场大灾难!小心!
    • 您在消息系统上拥有的唯一概念是:发送消费/ACK 并且您可以在发送和确认时使用事务。
    • 在任何情况下,您都可以创建一个带有过滤器的消费者,并确认所有与您的过滤器匹配的消息。在生成时根据您的消息设置属性,以便您可以过滤它们......但同样......这是灾难的秘诀......它不是数据库......消息系统针对 fifo 传递进行了优化,而不是数据库!
    • 看看 Infinispan 顺便说一句。您在添加和删除内容方面会取得更大的成功。在我看来,这正是你真正需要的。
    【解决方案2】:

    一种可能的方式:如果生产者知道要删除的消息的 id,那么它可以接收该消息以从队列中删除该消息。但这并不能保证删除消息,因为消费者可能在生产者意识到错误之前已经收到了消息。

    【讨论】:

    • 对于 shashi 的建议,我们可以通过编程方式执行此操作,但是 jms 或 hornetq 中是否有任何内置功能可以从队列中删除味精??
    • 肯定不是 JMS。不过我不知道HornetQ。一般来说,以上是从队列中删除消息的方法。
    • 是的,我实际上想删除消息,但使用 hornetq 内置功能,因为我使用 JBOSS 服务器....无论如何,谢谢 shahshi....:)
    猜你喜欢
    • 2016-12-10
    • 1970-01-01
    • 2015-02-25
    • 2013-08-08
    • 2020-10-16
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    相关资源
    最近更新 更多