Sprint 集成流程不会启动
Sprint integration flow won't start
这对我来说像是一个初学者问题。
为了便于重现,我已经从这个流程中剥离了几乎所有的逻辑。它看起来什么都不做的原因是,从字面上看,它从 JDBC 端点获取数据并且什么都不做。
setupAdapter = new JdbcPollingChannelAdapter(dbprx.getDatasource(), sql.getSql());
setupAdapter.setRowMapper(rowMapper);
StandardIntegrationFlow flow = IntegrationFlows
.from(setupAdapter,
c -> c.poller(Pollers.fixedRate(1000L, TimeUnit.MILLISECONDS).maxMessagesPerPoll(1)))
.enrichHeaders(h -> h.headerExpression("aaa", "payload[0].get(\"aaa\")")
.headerExpression("bbb", "payload[0].get(\"bbb\")")
)
.get();
flow.start();
我希望在启动时(或之后不久)构建并触发流。取而代之的是,流程已构建,但什么也没有发生。我在 JDBCPollingChannelAdapter.doPoll() 的开头设置了一个断点,如果所有 运行 正确,应该每秒触发一次。
欢迎提出任何建议。
编辑:更正代码片段,显示在尝试开始之前在 spring 上下文中注册 hte 流(请注意,这不是一个完整的示例,它只是动态地演示了我进程上下文中的部分更正基于我自己的动态源创建流程)。更常见的解决方案是使用 @Bean 注释静态创建流:
setupAdapter = new JdbcPollingChannelAdapter(dbprx.getDatasource(), sql.getSql());
setupAdapter.setRowMapper(rowMapper);
StandardIntegrationFlow flow = IntegrationFlows
.from(setupAdapter,
c -> c.poller(Pollers.fixedRate(1000L, TimeUnit.MILLISECONDS).maxMessagesPerPoll(1)))
.enrichHeaders(h -> h.headerExpression("aaa", "payload[0].get(\"aaa\")")
.headerExpression("bbb", "payload[0].get(\"bbb\")")
)
.get();
flowContext.registration(flow).id(this.getId().toString()).register();
flow.start();
您错过了 Spring 的要点 - 控制反转容器。
IntegrationFlow
本身什么都不是。它必须作为一个 bean 添加到 ApplicationContext
中,然后这个带有 Spring 容器的上下文及其 BeanFactory
将从该 IntegrationFlow
抽象中完成我们想要的一切。目前,您只需自己完成所有 new
的事情,而不会与任何 AplicationContext
.
连接起来
我不确定你的逻辑是什么,但你需要考虑在某些 @Configuration
class 中将此流程作为 @Bean
。应用程序上下文将解析此 IntegraitonFlow
,创建所需的 bean,将它们与其他 bean 自动装配(如果需要)并为我们启动流程。自动.
请了解什么是 Spring 应用程序上下文:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#spring-core
以及如何将 IntegrationFlow
制作成 bean:https://docs.spring.io/spring-integration/reference/html/dsl.html#java-dsl
这对我来说像是一个初学者问题。
为了便于重现,我已经从这个流程中剥离了几乎所有的逻辑。它看起来什么都不做的原因是,从字面上看,它从 JDBC 端点获取数据并且什么都不做。
setupAdapter = new JdbcPollingChannelAdapter(dbprx.getDatasource(), sql.getSql());
setupAdapter.setRowMapper(rowMapper);
StandardIntegrationFlow flow = IntegrationFlows
.from(setupAdapter,
c -> c.poller(Pollers.fixedRate(1000L, TimeUnit.MILLISECONDS).maxMessagesPerPoll(1)))
.enrichHeaders(h -> h.headerExpression("aaa", "payload[0].get(\"aaa\")")
.headerExpression("bbb", "payload[0].get(\"bbb\")")
)
.get();
flow.start();
我希望在启动时(或之后不久)构建并触发流。取而代之的是,流程已构建,但什么也没有发生。我在 JDBCPollingChannelAdapter.doPoll() 的开头设置了一个断点,如果所有 运行 正确,应该每秒触发一次。
欢迎提出任何建议。
编辑:更正代码片段,显示在尝试开始之前在 spring 上下文中注册 hte 流(请注意,这不是一个完整的示例,它只是动态地演示了我进程上下文中的部分更正基于我自己的动态源创建流程)。更常见的解决方案是使用 @Bean 注释静态创建流:
setupAdapter = new JdbcPollingChannelAdapter(dbprx.getDatasource(), sql.getSql());
setupAdapter.setRowMapper(rowMapper);
StandardIntegrationFlow flow = IntegrationFlows
.from(setupAdapter,
c -> c.poller(Pollers.fixedRate(1000L, TimeUnit.MILLISECONDS).maxMessagesPerPoll(1)))
.enrichHeaders(h -> h.headerExpression("aaa", "payload[0].get(\"aaa\")")
.headerExpression("bbb", "payload[0].get(\"bbb\")")
)
.get();
flowContext.registration(flow).id(this.getId().toString()).register();
flow.start();
您错过了 Spring 的要点 - 控制反转容器。
IntegrationFlow
本身什么都不是。它必须作为一个 bean 添加到 ApplicationContext
中,然后这个带有 Spring 容器的上下文及其 BeanFactory
将从该 IntegrationFlow
抽象中完成我们想要的一切。目前,您只需自己完成所有 new
的事情,而不会与任何 AplicationContext
.
我不确定你的逻辑是什么,但你需要考虑在某些 @Configuration
class 中将此流程作为 @Bean
。应用程序上下文将解析此 IntegraitonFlow
,创建所需的 bean,将它们与其他 bean 自动装配(如果需要)并为我们启动流程。自动.
请了解什么是 Spring 应用程序上下文:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#spring-core
以及如何将 IntegrationFlow
制作成 bean:https://docs.spring.io/spring-integration/reference/html/dsl.html#java-dsl