为什么春天找不到弹簧云流创建的@Source bean通道?

时间:2017-07-27 18:55:31

标签: spring-boot apache-kafka spring-cloud-stream

我正在尝试使用Spring Cloud Stream来发布和使用Kafka消息。我一直在处理文档here on Accessing Bound Channels。我正在尝试在频道上使用自定义名称作为我的主题,所以当我尝试注入时,我有一个@Qualifier,但是spring找不到相关的bean。它说“对于每个绑定的接口,Spring Cloud Stream将生成一个实现接口的bean”,但是自动连接不起作用。

我得到的错误是“com中构造函数的参数0 ... MessagingManager需要一个无法找到'org.springframework.messaging.MessageChannel'类型的bean。”

我尝试在MessagingManager构造函数之前使用@Autowired,就像在示例中一样,但是在bean工厂中有一个类似的错误,其中有2个,所以我把它拿出来,得到了当前的错误。

我尝试使用处理器可能会很复杂。

这是我的组件。我正在使用spring boot运行它并试图用它测试它:

@Component
public class StartupTester implements ApplicationListener<ContextRefreshedEvent> {
    MessagingManager messagingManager;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        messagingManager.sendThingCreatedMessage(new ThingCreated("12345", "667788"));
    }
}

@Component
public class MessagingManager {

    private MessageChannel thingCreatedChannel;

    public MessagingManager(@Qualifier(ThingChannelProcessor.THING_CREATED) MessageChannel output) {
        thingCreatedChannel = output;
    }

    public void sendThingCreatedMessage(ThingCreated thingCreated) {  
thingCreatedChannel.send(MessageBuilder.withPayload(thingCreated).build());
    }
}


@Component
    public interface ThingsChannelProcessor extends Processor {

    String THING_REQUEST = "thing-request";
    String THING_CREATED = "thing-created";

    @Input(THING_REQUEST )
    SubscribableChannel thingsRequest();

    @Output(THING_CREATED )
    MessageChannel thingCreated();
}

我的主类上也有@EnableBinding(ThingsMessagingManager.class),用@SpringBootApplication注释。

1 个答案:

答案 0 :(得分:3)

我无法重现您的错误。但我有几点可以遵循:

  1. 您无需使用@Component
  2. 注释界面
  3. 您的@EnableBinding上应该有@EnableBinding(ThingsChannelProcessor.class)而不是ThingsMessagingManager
  4. 您也不需要扩展处理器,这可能是您第一次获得2个bean的原因。如果您要自定义频道,则无需从接收器/源/处理器下载,请查看文档中的Barista示例
  5. 监听contextRefresh也不起作用,因为我们在刷新上下文后进行绑定
  6. 实际上,让我在4上更清楚一点。我们创建一个子上下文,因此为了确保您的上下文已完全初始化,请确保您还在Starter上实现ApplicationContextAware,并在发送消息之前检查上下文是否相同否则您将收到错误{{1 }}