spring集成任务执行程序队列中填充了更多记录

时间:2014-12-09 05:17:26

标签: spring-integration

我开始构建一个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?

感谢

1 个答案:

答案 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