Я наткнулся на функцию очереди обратного вызова в RMQ.И это довольно необычно.Вся идея в том, что я создал одну очередь сообщений (queue1), ее очередь обратного вызова (queue1_cb) и ее dlq (queue1_dlq).Я реализую функцию HA с 2 узлами.
Проблема возникает, когда я развертываю 2 экземпляра моего приложения (у меня есть одно приложение отправителя и одно приложение в Spring boot ).Оба слушают один и тот же кластер HA.Сценарий описан ниже.
- Отправитель публикует сообщение в RMQ.
- Приложение получателя получает сообщение.Приложение Receiver должно вызывать сторонний API, который является API на основе сокетов и является асинхронным, поэтому я не получаю ответ в том же соединении.Поэтому я храню объект Channel & Message , который мне нужен для подтверждения сообщения.(Обратите внимание, что я задерживаю подтверждение, пока не получу ответ от стороннего API.
- Когда я разверну 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);
}