我正在实施两项服务: A 和 B 。我正在尝试在A和B之间实现同步通信(远程过程调用或RPC)。
很简单。 A 需要来自 B 的信息,因此 A 会发送消息并等待 B 的回复。没有此信息, A 无法继续
我正在使用Spring RabbitMQ中的方法rabbitTemplate.convertSendAndReceive
。如果 B 正在运行,这将按预期工作。我的代码与this link非常相似。
如果 B 未运行, A 会等待一段时间(几秒钟)并收到null
作为回复。在这种情况下,我期待一些例外,说没有消费者可用。
默认情况下,发送和接收方法将在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
答案 0 :(得分:2)
强制性对消费者没有任何意义;它确保消息被传递到队列。
是的,获取null
表示操作超时(默认为5秒)。
您可以使用生存时间(ttl)配置队列,这样如果在该时间内未处理过时,将从队列中删除过时的消息。