我有一个独立的 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(使用前将#替换为@)