2016-03-05 160 views
0

我会很感激你的想法。RabbitMQ用户将消息发送回RabbitMQ队列?

我有一个订阅RabbitMQ队列的节点应用程序。当它收到一条消息时,它会检查它的内容并将其保存到数据库中。

但是,如果邮件丢失,某些信息或其他条件尚未满足,我希望订阅者将邮件发布回RabbitMQ队列。

我从逻辑上理解这只是连接到队列并发布消息,但这真的很简单,或者这是一种不好的做法或潜在的危险?

感谢您的帮助。

+0

当消息丢失的东西,然后发布到同一队列接收消息从它?如果是这样,你可以设置'autoack'为'false',并且消息从队列中移除,除非你给予确认。那么如果消息缺少某些东西,则不会确认,并且此消息将保留在队列中而不被删除。如果消息是goo,给这个队列ack,那么这个消息将从队列中移除。 – zangw

+0

@zangw是发布到它从中获取消息的同一队列。 (这很难解释,但是有一个时间元素的消息,所以它可能在5分钟内而不是现在有效)。 –

回答

1

正如我在评论中指出的那样,当您创建与队列的连接并设置autoAck = true时,启用消息确认。队列中的消息将被删除,直到收到确认。

当收到的消息符合要求时,发送确认消息到该队列中,并且该消息将从队列中删除。否则,不向队列发送确认消息,该消息将留在队列中。

至于您在评论中提到的有效过程可能需要5分钟,只需将发送确认消息设置为验证功能的回调函数即可。

0

在你的问题,你描述两个标准时,可能没有被处理的消息:

  1. 如果消息缺少某些信息或
  2. 其他一些标准尚未满足

其中的第一个看起来是这个消息的一个问题,并且对重新排队有问题的消息似乎没有多大意义。适当的操作是记录错误并放弃消息(或调用应用程序包含的任何错误处理逻辑)。

其中第二个比较含糊,但为了这个答案的目的,我们将假设问题不在消息中,而与系统中的其他组件(例如网络连接问题)有关。在这种情况下,消费应用程序可以发送一个Nack (negative acknowldegement),它可以选择性地重新发送消息。

请记住,在第二种情况下,有必要关闭消费者,直到错误状态解决,或者消息将被重新递送并在系统备份之前被无限处理,直至系统备份,从而浪费资源在一个不可处理的消息。

为什么要用nack而不是简单地重新发布?
这将在消息上设置“redelivered”标志,以便您知道它已交付一次。有other options以及处理坏消息。