我有一个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>
您需要为您的作业设置油门限制。默认的油门限制是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时,其中