如何正确实施活页夹?

时间:2019-02-28 09:02:28

标签: java spring spring-cloud-stream

在与Oleg讨论期间对问题进行了大量编辑

我正在尝试在Spring Cloud Stream中实现BigQuery的绑定器。

GitHub上提供了完整的应用程序代码。

到目前为止,我已经编写了一个BigQueryBinderConfiguration类,该类通过以下方式返回BigQueryBinder

@Configuration @EnableConfigurationProperties({ BigQueryConfiguration.class })
public class BigQueryBinderConfiguration {
    @Autowired BigQueryConfiguration configuration;

    @Bean
    BigQueryBinder bigQueryMessageChannelBinder(BigQueryConfiguration configuration, BigQueryProvisioningProvider provisioningProvider) {

        return new BigQueryBinder(configuration, provisioningProvider);
    }

    @Bean BigQueryProvisioningProvider provisioningProvider() {
        return new BigQueryProvisioningProvider(configuration);
    }
}

我的问题是,这样做时,我的其他活页夹(兔子和Kafka)不再受到认可。

我的测试协议如下:我启动我的应用程序,并在Rabbitmq管理界面中检查我的应用程序是否注册为使用者。如果未注释此代码,则不是这种情况。

调试bigQueryMessageChannelBinder(....)的调用时,我观察到以下几点。

DefaultBinderFactory#getBinder(...)方法始终返回我的BigQueryBinder实例。调试表明对this.context.getBeansOfType(Binder.class);的调用返回一个仅包含我的BigQueryBinder的列表。我很困惑,因为其他活页夹都在我的类路径中,如果我删除了工厂方法BigQueryBinderConfiguration#bigQueryMessageChannelBinder(....),一切都会很好。

我在调试过程中发现DefaultBinderFactory是用于将绑定程序与配置名称关联的类。我还发现Binder实现不应出现在Map<String, Binder> binders中。但不幸的是,我的Binder实现出现在该列表中。我想这与豆的性质有关。但是如何?

2 个答案:

答案 0 :(得分:1)

我认为您可以做的最好的事情是首先查看我们新的TestChannelBinder.java。基本上,这是由Spring Integration支持的功能强大的活页夹。换句话说,Spring Integration及其渠道扮演着消息代理的角色,与Rabbit,Kafka,GCP和其他活页夹相同。 关于此活页夹的重要之处在于,它有效地展示了实现功能正常的活页夹所需的最低限度。

答案 1 :(得分:0)

基于本期#1623的对话。

我想从/从Spring Cloud Stream通道到Axon Framework的内部事件总线使用消息/产生消息。

这张照片中的模型正确吗?

Application model with internal and external binder

如果正确,我认为我们应该通过注入bean或其他方法在定制活页夹中使用Stream中的频道。

TestChannelBinder类中,通道是通过调用构造函数在用户代码中创建的,如何在自定义活页夹中使用由Spring Cloud Stream管理的通道?

private SubscribableChannel provisionDestination(String name, boolean pubSub) {
        String destinationName = name + ".destination";
        SubscribableChannel destination = this.provisionedDestinations
                .get(destinationName);
        if (destination == null) {
            destination = pubSub ? new PublishSubscribeChannel() : new DirectChannel();
            ((AbstractMessageChannel) destination).setBeanName(destinationName);
            ((AbstractMessageChannel) destination).setComponentName(destinationName);
            this.provisionedDestinations.put(destinationName, destination);
        }
        return destination;
    }