将Spring-cloud版本从Camden.SR4升级到Camden.SR5后,Dispatcher没有订户错误

时间:2017-03-30 12:50:45

标签: java spring spring-cloud spring-rabbit spring-cloud-stream

mycode的:    1.ChannelInterface

 public interface MessageChanelInterface {

        String DEVICE_SINK = "device-sink";

        @Input(DEVICE_SINK)
        SubscribableChannel receiveDeviceEvent();}

2.Listener

@Service
public class SubscriberToDevice {

      @Autowired
      ParkingService parkingService;

      @StreamListener(MessageChanelInterface.DEVICE_SINK)
      public void receiveDeviceEvent(Object event) {
          //Some code what to do with event.
      }
}

3.Chanell Binding

@Configuration

   @EnableBinding(MessageChanelInterface.class)

   public class MessageChanelConfiguration {

}

4.Broker绑定和通道配置

spring.cloud.stream.binders.rabbit1.type=rabbit
spring.cloud.stream.binders.rabbit1.environment.spring.rabbitmq.addresses=${_rabbit.host}
spring.cloud.stream.binders.rabbit1.environment.spring.rabbitmq.port=5672
spring.cloud.stream.binders.rabbit1.environment.spring.rabbitmq.username=${_rabbit.username}
spring.cloud.stream.binders.rabbit1.environment.spring.rabbitmq.password=${_rabbit.password}
spring.cloud.stream.bindings.device-sink.binder=rabbit1
spring.cloud.stream.bindings.device-sink.destination=device
spring.cloud.stream.bindings.device-sink.group=group-${spring.application.name}

虽然我使用spring-cloud版本Camden.SR4没有错误信息,但是收到一些消息时。我收到消息后升级到版本Camden.SR5后收到此错误消息。发布者我已配置并发布消息而没有错误。顺便说一句,发布商的配置是:

spring.cloud.stream.bindings.device-source.binder=rabbit1
spring.cloud.stream.bindings.device-source.destination=device

Brooklyn.SR2(春天云Camden.SR5中的spring.cloud.stream版本)是否有一些重大变化?因为出版商工作很好。我没有在spring.cloud.stream Brooklyn.SR2的描述中看到订户配置有任何变化。一些解决方法如何修复它?

错误消息

org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener threw exception
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.wrapToListenerExecutionFailedExceptionIfNeeded(AbstractMessageListenerContainer.java:877)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:787)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:707)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:98)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:189)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.retry.interceptor.RetryOperationsInterceptor$1.doWithRetry(RetryOperationsInterceptor.java:74)
    at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:276)
    at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:172)
    at org.springframework.retry.interceptor.RetryOperationsInterceptor.invoke(RetryOperationsInterceptor.java:98)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
    at com.sun.proxy.$Proxy195.invokeListener(Unknown Source)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1236)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:688)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1190)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1174)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1200(SimpleMessageListenerContainer.java:98)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1363)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.messaging.MessageDeliveryException: Dispatcher has no subscribers for channel 'parkingspace:default:8096.device-sink'.; nested exception is org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers, failedMessage=GenericMessage [payload=EventOccupationDetected [parkingSpaceID=141AA061-86C4-8518-03EC-39C0F6F99AE0], headers={amqp_receivedDeliveryMode=PERSISTENT, amqp_receivedRoutingKey=device, amqp_receivedExchange=device, amqp_deliveryTag=1, correlation-id=85687a94-9bcd-48bb-bfc4-765546b32996, amqp_consumerQueue=device.group-parkingspace, amqp_redelivered=false, id=01d247a7-b37b-2d79-4b90-f59812d25f4b, amqp_consumerTag=amq.ctag-qSSn_-Zw481_KxEz-pbjUQ, contentType=application/x-java-object;type=sk.posam.sp.device.domain.event.EventOccupationDetected, timestamp=1490874431951}]
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:93)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:423)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:373)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:292)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:212)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:129)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:115)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127)
    at org.springframework.integration.channel.FixedSubscriberChannel.send(FixedSubscriberChannel.java:70)
    at org.springframework.integration.channel.FixedSubscriberChannel.send(FixedSubscriberChannel.java:64)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105)
    at org.springframework.integration.endpoint.MessageProducerSupport.sendMessage(MessageProducerSupport.java:171)
    at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter.access$400(AmqpInboundChannelAdapter.java:45)
    at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter$1.onMessage(AmqpInboundChannelAdapter.java:95)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:784)
    ... 24 common frames omitted
Caused by: org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:154)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:121)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:89)
    ... 43 common frames omitted

1 个答案:

答案 0 :(得分:1)

由于一些内部重构,Brooklyn.SR1和Brooklyn.SR2之间存在已知的回归。

https://github.com/spring-cloud/spring-cloud-stream/issues/844

ATM的一种解决方法是使用与Object不同的参数类型(无论如何,为了获得类型强制的好处,我们建议使用)。

正如在Brooklyn.SR3之后发现的那样,可能有必要等到布鲁克林.4或更高版本的卡姆登选择它。或者,您可以考虑升级到刚刚发布的Chelsea.RC1(计划在周一发布,在Spring Cloud中的Dalston.RELEASE中获取)。

编辑:关于将版本升级到切尔西的快速说明 - 它需要Boot 1.5,因此YMMV就在那里。