Spring AMQP: при использовании программной регистрации конечной точки, как установить ключ маршрутизации?

Я использую программную регистрацию конечных точек слушателей:

MethodRabbitListenerEndpoint endpoint = new MethodRabbitListenerEndpoint();
endpoint.setId(endpointId);
endpoint.setQueues(eventsQueue);
endpoint.setBean(hanlderMethod.bean);
endpoint.setMethod(hanlderMethod.method);
endpoint.setMessageHandlerMethodFactory(messageHandlerMethodFactory);
registrar.registerEndpoint(endpoint);

У меня вопрос, как мне определить ключ маршрутизации для этой конечной точки?


Изменить: Чтобы уточнить, я использую одну очередь для разных типов сообщений, и я хочу направить их к различным методам на основе ключа маршрутизации. Это в дополнение к ключу маршрутизации, который используется для маршрутизации сообщений в эту очередь.

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

1 ответ

Решение

Смотри, ты говоришь Listener, так что вы собираетесь прослушать очередь сообщений.

И правильно, вы делаете это через setQueues(),

Теперь о routingKey:

Ключ маршрутизации является атрибутом сообщения. Обмен может посмотреть на этот ключ при принятии решения о том, как направить сообщение в очереди (в зависимости от типа обмена).

Таким образом, это действительно не относится к Listener,

Хотя я согласен, что мы должны объявить Binding именно в том месте, когда мы имеем дело с очередью. Поэтому в части слушателя.

Итак, если вы делаете MethodRabbitListenerEndpoint регистрация вручную (в обход @RabbitListener определения), вы должны объявить и зарегистрировать Binding тоже вручную. И уже здесь с соответствующим routingKey: http://docs.spring.io/spring-amqp/reference/html/_reference.html

ОБНОВИТЬ

Нет такой встроенной функции, которую вы ищете. У нас есть MultiMethodRabbitListenerEndpoint кто выполняет маршрутизацию на основе типа полезной нагрузки, но не любой другой возможный фильтр.

То, что вы хотите, может быть достигнуто с помощью маршрутизатора Spring Integration, который может принимать решения на основе AmqpHeaders.RECEIVED_ROUTING_KEY заголовок.

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

Другие вопросы по тегам