Как успешно установить ключ маршрутизации для производителя и потребителя - PullRequest
0 голосов
/ 09 июля 2019

Я создаю приложение на основе SpringCloud Stream, а тип обмена - это тема, и сообщение отправляется в две группы потребителей из обмена тем.Сценарий выглядит примерно так:

Служба A в моем приложении хочет отправить сообщение о встречах типа в службу B и службу C через обмен, называемый: встречи-запрос, основанный на различных сценариях использования, таких как книга,отмена, обновление и т. д.

Таким образом, сообщения с ключом назначений. book.B или assignments.cancel.B должны отправляться на приемные группы очередей.

сообщений с ключом назначений. book.C or assignments.cancel.C следует перейти к встречам группы очереди потребителей. C

Как добиться этого успешно?

Конфигурация службы источника:

spring.cloud.stream.bindings.output.destination=appointments-request
spring.cloud.stream.bindings.input.destination=appointments-reply
spring.cloud.stream.rabbit.bindings.output.producer.exchangeType=topic
spring.cloud.stream.rabbit.bindings.output.producer.routingKeyExpression= 
 appointments.#.#

КонфигурацияПотребительская служба B:

spring.cloud.stream.rabbit.bindings.input.consumer.exchangeType=direct
spring.cloud.stream.rabbit.bindings.input.consumer.group=
appointments.docmgmt
spring.cloud.stream.rabbit.bindings.input.consumer.bindingRoutingKey=
appointments.docmgmt
spring.cloud.stream.rabbit.bindings.input.consumer.routingKeyExpression= 
appointments.#.docmgmt

Продюсерская служба A использует следующий метод для установки ключа маршрутизации

    public boolean send(AppointmentEvent appointmentEvent) 
    {
       logger.info("Sending event {} ",appointmentEvent);
       return this.source.output().
       send(MessageBuilder.withPayload(appointmentEvent).
       setHeader(SimpMessageHeaderAccessor.DESTINATION_HEADER, 
       "appointments.book.docmgmt").build());
     }

У меня не работает связь между службами.

1 Ответ

1 голос
/ 09 июля 2019

appointments.#.#

Нельзя использовать подстановочные знаки на стороне производителя.

Вам нужно что-то вроде

spring.cloud.stream.rabbit.bindings.output.producer.routingKeyExpression=headers['routingKey']

И тогда производитель устанавливает routingKey заголовок к желаемому значению для каждого сообщения.

Вы не должны использовать заголовки Simp;это для STOMP;используйте свой собственный заголовок.

...