@Asynchronous EJB 线程池配置

Far*_*rid 5 jboss asynchronous threadpool jakarta-ee

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

问题是,为了并行处理导入,将在循环中多次调用此方法。默认情况下,在 Jboss 中,异步进程的 EJB 线程池为 10。

我们还有其他带有@Asynchronous 注释的进程,如果我理解得很好,这会将其他任务放入队列中,直到有线程可以运行它。

我不想用这个新任务污染其他异步任务,所以我开始寻找一种方法来隔离这个@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

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

谢谢,

F

Pau*_*ski 1

Java EE 7

最后,在带有JSR 236 的 Java EE 7:Java™ EE 并发实用程序中,引入了 ManagedExecutorService来在可配置的容器托管线程池中运行任务。在 Java EE 6 中没有类似的方法。

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

Java EE 6 使用 JCA 工作管理器

如果您在 Java EE 6 环境中工作,则无法使用 ManagedExecutorService 但某些应用程序服务器正在实现JSR 237:应用程序服务器的工作管理器

使用 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);
  }
Run Code Online (Sandbox Code Playgroud)

如何定义工作管理器,请查看配置 Java 连接器架构 (JCA) 子系统(JBoss EAP 6.3 Doc)。

使用 JCA 工作管理器仅限于某些应用程序服务器,例如 JBoss 6。如果您使用 JBoss AS7,则这将不起作用。