如何管理Managed Executor Service

时间:2015-12-14 18:42:37

标签: multithreading java-ee thread-safety threadpool

我使用Managed Executor Service来实现一个进程管理器,它将在收到JMS消息事件后在后台处理任务。通常情况下,会运行少量任务(最多10个),但如果发生某些事情并且我的应用程序开始收到数百个JMS消息事件会怎样。我该如何处理此类事件?

我的想法是尽可能限制线程数,并将所有其他消息保存到数据库,并在线程可用时运行。提前致谢。

1 个答案:

答案 0 :(得分:1)

  

我的想法是尽可能限制线程数,并将所有其他消息保存到数据库,并在线程可用时运行。

此问题的详细答案取决于您选择运行的Java EE应用服务器,因为它们的配置略有不同。

任何Java EE应用服务器都允许您配置托管执行服务(MES)的线程池大小,这是您的线程池的工作线程数。

假设您有一个10个工作线程,并且您一次充满了100个请求,MES将保留一个积压的请求队列,并且工作线程将在完成工作后将工作从队列中取出,直到队列是空的。

现在,如果工作进入队列有时就没关系,但如果整个工作队列的增长速度超过工作线程可以将工作从队列中取出,那么就会遇到问题。对此的解决方案是增加线程池大小,否则积压将溢出,服务器将耗尽内存。

  

如果发生了什么事情,我的应用程序开始收到数百个JMS消息事件。我该如何处理此类事件?

如果服务器上的负载太零散,以至于需要将任务保存到数据库中,那么最好的方法似乎是:

  1. 增加线程池大小
  2. 让服务器在任务积压队列已满时立即拒绝传入的任务
  3. 让客户端阻塞等待服务器任务队列未满(如果客户端任务提交与用户体验无关,我只会建议此选项)