我需要使用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个核心处理器的线程池,我的问题是:
我使用Java EE 6和WebSphere 8.5.5.2
答案 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 size
和Work request queue full action
设置。如果池中没有可用的线程,则请求将排队,直到达到队列大小。然后,它取决于操作,可能是Block
或Fail
。
我是否会采用JMS队列解决方案进行任何改进
取决于您的需求。以下是一些优点/缺点JMS解决方案
优点:
缺点: