EJB 3.1异步方法和线程池

时间:2014-11-19 20:34:16

标签: asynchronous jms ejb-3.1 websphere-8

我需要使用EJB 3.1异步方法每天处理大约250,000个文档,以便面对整个长时间的任务。

我这样做是为了使用更多线程并同时处理更多文档。这是伪代码中的一个例子:

// this returns about 250.000 documents per day
List<Document> documentList = Persistence.listDocumentsToProcess();

for(Document currentDocument: documentList){
      //this is the asynchronous call
      ejbInstance.processAsynchronously(currentDocument);
}

假设我有一个大小为10和4个核心处理器的线程池,我的问题是:

  • 应用程序服务器同时处理多少文档?
  • 当池中的所有线程正在处理文档并且还有一个异步调用时会发生什么?这会像一种JMS队列吗?
  • 我是否会采用JMS队列解决方案进行任何改进

我使用Java EE 6和WebSphere 8.5.5.2

1 个答案:

答案 0 :(得分:4)

异步EJB方法调用的默认配置如下(来自信息中心):

  

EJB容器工作管理器具有以下线程池设置:

Minimum number of threads = 1
Maximum number of threads = 5
Work request queue size = 0 work objects
Work request queue full action = Block
Remote Future object duration = 86400 seconds

所以试着回答你的问题:
应用程序服务器同时处理多少文档? (假设10个大小的线程池)

此线程池适用于所有EJB异步调用,因此首先需要假设您的应用程序是唯一使用EJB异步调用的应用程序。然后,您可能会有10个 runnable 实例,这些实例将并行处理。它们是否将被并发处理取决于系统中可用的核心/线程数量,因此您无法获得准确的数字(例如某些核心/线程可能正在进行Web工作,或者使用cpu进行其他进程) )。

当池中的所有线程正在处理文档并且还有一个异步调用到来时会发生什么?
这取决于Work request queue sizeWork request queue full action设置。如果池中没有可用的线程,则请求将排队,直到达到队列大小。然后,它取决于操作,可能是BlockFail

我是否会采用JMS队列解决方案进行任何改进
取决于您的需求。以下是一些优点/缺点JMS解决方案 优点:

  • 持久性 - 如果使用JMS,您的异步任务可以是持久性的,因此如果服务器出现故障,您将不会丢失它们,并且将在重新启动后或其他集群成员处理。 EJB异步队列仅保存在内存中,因此在发生故障时队列中的任务将丢失。
  • 可伸缩性 - 如果您将任务放入队列,它们可能会被群集中的许多服务器同时处理,而不仅限于单个JVM
  • 到期和优先级 - 您可以为消息定义不同的到期时间或优先级。

缺点:

  • 更复杂的应用程序 - 您需要实施MDB来处理您的任务。
  • 更复杂的基础架构 - 您将需要数据库来存储队列(文件系统可用于单个服务器,共享文件系统可用于集群),或外部消息传递解决方案(如WebSphere MQ)
  • 处理单个项目和服务器上的更高负载的性能稍低,因为它必须被序列化/反序列化为持久存储