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
最后,在带有JSR 236 的 Java EE 7:Java™ EE 并发实用程序中,引入了 ManagedExecutorService来在可配置的容器托管线程池中运行任务。在 Java EE 6 中没有类似的方法。
因此,如果您的应用程序在 Java 7 EE 环境中运行,那么使用ManagedExecutorService就是您的解决方案。
如果您在 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,则这将不起作用。