如何配置等效于 @Transactional 注释的 TransactionInterceptor 以与 PollerMetadata advice 一起使用

问题描述 投票:0回答:0

我想配置我的自定义 PollerMetaData bean 以使用 JdbcPollingChannelAdapter 的 UPDATE 查询启用事务。我正在使用 Spring boot 和 Spring Data JPA 并启用所有自动配置。

@Configuration
public class PollerMetaDataConfigurer {
    @Autowired
    //edit
    PlatformTransactionManager ptm;

    @Bean("CustomPoller")
    PollerMetadata getCustomPollermetaData(){
        PollerMetadata transactionConfiguredPoller=new PollerMetadata();
        TransactionInterceptor transactionInterceptor=new TransactionInterceptor();

        transactionInterceptor.setTransactionManager(ptm);
        List<Advice> pollerAdvice=new LinkedList<>();
        //edit
        pollerAdvice.add(transactionInterceptor);
        transactionConfiguredPoller.setAdviceChain(pollerAdvice);
        transactionConfiguredPoller.setTrigger(new PeriodicTrigger(2000));
        return transactionConfiguredPoller;
    }
}

这是我希望事务处理的集成代码。

@Configuration
@EnableIntegration    
public class IntergrationMain{

    @Bean
    public MessageChannel aChannel() {
        return new DirectChannel();
    }

    @Splitter(inputChannel = "inChannel", outputChannel = "outChannel")
    public List<myEnity> splitter(Message message) {

    }
    @Bean
    @InboundChannelAdapter(value = "inChannel", poller = @Poller(value="CustomPoller"))
    public MessageSource<?> pollDbForQuery(DataSource dataSource) {
        JdbcPollingChannelAdapter myAdapter = new JdbcPollingChannelAdapter(dataSource, SQL); 
        myAdapter.setRowMapper();
        myAdapter.setUpdateSql("update query");
        retrun adapter;


    }
}

当前,事务拦截器在 UPDATE 查询已经执行后被调用。

编辑-我已将 transaction.interceptor 设置为 TRACE,我可以看到消息

| No need to create transaction for [org.springframework.integration.endpoint.AbstractPollingEndpoint$$Lambda$861/0x0000000800832520.call]: This method is not transactional.
spring spring-boot transactions spring-integration spring-transactions
© www.soinside.com 2019 - 2024. All rights reserved.