2016-03-15 1 views
1

Я использую программную регистрацию конечной точки слушателя конечных точек: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); 

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


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

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

ответ

1

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

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

Теперь о routingKey:

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

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

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

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

UPDATE

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

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

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

+0

Да, я знаю об объявлении, и я тоже это делаю. Проблема в том, что я хочу направлять сообщения на разные методы из одной очереди на основе ключа маршрутизации. –

+0

Отредактировал вопрос с дополнительной информацией. –

+0

См. ОБНОВЛЕНИЕ в моем ответе. –