Java 在spring集成dsl中配置spring事务
我目前正在使用SpringIntegrationDSL配置SpringIntegration,如下所示Java 在spring集成dsl中配置spring事务,java,spring,spring-integration,Java,Spring,Spring Integration,我目前正在使用SpringIntegrationDSL配置SpringIntegration,如下所示 @Bean public IntegrationFlow flow() { return IntegrationFlows.from(inboundServer()) .transform(Transformers.objectToString()) .transform(...) .route(...)
@Bean
public IntegrationFlow flow() {
return IntegrationFlows.from(inboundServer())
.transform(Transformers.objectToString())
.transform(...)
.route(...)
.transform(Transformers.toJson())
.channel(...)
.get();
}
@Bean
public PlatformTransactionManager transactionManager() {
....
}
我不知道如何配置流以使用我配置的事务管理器。实际上,Spring Integration Java DSL支持XML可用的所有事务功能 请提供您希望从何处开始交易的更多信息。请记住,TX支持仅限于线程边界。因此,您可以从轮询器或JMS(AMQP)消息驱动通道适配器启动TX 或者使用
TransactionInterceptor
作为流中任何端点的建议。但在这种情况下,仅对AbstractReplyProducingMessageHandler.HandlerRequestMessage
限制发送
更新
为流程的某些部分启动TX不是标准任务,它可以作为工作单元
一些事务性黑盒来实现。为此,我们有一个类似于网关的组件。因此,您可以指定一些接口,用@MessagingGateway
标记它,将@IntegrationComponentScan
与@EnableConfiguration
一起添加,并用@Transactional
标记该接口的方法。此网关的requestChannel
应使用JDBC和Jackson转换将消息发送到某个单独的流,并等待结果在主流中继续。在从该网关的方法调用返回时,发送将完成
从
句柄(“myGateway”,“getData”)
将该网关称为常规服务激活器。inboundServer()是一个TCP入站网关,我希望在它收到消息时立即启动事务。很抱歉延迟。通过原始TCP上的发送,您将获得哪些收益?即使我们可以使用AOP在那里添加TX拦截器,回滚也不会将收到的消息返回到套接字。请为您的用例共享更多信息。我不会获得传入原始TCP的发送。我的用例是,传入的数据是一个查询数据库的请求。它将使用jdbcTemplate返回一个大数据,并使用Jackson进行序列化。这种方法的问题是,在序列化之前,所有数据都必须加载到内存中。如果数据太大,可能会导致内存不足。为了克服这个问题,我扩展了jdbcTemplate,它返回java.util.stream.stream
。问题是,流仅在tx内部打开。一旦tx关闭,流将关闭。所以我需要在序列化期间打开tx。感谢您更新的答案。如果我错了,请纠正我,我认为您的意思是使用@Transactional注释的方法创建一个网关,该方法返回json字符串?对。请记住,流必须是直接的
单线程的,并且依赖于由网关填充的回复通道
头