当前位置: 首页 > 知识库问答 >
问题:

Spring Batch:并非所有线程都从线程池运行

戴霖
2023-03-14

我有一个Spring批处理应用程序,它从DB表中读取记录并在Writer类中调用REST API以获取要缓存的数据。然而,我观察到并非线程池中的所有线程都在运行。它们只是以4-5的批处理运行,因为应用程序需要5小时才能进行120K调用。以下是Spring批处理上下文

任务执行者:

<bean id="myTaskExecutor"
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="20"/>
    <property name="maxPoolSize" value="20"/>
</bean>

批量作业:

<batch:job id="myBatchJob">
    <batch:step id="loadData">
        <batch:tasklet task-executor="myTaskExecutor"
            transaction-manager="batchTransactionManager">
            <batch:chunk reader="myReader" writer="myLoader"
                commit-interval="250">
            </batch:chunk>
            <batch:listeners>
                <batch:listener ref="batchStepListener" />
            </batch:listeners>
        </batch:tasklet>
    </batch:step>       
</batch:job>

读卡器配置:请注意,数据源的连接数为20 min/max

<batch:job id="myBatchJob">
    <batch:step id="loadLei">
        <batch:tasklet task-executor="myTaskExecutor"
            transaction-manager="batchTransactionManager">
            <batch:chunk reader="myReader" writer="myLoader"
                commit-interval="250">
            </batch:chunk>
            <batch:listeners>
                <batch:listener ref="batchStepListener" />
            </batch:listeners>
        </batch:tasklet>
    </batch:step>       
</batch:job>    

<bean id="myReader"
    class="org.springframework.batch.item.database.JdbcPagingItemReader">
    <property name="dataSource" ref="myDataSource" />
    <property name="queryProvider" ref="myQueryProvider" />
    <property name="pageSize" value="1000" />
    <property name="rowMapper" ref="myRowMapper" />
    <property name="saveState" value="false" />
</bean>

<bean id="myQueryProvider"
    class="org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean">
    <property name="dataSource" ref="myDataSource" />
    <property name="selectClause" value="SELECT * " />
    <property name="fromClause" value="MYTABLE"/>
    <property name="sortKeys">
        <map>
            <entry key="MYCOLUMN" value="ASCENDING"></entry>
        </map>
    </property> 
</bean>

<bean id="myRowMapper"
    class="com.my.RequestRowMapper">
</bean>

共有1个答案

羊舌源
2023-03-14

您需要为您的作业设置油门限制。默认的油门限制是4。在您的情况下,即使您的线程池有可用的空闲线程,Spring批处理也只会使用4个线程。

看看这个Spring批次corePoolSize VS throttle limit

 类似资料:
  • 本文向大家介绍线程池都有哪些状态?相关面试题,主要包含被问及线程池都有哪些状态?时的应答技巧和注意事项,需要的朋友参考一下 RUNNING:这是最正常的状态,接受新的任务,处理等待队列中的任务。 SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务。 STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程。 TIDYING:所有的任务都销毁了,workCou

  • 主要内容:一、MySql中的线程,二、主要方式,三、源码流程,四、总结一、MySql中的线程 在mysql中,每一个连接上来,就会分配给一个相关的THD数据类。在前面的分析中可以看到,连接器(Connectors)连接到的直接就是连接池,在连接池的线程处理中分为三部分,即一对一(一个连接对应一个线程),多对一(多个连接对应一个线程)和线程池(多对多)。 线程池和线程可以针对不同的具体场景来处理具体的事务,这样既兼顾了效率又提高了适应性,对于新手来说,这就是设计的一个

  • 接收到数据时回调此函数,发生在worker进程中。函数原型: function onReceive(swoole_server $server, int $fd, int $reactor_id, string $data); $server,swoole_server对象 $fd,TCP客户端连接的唯一标识符 $reactor_id,TCP连接所在的Reactor线程ID $data,收到的数

  • 问题内容: 我有一个固定的线程池,我可以将任务提交给该线程池(限制为 5个 线程)。如何找出这 5个 线程中的哪一个执行我的任务(例如“第3 个 线程中的第3 个 线程正在执行此任务”)? 问题答案: 使用:

  • 每个人我对使用线程池有一个误解。实际结果与该类的API描述不同。当我在线程池中使用时,它不重用线程,线程池等待构造函数中设置的KeepAliveTime,然后杀死这个线程并创建一个新线程。当我将KeepAliveTime设置为较小值时,比如1秒或更短,它会删除一个线程并重新创建它,但如果我设置一分钟,则不会创建新线程,因为不允许创建,队列已经满,所以所有任务都会被拒绝,但KeepAliveTime

  • 主要内容:1 什么是Java 线程池,2 Java 线程池的优势,3 Java 线程池的应用场景,4 Java 线程池的例子1 什么是Java 线程池 Java线程池 表示一组正在等待作业并多次重复使用的工作线程。 如果是线程池,则会创建一组固定大小的线程。服务提供商从线程池中拉出一个线程并为其分配作业。作业完成后,线程再次包含在线程池中。 2 Java 线程池的优势 由于无需创建新线程,因此拥有更好的性能,可以节省时间。 3 Java 线程池的应用场景 在用户请求Servlet和JSP时,其中