Spring integration 入站通道适配器未根据执行器进行缩放

Spring integration 入站通道适配器未根据执行器进行缩放,spring-integration,threadpoolexecutor,executor,Spring Integration,Threadpoolexecutor,Executor,我有jdbc:入站通道适配器轮询50条记录。 我正试图通过将pollerExecutor池大小扩展到1-10来提高性能,以便多个线程可以分别处理50条记录: <int-jdbc:inbound-channel-adapter id="initial.ContactType.poller" query="${poller.ContactType.get}" max-rows="${poller.deliveryContactType.maxRow:50}"

我有jdbc:入站通道适配器轮询50条记录。 我正试图通过将pollerExecutor池大小扩展到1-10来提高性能,以便多个线程可以分别处理50条记录:

    <int-jdbc:inbound-channel-adapter
    id="initial.ContactType.poller"
    query="${poller.ContactType.get}"
    max-rows="${poller.deliveryContactType.maxRow:50}"
    row-mapper="ContactTypePollerRowMapper"
    data-source="dataSource" channel="ContactTypeChannel">
    <int:poller  fixed-rate="3000" time-unit="MILLISECONDS" task-executor="pollerExecutor">
        <int:advice-chain>
            <ref bean="pollerLoggingAdvice"/>
            <ref bean="txAdvice"  />
        </int:advice-chain>
    </int:poller>
</int-jdbc:inbound-channel-adapter>
<task:executor id="pollerExecutor" pool-size="1-10"
    queue-capacity="0" rejection-policy="CALLER_RUNS" />

我测试了处理100000条记录所需的时间是相同的,与池大小无关

我做了三轮测试,池大小分别为1、1-3和1-10, 在所有三项测试中,100000条记录每次耗时1小时

我通过检查日志确认pollerExecutor线程没有并行工作。 pollerExecutor-1在pollerExecutor-2开始处理之前处理所有50条记录


为什么容器/轮询执行器不能并行工作?

我认为您的问题在于:

/**
 * Set the capacity for the ThreadPoolExecutor's BlockingQueue.
 * Default is {@code Integer.MAX_VALUE}.
 * <p>Any positive value will lead to a LinkedBlockingQueue instance;
 * any other value will lead to a SynchronousQueue instance.
 * @see java.util.concurrent.LinkedBlockingQueue
 * @see java.util.concurrent.SynchronousQueue
 */
public void setQueueCapacity(int queueCapacity) {
/**
*设置ThreadPoolExecutor的BlockingQueue的容量。
*默认值为{@code Integer.MAX_VALUE}。
*任何正值都将导致LinkedBlockingQueue实例;
*任何其他值都将导致SynchronousQueue实例。
*@请参阅java.util.concurrent.LinkedBlockingQueue
*@请参阅java.util.concurrent.SynchronousQueue
*/
public void setQueueCapacity(int queueCapacity){
因此,如果指定
queue capacity=“0”
,则会得到一个
SynchronousQueue
,它无法接受新的并行任务,因为已经有一个任务在忙于处理这50条记录


尝试使用合理的
队列容量来观察可能的并行性。

我认为您的问题在于:

/**
 * Set the capacity for the ThreadPoolExecutor's BlockingQueue.
 * Default is {@code Integer.MAX_VALUE}.
 * <p>Any positive value will lead to a LinkedBlockingQueue instance;
 * any other value will lead to a SynchronousQueue instance.
 * @see java.util.concurrent.LinkedBlockingQueue
 * @see java.util.concurrent.SynchronousQueue
 */
public void setQueueCapacity(int queueCapacity) {
/**
*设置ThreadPoolExecutor的BlockingQueue的容量。
*默认值为{@code Integer.MAX_VALUE}。
*任何正值都将导致LinkedBlockingQueue实例;
*任何其他值都将导致SynchronousQueue实例。
*@请参阅java.util.concurrent.LinkedBlockingQueue
*@请参阅java.util.concurrent.SynchronousQueue
*/
public void setQueueCapacity(int queueCapacity){
因此,如果指定
queue capacity=“0”
,则会得到一个
SynchronousQueue
,它无法接受新的并行任务,因为已经有一个任务在忙于处理这50条记录


尝试使用一些合理的
队列容量来观察可能的并行性。

有两种可能性:1-下游的一些同步,2-数据库正在应用表锁。进行线程转储以查看发生了什么。另请参见我的答案。@Gary,下游没有同步-我确认。没有DB表锁,因为我有多个线程所有JVM都可以并行轮询。但是,一次轮询一组50条记录,而不是10条记录。请参阅@ArtemBilan的答案。我建议的线程转储会显示这一点。有两种可能性:1-一些下游同步,2-数据库正在应用表锁。进行线程转储以查看发生了什么。另请参阅我的answer@Gary,下游没有同步-我确认。没有DB表锁,因为我有多个JVM,所有JVM都可以并行轮询。但是,一次一组50条记录而不是10条记录。请参阅@ArtemBilan的答案。我建议的线程转储会显示这一点。谢谢,尝试使用
queue capacity=“1000”
它一直保持在
pollerExecutor-1
上,因为50条记录的处理时间不到
固定速率
,即3秒,后来更改了
队列容量=“1”
,降低了
固定速率=“1000”
现在我确实看到线程在一起工作。因此问题是
固定速率=“1000”
每个执行者?即所有10个执行者都将以固定速率进行投票?似乎我们无法限制
固定速率
?谢谢,尝试使用
队列容量=“1000”
它一直保持在
pollerExecutor-1
上,因为50条记录的处理时间不到
固定速率
,即3秒,后来更改了
队列容量=“1”
,降低了
固定速率=“1000”
现在我确实看到线程在一起工作。因此问题是
固定速率=“1000”
每个执行者?即所有10个执行者都将以固定费率进行投票?似乎我们无法限制固定费率