首页 > 解决方案 > 在 Spring Boot 的主应用程序类之外时,@StreamListener 不可见。可能是什么原因?

问题描述

这是 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");
        
    }
}

应用程序属性

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

标签: javaspringspring-bootrabbitmqspring-cloud-stream

解决方案


我可以回答自己,因为应用程序按预期工作。

解决方案:将应用程序文件保留在父包中,以便它可以扫描子模块。(据我了解)。


推荐阅读