Search code examples
spring-integration

How to make polling multi-thread on spring integration?


I have the following Spring Integration flow:

It gathers records from one database, converts to json and sends to another database.

The idea is to have 10 pollers (channel0 to 9). Each one is a pollingFlowChanN Bean. But I suspect they are sharing the same thread.

How to I make the polling multi-thread in this scenario?

    private IntegrationFlow getChannelPoller(final int channel, final int pollSize, final long delay) {
        return IntegrationFlows.from(jdbcMessageSource(channel, pollSize), c -> c.poller(Pollers.fixedDelay(delay)
                .transactional(transactionManager)))
                .split()
                .handle(intControleToJson())
                .handle(pgsqlSink)
                .get();
    }

    @Bean
    public IntegrationFlow pollingFlowChan0() {
        return getChannelPoller(0, properties.getChan0PollSize(), properties.getChan0Delay());
    }

    @Bean
    public IntegrationFlow pollingFlowChan1() {
        return getChannelPoller(1, properties.getChan1PollSize(), properties.getChan1Delay());
    }

   ....


Solution

  • I assume you use the latest Spring Boot, which have a TaskScheduler auto-configured with one thread: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.spring-integration. That's the best guess why your tasks use the same thread.

    See also answer here: Why does the SFTP Outbound Gateway not start working as soon as I start its Integration Flow?