EJB 3.1异步方法和线程池

Yan*_*osh 4 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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 应用程序服务器将同时处理多少个文件?
  • 当池中的所有线程都在处理文档并且又进行了一次异步调用时,会发生什么情况?这会像某种JMS队列一样工作吗?
  • 我采用JMS Queue解决方案有什么改进吗

我使用Java EE 6和WebSphere 8.5.5.2

Gas*_*Gas 5

异步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
Run Code Online (Sandbox Code Playgroud)

因此,尝试回答您的问题:
应用程序服务器将同时处理多少个文档?(假定10个大小的线程池)

该线程池适用于所有EJB异步调用,因此首先需要假定您的应用程序是唯一使用EJB异步调用的应用程序。然后,您将可能有10个可运行实例,这些实例将被并行处理。他们是否会被处理并发取决于系统中可用的核心/线程数量,所以你不能有准确的数字(一些核心/线程可以使用CPU等过程中做网站的工作,例如,或)。

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

我采用JMS Queue解决方案有什么改进
吗?取决于您的需求。这是一些优点/缺点JMS解决方案。
优点:

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

缺点:

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