This is Spring Cloud Stream application. As i mention in the title, the StreamListener
annotation works when inside the SpringBootApplication main class, but not when it resides in a different class with @Component
annotation.
I believe it is some sort of StreamListener
visibility issue.
I am publishing messages from the RabbitMQ management interface.
Below is the exception i get:
ERROR 10676 --- [Service-Group-1] o.s.integration.handler.LoggingHandler : org.springframework.messaging.MessageDeliveryException: Dispatcher has no subscribers for channel 'Consumer-Slide.slideInputStream'.; nested exception is org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers
ConsumerApplication.java
@SpringBootApplication @EnableBinding(SlideChannel.class) public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
SlideChannel.java
public interface SlideChannel { String slideInputStream = "slideInputStream"; @Input(SlideChannel.slideInputStream) SubscribableChannel slideInput(); }
SlideListener.java
@Component public class SlideListener { @Autowired private SlideChannel slideCh; @Autowired private SlideService slideService; @StreamListener(target=SlideChannel.slideInputStream) public void getSingleSlideDetails(Message<?> messageId) { System.out.println("Message consumed"); } }
application.properties
spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.cloud.stream.rabbit.bindings.slideInputStream.consumer.consumerTagPrefix=SlideConsumer spring.cloud.stream.bindings.slideInputStream.destination=EventbusRouter spring.cloud.stream.bindings.slideInputStream.group=Slide-Consumer-Service-Group spring.cloud.stream.rabbit.bindings.slideInputStream.consumer.exchangeDurable=false spring.cloud.stream.rabbit.bindings.slideInputStream.consumer.bind-queue=true spring.cloud.stream.rabbit.bindings.slideInputStream.consumer.bindingRoutingKey=SlideTopic spring.cloud.stream.rabbit.bindings.slideInputStream.consumer.durableSubscription=false
Advertisement
Answer
I can answer myself since the Application works as expected.
Solution: Keep the Application file in the parent package so it can scan the child modules.(as I understand it).