我开始构建一个Spring Integration应用程序,其中输入网关生成固定数量(50)的记录,然后停止生成新记录。中间有基本的过滤器/路由器/变换器,结束服务激活器和任务执行器配置如下:
<int:service-activator input-channel="inChannel" output-channel="outChannel" ref="svcProcessor">
<int:poller fixed-rate="100" task-executor="myTaskExecutor"/>
</int:service-activator>
<task:executor id = "myTaskExecutor" pool-size="5" queue-capacity="100"/>
我试着在svcProcessor方法的乞讨时输入一些调试信息:
@Qualifier(value="myTaskExecutor")
@Autowired
ThreadPoolTaskExecutor executor;
@ServiceActivator
public Order processOrder(Order order) {
log.debug("---- " + "executor size: " + executor.getActiveCount() +
" q: " + executor.getThreadPoolExecutor().getQueue().size() +
" r: " + executor.getThreadPoolExecutor().getQueue().remainingCapacity()+
" done: " + executor.getThreadPoolExecutor().getCompletedTaskCount() +
" task: " + executor.getThreadPoolExecutor().getTaskCount()
);
//
//process order takes up to 5 seconds.
//
return order;
}
有时程序运行后,日志显示队列已超过50,然后最终获得拒绝异常:
23:38:31.096 DEBUG [myTaskExecutor-2] ---- executor size: 5 q: 44 r: 56 done: 11 task: 60
23:38:31.870 DEBUG [myTaskExecutor-5] ---- executor size: 5 q: 51 r: 49 done: 11 task: 67
23:38:33.600 DEBUG [myTaskExecutor-4] ---- executor size: 5 q: 69 r: 31 done: 11 task: 85
23:32:46.792 DEBUG [myTaskExecutor-1] ---- executor size: 5 q: 72 r: 28 done: 11 task: 88
看起来活动计数和队列大小/剩余的总和看起来正确,配置为5和100,但我不清楚为什么队列中有超过50条记录,并且taskCount也大于限制50。
我是否正在查看执行程序和队列中的错误信息?
由于
更新 (不确定我是否应该打开另一个问题)
我从spring-integration(分支SI3.0.x)尝试了cafeDemo的xml版本,并使用了文档中提供的池,但使用了100毫秒的速率和增加的容量:
<int:service-activator input-channel="hotDrinks" ref="barista" method="prepareHotDrink" output-channel="preparedDrinks">
<int:poller task-executor="pool" fixed-rate="100"/>
</int:service-activator>
<task:executor id="pool" pool-size="5" queue-capacity="200"/>
在我运行之后,它在20次交付后也被拒绝例外:
org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@6c31732b[Running, pool size = 5, active threads = 5, queued tasks = 200, completed tasks = 0]]
在异常之前只有大约32个订单,所以我不确定为什么排队的任务= 200并且完成的任务= 0?
感谢
答案 0 :(得分:1)
getTaskCount(): - 此方法给出自启动以来分配给执行程序的总任务数。所以,它会随着时间的推移而增加。
其他变量是近似数字,不符合java的文档。 1. getCompletedTaskCount() 返回已完成执行的大致任务总数。
2.public int getActiveCount() 返回正在执行任务的大致线程数。
理想情况下,getTaskCount和getCompletedTaskCount将随时间线性增加,因为它包含自开始执行代码以来分配的所有先前任务。但是,activeCount应该小于50,但是近似数字有时会略微超过50,而且余地很小。
参考: - https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html