Spring integration 如何限制JdbcPollingChannelAdapter的事务边界

Spring integration 如何限制JdbcPollingChannelAdapter的事务边界,spring-integration,spring-integration-dsl,Spring Integration,Spring Integration Dsl,我有一个JdbcPollingChannelAdapter,定义如下: @Bean public MessageSource<Object> jdbcMessageSource(DataSource dataSource) { JdbcPollingChannelAdapter jdbcPollingChannelAdapter = new JdbcPollingChannelAdapter(dataSource, "SELECT * FROM com

我有一个JdbcPollingChannelAdapter,定义如下:

@Bean
public MessageSource<Object> jdbcMessageSource(DataSource dataSource) {
    JdbcPollingChannelAdapter jdbcPollingChannelAdapter = new JdbcPollingChannelAdapter(dataSource,
            "SELECT * FROM common_task where due_at <= NOW() and retries < order by due_at ASC FOR UPDATE SKIP LOCKED");
    jdbcPollingChannelAdapter.setMaxRowsPerPoll(1);
    jdbcPollingChannelAdapter.setUpdateSql("Update common_task set retries = :retries, due_at = due_at + interval '10 minutes' WHERE ID = (:id)");
    jdbcPollingChannelAdapter.setUpdatePerRow(true);
    jdbcPollingChannelAdapter.setRowMapper(this::mapRow);
    jdbcPollingChannelAdapter.setUpdateSqlParameterSourceFactory(this::updateParamSource);
    return jdbcPollingChannelAdapter;
}
集成流中的轮询器定义为事务性的。根据我的理解,这将 1.在事务中执行选择查询和更新查询。 2.它还将在同一事务中执行doSomething()方法


目标:我想做1而不是2。我想在事务中执行select和update,以确保两者都发生。但是,我不知道;我不想在同一事务中执行doSomething()。如果doSomething()中出现异常,我仍然希望保留轮询期间所做的更新。我怎样才能做到这一点

这是通过简单的换线来完成的。所以,您需要的只是离开轮询线程,允许它提交TX并在单独的线程中继续进程

根据您使用
.split()
的逻辑,最好在分割之后已经有新的线程处理,所以项目将由该
doSomething()
并行处理

使用
executor频道
即可实现此目标。既然您已经拥有了<代码> TaskSooChanChhanle()/Case>,请考虑将其替换为<代码> ExcutoReals> <代码>。p> 请参阅参考手册中的更多信息:

还有它的Javadocs

简单的Java配置变量如下所示:

    @Bean
    public MessageChannel taskSourceChannel() {
        return new ExecutorChannel(executor());
    }

    @Bean
    public Executor executor() {
        return new ThreadPoolTaskExecutor();
    }
@ServiceActivator(inputChannel = "taskSourceChannel")
    public void doSomething(FooTask event) {
        //do something but ** not ** within the transaction of the poller.
    }      
    @Bean
    public MessageChannel taskSourceChannel() {
        return new ExecutorChannel(executor());
    }

    @Bean
    public Executor executor() {
        return new ThreadPoolTaskExecutor();
    }