Jboss Java EE 容器和 ExecutorService

2024-02-07

我有一个独立的 java 应用程序,它使用 ExecutorService 并行处理多个作业

 ExecutorService es = Executors.newFixedThreadPool(10);

我现在想在 EJB bean 中重复使用相同的解决方案,但不确定如何正确初始化 ThreadPool,因为我通常会让 Java EE 容器来控制所有线程资源。我可以使用相同的代码还是有其他正确的方法来获取 Jboss 托管线程池?


在 EJB 中执行此操作的正确方法是使用 ManagedExecutorService,它是 Concurrency Utils API (Java EE7) 的一部分。您不应该在企业代码中使用属于 java.util.concurrent 一部分的任何 ExecutorService。

通过使用 ManagedExecutorService 您的新线程将由容器创建和管理。

以下示例取自我的网站here http://blog.chris-ritchie.com/2013/10/managed-thread-factory-example-in-wildfly.html.

要使用 ManagedExecutorService 创建新线程,首先创建一个实现 Callable 的任务对象。在 call() 方法中,我们将定义要在单独线程中执行的工作。

public class ReportTask implements Callable<Report> {

    Logger logger = Logger.getLogger(getClass().getSimpleName());

    public Report call() {
        try {
            Thread.sleep(3000);
        catch (InterruptedException e) {
            logger.log(Level.SEVERE, "Thread interrupted", e);
        }
        return new Report();
    }
}

然后我们需要通过将任务传递给 ManagedExecutorService 的 Submit() 方法来调用该任务。

@Stateless
public class ReportBean {

    @Resource
    private ManagedExecutorService executorService;

    public void runReports() {
        ReportTask reportTask = new ReportTask();
        Future<Report> future = executorService.submit(reportTask);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jboss Java EE 容器和 ExecutorService 的相关文章

随机推荐