Spring AMQP - Как подтвердить, что сообщение доставлено и маршрутизировано успешно? - PullRequest
0 голосов
/ 19 апреля 2020

Я ищу способ доставки сообщения, и как только сообщение успешно доставлено (и направлено), мне нужно выполнить некоторые операции.

Я включил издателя, который подтверждает и возвращает:

spring.rabbitmq.publisher-confirm-type=correlated
spring.rabbitmq.publisher-returns=true

Я настроил возврат и подтверждение обратного вызова на шаблоне кролика:

rabbitTemplate.setMandatory(true);
rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
  System.out.println("Message returned");
});
rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
  System.out.println("confirm"); //correlationData.returnedMessage has the original message
});

Вот мой код sh publi:

CorrelationData crd = new CorrelationData(UUID.randomUUID().toString());
rabbitTemplate.convertAndSend("X-ORDERS", "ORDER_PLACED", request, crd);

crd.getFuture().addCallback(new ListenableFutureCallback<Confirm>() {
  @Override
  public void onFailure(Throwable throwable) {
    log.info("Failure received");
  }

  @Override
  public void onSuccess(Confirm confirm) {
    if(confirm.isAck()){
    log.info("Success received");
    doSomethingAfterSuccess();
  }}
});

Теперь, когда я publi sh сообщение, которое не может перенаправить сообщение: -

  1. returnCallBack и подтверждениеCallBack rabbitTemplate также
    называется

  2. onSuccess (..) для correlationData по-прежнему вызывается с помощью isAck () = true

Итак, как я могу проверить, доставлено ли сообщение успешно и направлено ли оно?

РЕДАКТИРОВАТЬ: Найдено решение. Код publi sh:

CorrelationData crd = new CorrelationData(UUID.randomUUID().toString());
    rabbitTemplate.convertAndSend("X-ORDERS", "ORDER_PLACED", request, crd);

    crd.getFuture().addCallback(new ListenableFutureCallback<Confirm>() {
      @Override
      public void onFailure(Throwable throwable) {
        log.info("Failure received");
      }

      @Override
      public void onSuccess(Confirm confirm) {
        if(confirm.isAck() && crd.getReturnedMessage == null){
        log.info("Success received");
        doSomethingAfterSuccess();
      }}
    });

в основном изменил условие в onSuccess на «verify.isAck () && crd.getReturnedMessage == null»

1 Ответ

1 голос
/ 20 апреля 2020

Это согласно документации RabbitMQ - вы по-прежнему получаете положительное подтверждение, но оно гарантированно будет получено после возврата.

Так что просто проверьте, что future.returnedMessage не null в onSuccess().

См. документацию .

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

...