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
и иметь только один возможный прослушиватель для этой очереди с соответствующим методом.