@Asynchronous EJB线程池配置

时间:2016-12-13 21:46:21

标签: java-ee asynchronous jboss threadpool

我使用@Asynchronous方法创建了一个@Stateless EJB,以便并行运行任务。

问题是,这个方法将在循环中被调用很多,以便并行处理导入。默认情况下,在Jboss中,EJB Thread Pool for Asynchronous进程为10。

我们还有其他使用@Asynchronous注释的进程,如果我理解的话,这会将其他任务放入队列,直到有一个线程可以运行它。

我不想用这个新任务污染其他异步任务,所以我开始研究在自己的Pool中隔离这个@Asynchronous进程的方法。由于此过程可能需要100个线程,因此理想的情况是能够创建具有此大小的自己的线程池。

我发现您可以使用jboss注释@Pool配置EJB池,所以我认为就是这样,但我只是意识到这是针对EJB池而不是线程池......

有没有办法说这个异步方法应该由自己的线程池管理?

我在这里找到了如何为JBoss配置EJB线程池,所以我想知道如果你不能通过注释或其他东西引用它,那么这样做有什么意义...... https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6/html/Administration_and_Configuration_Guide/Create_a_Thread_Pool.html

也许这是缺少使用7和ManagedExecutorService修复的Java EE 6之一?如果是,我将不得不看看我的Jboss是否符合Java EE 7。

谢谢,

˚F

1 个答案:

答案 0 :(得分:0)

Java EE 7

最后,在带有JSR 236: Concurrency Utilities for JavaTM EE的Java EE 7中,引入了ManagedExecutorService来在可配置容器管理线程池中运行任务。在Java EE 6中,没有类似的方法。

因此,如果您的应用程序在Java 7 EE环境中运行,则使用ManagedExecutorService是您的解决方案。

使用JCA Work Manager的Java EE 6

如果您在Java EE 6环境中工作,那么您无法使用ManagedExecutorService,但某些应用程序服务器正在实施JSR 237: Work Manager for Application Servers

使用JCA进行注射时,一个简单的实现可能如下所示。

@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class ThreadsResource {

    @Resource(name="jca/workmanager")
    WorkExecutorFactory executorFactory;

    public void execute(){
        try(WorkExecutor executor = executorFactory.newExecutor();){
        Runnable runnable = new Runnable(){
            @Override
            public void run() {
            //some work to do
            }
        };
        executor.execute(runnable);
  }

如何定义工作经理请查看Configure the Java Connector Architecture (JCA) Subsystem(JBoss EAP 6.3 Doc)。

使用JCA工作管理器仅限于某些应用服务器,例如JBoss 6.如果您使用的是JBoss AS7,这将无效。