Rabbitmq 关于实现回调队列功能的建议
Rabbitmq suggestion for implementing call back queue feature
我在 RMQ 中发现了回调队列功能。而且它也很漂亮。整个想法是我创建了一个消息队列 (queue1)、它的回调队列 (queue1_cb) 和它的 dlq(queue1_dlq)。我正在使用 2 个节点实现 HA 功能。
当我部署我的应用程序的 2 个实例时出现问题(我在 Spring boot 中有一个发送方和一个接收方应用程序)。两者都在收听同一个 HA 集群。场景如下。
- 发件人向 RMQ 发布消息。
- 接收方应用程序使用消息。接收器应用程序必须调用基于套接字 API 的第三方 API 及其异步,因此我无法在同一连接中获得响应。所以我存储 Channel & Message 的对象,我需要确认消息。 (请注意,我正在延迟确认,直到我收到第三方的回复 API。
- 当我部署接收器应用程序的 2 个实例时,任何实例都会收到来自第三方的响应 API。并且两者都没有 Channel 和 Message 的对象来确认消息并将消息发送到回调队列。
任何人都可以建议我一个优先解决方案吗?
下面是我的代码。
在接收端:
@Override
public void onMessage(Message arg0, Channel arg1) throws Exception {
String msg = new String (arg0.getBody());
AppObject obj = mapper.readValue(msg, AppObject.class);
Packet packet = new Packet();
packet.setChannel(arg1);
packet.setMessage(arg0);
packet.setAppObject(obj);
AppParam.objects.put(
String.valueOf(key , packet);
//Call third party API
}
确认发送回调消息时:
public boolean pushMessageToCallBack(String key , AppObject packet, Channel channel, Message message){
RabbitTemplate replyRabbitTemplate = //Get the RabbitTemplate object. It is handled properly.
replyRabbitTemplate.convertAndSend(packet);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}
每个实例都需要一个不同的回调队列,或者更简单地说,在根本不需要队列的地方使用 Direct Reply-to。
我在 RMQ 中发现了回调队列功能。而且它也很漂亮。整个想法是我创建了一个消息队列 (queue1)、它的回调队列 (queue1_cb) 和它的 dlq(queue1_dlq)。我正在使用 2 个节点实现 HA 功能。
当我部署我的应用程序的 2 个实例时出现问题(我在 Spring boot 中有一个发送方和一个接收方应用程序)。两者都在收听同一个 HA 集群。场景如下。
- 发件人向 RMQ 发布消息。
- 接收方应用程序使用消息。接收器应用程序必须调用基于套接字 API 的第三方 API 及其异步,因此我无法在同一连接中获得响应。所以我存储 Channel & Message 的对象,我需要确认消息。 (请注意,我正在延迟确认,直到我收到第三方的回复 API。
- 当我部署接收器应用程序的 2 个实例时,任何实例都会收到来自第三方的响应 API。并且两者都没有 Channel 和 Message 的对象来确认消息并将消息发送到回调队列。
任何人都可以建议我一个优先解决方案吗? 下面是我的代码。
在接收端:
@Override
public void onMessage(Message arg0, Channel arg1) throws Exception {
String msg = new String (arg0.getBody());
AppObject obj = mapper.readValue(msg, AppObject.class);
Packet packet = new Packet();
packet.setChannel(arg1);
packet.setMessage(arg0);
packet.setAppObject(obj);
AppParam.objects.put(
String.valueOf(key , packet);
//Call third party API
}
确认发送回调消息时:
public boolean pushMessageToCallBack(String key , AppObject packet, Channel channel, Message message){
RabbitTemplate replyRabbitTemplate = //Get the RabbitTemplate object. It is handled properly.
replyRabbitTemplate.convertAndSend(packet);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}
每个实例都需要一个不同的回调队列,或者更简单地说,在根本不需要队列的地方使用 Direct Reply-to。