@StreamListener не отображается вне основного класса приложения Spring Boot. В чем может быть причина?

#java #spring #spring-boot #rabbitmq #spring-cloud-stream

#java #весна #spring-boot #rabbitmq #spring-cloud-stream

Вопрос:

Это приложение Spring Cloud Stream. Как я упоминал в названии, StreamListener аннотация работает внутри основного класса SpringBootApplication, но не тогда, когда она находится в другом классе с @Component аннотацией.

Я считаю, что это какая-то StreamListener проблема с видимостью.

Я публикую сообщения из интерфейса управления RabbitMQ.

Ниже приведено исключение, которое я получаю:

 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
  

Ответ №1:

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

Решение: сохраните файл приложения в родительском пакете, чтобы он мог сканировать дочерние модули.(насколько я понимаю).