Spring integration spring集成任务执行器队列中填充了更多记录

Spring integration spring集成任务执行器队列中填充了更多记录,spring-integration,Spring Integration,我开始构建一个Spring集成应用程序,其中输入网关生成固定数量(50)的记录,然后停止生成新记录。中间有基本的过滤器/路由器/变压器,结束服务激活器和任务执行器配置如下: <int:service-activator input-channel="inChannel" output-channel="outChannel" ref="svcProcessor"> <int:poller fixed-rate="100" task-executor="myTas

我开始构建一个Spring集成应用程序,其中输入网关生成固定数量(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"/>
有时程序运行后,日志显示队列已超过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(branch 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"/>
在出现异常之前,只有大约32个订单,因此我不确定为什么排队任务=200,而完成任务=0

感谢

getTaskCount()
此方法提供自启动以来分配给执行者的总任务数。因此,它会随着时间的推移而增加

根据java文档,其他变量是近似数字,但不精确

  • getCompletedTaskCount()
    返回已完成执行的任务的大致总数
  • public int getActiveCount()
    返回正在积极执行任务的线程的大致数目
  • 理想情况下,
    getTaskCount()
    getCompletedTaskCount()
    将随时间线性增加,因为它包括自代码开始执行以来分配的所有先前任务。然而,activeCount应该小于50,但作为一个近似数字,它有时会超过50,并且几乎没有余量

    参考:-

    您正在寻找正确的信息。但是,由于这些值在运行时经常更改,所以它不是您使用的Spring的完美版本?我使用的是使用Spring 3.2.8的SI 3.0.3.RELEASE。我知道这些都是近似的数字,但没想到会更高,最终被拒绝。我使用了队列容量100,希望不会发生拒绝。我尝试将服务时间减少到0.5秒(更快的消费者),getTaskCount()返回的值更低,但仍然>55。我相信您的服务激活器在某个时间后不断推送记录,因此getTaskCount正在增加。因为它是所有任务的计数,包括已完成的任务。如果你正在寻找pendingTask,你需要getTaskCount-GetCompletedTask,你知道是什么导致了持续的推送吗?我没有使用循环将消息发送回源。或者,它是否需要在某个地方显式地标记一条消息“已完成”,这样它就不会被再次推送?
    <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"/>
    
     org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@6c31732b[Running, pool size = 5, active threads = 5, queued tasks = 200, completed tasks = 0]]