当没有使用者时,使用RabbitMQ RPC不会失败。这是预期的行为吗?

时间:2018-02-22 16:31:36

标签: java spring rabbitmq spring-rabbit

我正在实施两项服务: A B 。我正在尝试在A和B之间实现同步通信(远程过程调用或RPC)。

方案

很简单。 A 需要来自 B 的信息,因此 A 会发送消息并等待 B 的回复。没有此信息, A 无法继续

问题

我正在使用Spring RabbitMQ中的方法rabbitTemplate.convertSendAndReceive。如果 B 正在运行,这将按预期工作。我的代码与this link非常相似。

如果 B 未运行, A 会等待一段时间(几秒钟)并收到null作为回复。在这种情况下,我期待一些例外,说没有消费者可用。

documentation说:

  

默认情况下,发送和接收方法将在5秒后超时   并返回null。这可以通过设置replyTimeout来修改   属性。从1.5版开始,如果设置强制属性   为true(或者强制表达式的计算结果为true   特定消息),如果消息无法传递到队列中   将抛出AmqpMessageReturnedException。这个例外有   returnedMessage,replyCode,replyText属性,以及   exchange和routingKey用于发送。

我试着设置:

rabbitTemplate.setMandatory(true);

但任何例外都被抛弃了。我认为因为RabbitMQ中的队列仍然存在,因为当B出局并等待由 B 处理时,A会发送一些消息。

那么,null回报是我如何知道没有消费者的?

在这种情况下的另一个问题是: A 发送的消息将在队列中等待,直到 B 消耗。但是当我实现同步通信时,如果 B 没有运行,这种行为就没有任何意义,因为当 B 再次启动时,它将消耗并处理而不返回信息到 A 。这将是一个“丢失”的处理。这与RabbitMQ RPC通信是否正常?

我正在使用Spring Boot 1.5.9和依赖spring-cloud-starter-stream-rabbit

1 个答案:

答案 0 :(得分:2)

强制性对消费者没有任何意义;它确保消息被传递到队列。

是的,获取null表示操作超时(默认为5秒)。

您可以使用生存时间(ttl)配置队列,这样如果在该时间内未处理过时,将从队列中删除过时的消息。