Предложение Rabbitmq для реализации функции обратного вызова - PullRequest
0 голосов
/ 27 августа 2018

Я наткнулся на функцию очереди обратного вызова в RMQ.И это довольно необычно.Вся идея в том, что я создал одну очередь сообщений (queue1), ее очередь обратного вызова (queue1_cb) и ее dlq (queue1_dlq).Я реализую функцию HA с 2 узлами.

Проблема возникает, когда я развертываю 2 экземпляра моего приложения (у меня есть одно приложение отправителя и одно приложение в Spring boot ).Оба слушают один и тот же кластер HA.Сценарий описан ниже.

  1. Отправитель публикует сообщение в RMQ.
  2. Приложение получателя получает сообщение.Приложение Receiver должно вызывать сторонний API, который является API на основе сокетов и является асинхронным, поэтому я не получаю ответ в том же соединении.Поэтому я храню объект Channel & Message , который мне нужен для подтверждения сообщения.(Обратите внимание, что я задерживаю подтверждение, пока не получу ответ от стороннего API.
  3. Когда я разверну 2 экземпляра приложения-получателя, любой экземпляр получит ответ от стороннего API. И у обоих не будет объекта Канал и Сообщение для подтверждения сообщения и отправки сообщения в очередь обратного вызова.

Может ли кто-нибудь предложить мне решение о преемственности? Ниже приведен мой код.

На стороне получателя:

    @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 голосов
/ 27 августа 2018

Вам нужна отдельная очередь обратного вызова для каждого экземпляра или, проще, просто используйте Прямой ответ на , где вам вообще не нужна очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...