Java 8 无法在Spring集成中将订阅服务器连接到BroadCastingDispatcher
在上的这个例子之后,我试图构建一个流程,在这个流程中,我从GooglePubSub订阅中读取内容,然后写入另一个主题 在Java 8 无法在Spring集成中将订阅服务器连接到BroadCastingDispatcher,java-8,spring-integration,spring-integration-dsl,spring-cloud-gcp,Java 8,Spring Integration,Spring Integration Dsl,Spring Cloud Gcp,在上的这个例子之后,我试图构建一个流程,在这个流程中,我从GooglePubSub订阅中读取内容,然后写入另一个主题 在DEBUG模式下启动我的应用程序后,我可以看到消息来自Google PubSub,但它们不会因此被“消费” o、 s.i.dispatcher.BroadcastingDispatcher:没有订阅者,默认行为为忽略 非常感谢您在这方面的任何帮助 下面是我的主要代码的样子- public class PubsubRouteBuilderService { privat
DEBUG
模式下启动我的应用程序后,我可以看到消息来自Google PubSub
,但它们不会因此被“消费”
o、 s.i.dispatcher.BroadcastingDispatcher:没有订阅者,默认行为为忽略
非常感谢您在这方面的任何帮助
下面是我的主要代码的样子-
public class PubsubRouteBuilderService {
private final PubSubTemplate pubSubTemplate; // injected via Spring
public PubsubRouteBuilderService(PubSubTemplate pubSubTemplate) {
this.pubSubTemplate = pubSubTemplate;
}
public synchronized boolean buildRoute(PubsubRouteModel pubsubRouteModel) {
log.info("Building route for: {}", pubsubRouteModel);
buildPubsubRoute(pubsubRouteModel);
// some unrelated logic
return true;
}
private void buildPubsubRoute(PubsubRouteModel pubsubRouteModel) {
final StandardIntegrationFlow standardIntegrationFlow = IntegrationFlows.from(
RouteBuilderFactory
.messageChannelAdapter(
RouteBuilderFactory.getMessageChannel(),
pubSubTemplate,
pubsubRouteModel.getFromSub()))
.handle(
message -> {
log.info("consumed new message: [" + message.getPayload() + "]");
AckReplyConsumer consumer = message.getHeaders()
.get(GcpPubSubHeaders.ORIGINAL_MESSAGE, AckReplyConsumer.class);
consumer.ack();
})
.get();
standardIntegrationFlow.start();
}
}
以下是来自RouteBuilderFactory
的其他方法-
public static MessageChannel getMessageChannel() {
return MessageChannels.publishSubscribe().get();
}
public static PubSubInboundChannelAdapter messageChannelAdapter(MessageChannel inputChannel, PubSubTemplate pubSubTemplate, String channelName) {
PubSubInboundChannelAdapter adapter = new PubSubInboundChannelAdapter(pubSubTemplate, channelName);
adapter.setOutputChannel(inputChannel);
adapter.setAckMode(AckMode.MANUAL);
return adapter;
}
你的代码似乎根本不是基于那篇博文
private void buildPubSubcute(PubSubcuteModel PubSubcuteModel){
最终标准集成流标准集成流=集成流.from(
RouteBuilderFactory
.messageChannelAdapter(
RouteBuilderFactory.getMessageChannel(),
pubSubTemplate,
pubsubutemodel.getFromSub())
.处理(
信息->{
log.info(“已使用的新消息:[“+message.getPayload()+”]);
AckReplyConsumer consumer=message.getHeaders()
.get(GcpPubSubHeaders.ORIGINAL_消息,AckReplyConsumer.class);
consumer.ack();
})
.get();
standardIntegrationFlow.start();
}
您不能只是“启动”一些任意的IntegrationFlow
对象,它必须由Spring管理(声明为@Bean
)
框架在幕后构建了一些基础设施来完成所有这些工作。您的代码似乎根本不是基于那篇博文的
private void buildPubSubcute(PubSubcuteModel PubSubcuteModel){
最终标准集成流标准集成流=集成流.from(
RouteBuilderFactory
.messageChannelAdapter(
RouteBuilderFactory.getMessageChannel(),
pubSubTemplate,
pubsubutemodel.getFromSub())
.处理(
信息->{
log.info(“已使用的新消息:[“+message.getPayload()+”]);
AckReplyConsumer consumer=message.getHeaders()
.get(GcpPubSubHeaders.ORIGINAL_消息,AckReplyConsumer.class);
consumer.ack();
})
.get();
standardIntegrationFlow.start();
}
您不能只是“启动”一些任意的IntegrationFlow
对象,它必须由Spring管理(声明为@Bean
)
框架在幕后构建了一些基础设施来完成所有这些工作。我希望在不受Spring管理的情况下实现这些工作,因为我的用例需要动态启动和关闭路由(在应用程序运行时非常好)。你知道吗,如果没有
spring集成
,我会更好地尝试这个吗?在spring集成中,我们不称它们为“路由”;它们是流动。有关动态流注册,请参阅。在阅读了文档之后,简直不敢相信它会这么简单!我希望在不受Spring管理的情况下实现这一点,因为在我的用例中,我必须动态地启动和关闭路由(在应用程序运行时非常好)。你知道吗,如果没有spring集成
,我会更好地尝试这个吗?在spring集成中,我们不称它们为“路由”;它们是流动。有关动态流注册,请参阅。在阅读了文档之后,简直不敢相信它会这么简单!