Spring集成队列,以任何方式获取当前队列大小?

时间:2012-05-18 14:30:37

标签: spring-integration

我们有这样的场景,来自外部系统的大量消息需要被异步处理,当前设计是每隔5分钟唤醒一个作业从外部系统中提取消息,然后保持原始消息,然后发送msg id到ExecutorChannel,因此消费者(可能很多)可以从频道消费。

我们面临的问题是如何处理系统崩溃而队列中的消息,不知何故,每次作业唤醒时,我们都需要查看我们的数据库,以确定是否有任何原始消息已经在队列中。

最简单的方法是查询当前队列大小,并查明队列中是否存在比msg更多的原始消息。所以我的问题是:ExecutorChannel的任何API都能找出队列的大小吗?或任何其他建议?

THX 杰森

2 个答案:

答案 0 :(得分:1)

Spring Integration本身不在ExecutorChannel中维护队列;消息由底层执行程序执行。

如果您正在使用专用于通道的Spring ThreadPoolTask​​Executor,您可以深入查看通道的底层ThreadPoolTask​​Executor的ThreadPoolExecutor,并获取其BlockingQueue(getQueue())的句柄并获得它的计数。

但是,您还必须添加活动任务计数。

总计数是近似值,但因为ThreadPoolExecutor没有原子方法来计算排队和活动任务的数量。

答案 1 :(得分:0)

你可以通过id获取队列,然后获取queueSize()

@Qualifier(value="myChannel")
@Autowired(required=false)
QueueChannel  queue;
 ....
 queue.getQueueSize()

这里有更多细节: http://mariemjabloun.blogspot.com/2014/04/spring-integration-channel-queue-get.html