Как перестать ответить так, чтобы @SendTo работал - PullRequest
0 голосов
/ 26 мая 2018

У меня есть Java-код, подобный этому, в классе под названием «MyService» для получения сообщений, обработки переданного объекта и возврата ответа с намерением получить ответ с использованием настроенного ключа обмена и маршрутизации, как указано с помощью@ Отправка аннотации:

@RabbitListener(containerFactory = "myContainerFactory", queues = RabbitConfig.MY_QUEUE_NAME)
@SendTo("#{T(com.acme.config.RabbitOutboundConfig).OUTBOUND_EXCHANGE_NAME + '/' + myService.getRoutingKey()}")
public OrderResponse handlePaidOrder(Order order) {
    // do processing on the input Order object here...
    OrderResponse orderResponse = new OrderResponse();
    // fill up response object here
    return orderResponse;
}

public String getRoutingKey() {
    String routingKey;
    // .. custom logic to build a routing key
    return routingKey;
}

Это имеет смысл и прекрасно работает.Проблема, с которой я столкнулся, заключается в том, что я не могу понять, как предотвратить появление свойства «reply_to» в сообщении.Я знаю, если мой отправитель конфигурирует шаблон RabbitTemplate, вызывая setReplyAddress, это приведет к появлению свойства reply_to и correlation_id в сообщении.

Однако, если я просто не вызываю setReplyAddress, я все равно получаю свойство reply_to, одноэто выглядит так:

reply_to: amq.rabbitmq.reply-to.g2dkAAxyYWJiaXRAd3NK и т. д.

, и с этим reply_to в сообщении @SendTo не имеет никакого эффекта.Документы Spring AMQP и это сообщение: Динамическая аннотация SendTo состояние:

@SendTo используется только в том случае, если в сообщении нет replyTo.

* 1017Кроме того, когда я не вызываю setReplyAddress на RabbitTemplate, я также не получаю идентификатор корреляции.Я уверен, что мне это понадобится.Итак, мой вопрос в том, как заставить моего отправителя сгенерировать идентификатор корреляции, но не генерировать ответ, чтобы мой получатель мог использовать аннотацию @SendTo?

Заранее большое спасибо.

1 Ответ

0 голосов
/ 26 мая 2018

Идентификатор корреляции для отправителя;это не нужно с прямым ответом, так как канал зарезервирован;Вы можете добавить MessagePostProcessor на отправляющей стороне, чтобы добавить идентификатор корреляции.

@SendTo является запасным вариантом в случае отсутствия заголовка reply_to.

Если вы хотите изменить это поведениевы можете добавить afterReceivePostProcessor к контейнеру слушателя, чтобы удалить свойство replyTo для MessageProperties.

container.setAfterReceivePostProcessor(m -> {
        m.getMessageProperties().setReplyTo(null);
        return m;
}

Имейте в виду, однако, что если отправитель установил replyTo, он, скорее всего,ожидая ответа, поэтому отправка ответа куда-то еще его разочарует и, скорее всего, вызовет некоторую задержку до истечения времени ожидания ответа.

Если вы имеете в виду, что хотите отправить первоначальный ответ куда-то еще, что делает еще несколькоработать, а затем, наконец, отвечает отправителю, затем вы должны сохранить значение responseTo в другом заголовке и восстановить его (или использовать выражение, ссылающееся на сохраненный заголовок).

...