在与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实现出现在该列表中。我想这与豆的性质有关。但是如何?
答案 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;
}