我有一个独立的 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,您的新线程将由容器创建和管理。
以下示例取 self 的网站 here .
要使用 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);
}
}
关于java - Jboss Java EE 容器和一个 ExecutorService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13932083/