Исключение при запуске потребителя - (невозможно назначить одно и то же имя группы для разных каналов в микросервисе)

Я новичок в Spring Cloud Stream и rabbitmq. Недавно я получил исключение после запуска одного из моих микросервисов. В нем говорится, что не удалось зарегистрировать объект, потому что он уже зарегистрирован, я думаю, это из-за имени группы, назначенного для каждого канала, проверьте исключение,

 2018-05-28 10:01:38.420 ERROR 10244 --- [ask-scheduler-2] o.s.cloud.stream.binding.BindingService  : Failed to create consumer binding; retrying in 30 seconds
 org.springframework.cloud.stream.binder.BinderException: Exception thrown while starting consumer: 
     at org.springframework.cloud.stream.binder.AbstractMessageChannelBinder.doBindConsumer(AbstractMessageChannelBinder.java:326) ~[spring-cloud-stream-2.0.0.RC3.jar:2.0.0.RC3]
     at org.springframework.cloud.stream.binder.AbstractMessageChannelBinder.doBindConsumer(AbstractMessageChannelBinder.java:77) ~[spring-cloud-stream-2.0.0.RC3.jar:2.0.0.RC3]
     at org.springframework.cloud.stream.binder.AbstractBinder.bindConsumer(AbstractBinder.java:129) ~[spring-cloud-stream-2.0.0.RC3.jar:2.0.0.RC3]
     at org.springframework.cloud.stream.binding.BindingService.lambda$rescheduleConsumerBinding$0(BindingService.java:154) ~[spring-cloud-stream-2.0.0.RC3.jar:2.0.0.RC3]
     at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-5.0.5.RELEASE.jar:5.0.5.RELEASE]
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_101]
     at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_101]
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) ~[na:1.8.0_101]
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) ~[na:1.8.0_101]
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_101]
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_101]
     at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_101]
 Caused by: java.lang.IllegalStateException: Could not register object [org.springframework.integration.handler.advice.ErrorMessageSendingRecoverer@70a0362b] under bean name 'org.nets.ups.alertService.errors.recoverer': there is already object [org.springframework.integration.handler.advice.ErrorMessageSendingRecoverer@cfd5cd2] bound
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.registerSingleton(DefaultSingletonBeanRegistry.java:126) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.registerSingleton(DefaultListableBeanFactory.java:932) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
     at org.springframework.cloud.stream.binder.AbstractMessageChannelBinder.registerErrorInfrastructure(AbstractMessageChannelBinder.java:519) ~[spring-cloud-stream-2.0.0.RC3.jar:2.0.0.RC3]
     at org.springframework.cloud.stream.binder.AbstractMessageChannelBinder.registerErrorInfrastructure(AbstractMessageChannelBinder.java:478) ~[spring-cloud-stream-2.0.0.RC3.jar:2.0.0.RC3]
     at org.springframework.cloud.stream.binder.rabbit.RabbitMessageChannelBinder.createConsumerEndpoint(RabbitMessageChannelBinder.java:391) ~[spring-cloud-stream-binder-rabbit-2.0.0.RC3.jar:2.0.0.RC3]
     at org.springframework.cloud.stream.binder.rabbit.RabbitMessageChannelBinder.createConsumerEndpoint(RabbitMessageChannelBinder.java:104) ~[spring-cloud-stream-binder-rabbit-2.0.0.RC3.jar:2.0.0.RC3]
     at org.springframework.cloud.stream.binder.AbstractMessageChannelBinder.doBindConsumer(AbstractMessageChannelBinder.java:279) ~[spring-cloud-stream-2.0.0.RC3.jar:2.0.0.RC3]
     ... 11 common frames omitted

Это происходит, когда я дал одно и то же название группе для каждого канала в этом микросервисе. что-то вроде этого,

 spring:
   cloud:
     stream:
       bindings:
         useroperation:
           destination: org.nets.ups
           content-type: application/json
           group: alertService
         departmentoperation:
           destination: org.nets.ups
           content-type: application/json
           group: alertService
         roleoperation:
           destination: org.nets.ups
           content-type: application/json
           group: alertService
         rabbit:
           bindings:
             useroperation:
               consumer:
                 bindingRoutingKey: 'adminservice.user.#'
             departmentoperation:
                consumer:
                  bindingRoutingKey: 'adminservice.department.#'
             roleoperation:
               consumer:
                 bindingRoutingKey: 'adminservice.role.#'

Я могу удалить это исключение, удалив имя группы, но имя группы всегда будет идеальным, чтобы получить известное имя очереди и улучшить баланс нагрузки. Если я сделал что-то не так или вам нужен java-код (это просто прослушиватель потока для каждого канала), сообщите мне.

Спасибо.


person Vishnu KR    schedule 28.05.2018    source источник


Ответы (1)


Ваш YAML сформирован неправильно. Должен быть...

spring:
  cloud:
    stream:
      bindings:
        useroperation:
          destination: org.nets.ups
          content-type: application/json
          group: alertService
        departmentoperation:
          destination: org.nets.ups
          content-type: application/json
          group: alertService
        roleoperation:
          destination: org.nets.ups
          content-type: application/json
          group: alertService
      rabbit:
        bindings:
          useroperation:
            consumer:
              bindingRoutingKey: 'adminservice.user.#'
          departmentoperation:
            consumer:
              bindingRoutingKey: 'adminservice.department.#'
          roleoperation:
           consumer:
             bindingRoutingKey: 'adminservice.role.#'

ИЗМЕНИТЬ

О, я вижу; да, похоже на жучок; мы не можем зарегистрировать инфраструктуру ошибок, если несколько привязок используют одно и то же место назначения и группу. Пожалуйста, откройте проблему с github против spring-cloud-stream. Мы должны добавить еще одно свойство, чтобы разрешить использование той же группы.

Обойти эту проблему можно было бы в том, чтобы использовать разные группы в каждом месте.

person Gary Russell    schedule 28.05.2018
comment
Могу я сказать, что что-то вроде этой группы должно быть разным для каждого канала? group: alertservice.user (queue1), group: alertservice.department (queue2), group: alertservice.role (queue3), я просто хочу убедиться, что мое понимание правильное или нет. - person Vishnu KR; 28.05.2018
comment
Да, сработает использование разных групп для каждого назначения - см. Мое редактирование. - person Gary Russell; 28.05.2018
comment
github.com/spring-cloud/spring-cloud-stream/issues/ 1385 для тех, кто пришел сюда через гугл, как и я. - person daiscog; 17.08.2018