【问题标题】:why can't spring find the @Source bean channel created by spring cloud stream?为什么spring找不到spring cloud stream创建的@Source bean通道?
【发布时间】:2017-07-28 05:08:32
【问题描述】:

我正在尝试使用 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 factory 中出现类似错误,即其中有 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 注释。

【问题讨论】:

  • 尝试将接口作为参数传递@EnableBinding(ThingsChannelProcessor.class)

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


【解决方案1】:

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

  1. 界面不需要注解@Component
  2. 您的 @EnableBinding 似乎有错字,您应该使用 @EnableBinding(ThingsChannelProcessor.class) 而不是 ThingsMessagingManager
  3. 您也不需要扩展处理器,这可能是您第一次获得 2 个 bean 的原因。如果您正在自定义频道,则无需从 Sink/Source/Processor 下降,请查看文档中的 Barista 示例
  4. 监听 contextRefresh 也不起作用,因为我们在刷新上下文后进行绑定

实际上,让我更清楚地了解4。我们创建了一个子上下文,因此为了确保您的上下文已完全初始化,请确保您还在 Starter 上实现 ApplicationContextAware,并在发送消息之前检查上下文是否相同,否则您将收到错误 if(this.context.equals(event.getApplicationContext()))

【讨论】:

  • 永远记得启用@EnableBinding
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 2018-05-25
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多