Rabbitmq关于实现回叫队列功能的建议

时间:2018-08-27 05:45:44

标签: spring-boot rabbitmq high-availability spring-rabbitmq

我遇到了RMQ中的回叫队列功能。而且它也很漂亮。整个想法是我创建了一个消息队列(queue1),其回调队列(queue1_cb)和dlq(queue1_dlq)。我正在通过2个节点实现HA功能。

当我部署2个应用程序实例时出现问题( Spring boot 中有一个发送方和一个接收方应用程序)。两者都在侦听同一HA群集。情况如下。

  1. 发件人向RMQ发布消息。
  2. 接收器应用消耗消息。接收器应用程序必须调用第三方API,该API是基于套接字的API,并且它是异步的,因此我无法在同一连接中获得响应。因此,我存储了需要确认消息的 Channel Message 对象。 (请注意,我会延迟确认,直到我收到第三方API的响应为止。
  3. 当我部署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);

}

1 个答案:

答案 0 :(得分:1)

对于每个实例,您需要一个不同的回调队列,或者更简单地,只需使用Direct Reply-to,而根本不需要队列。