我使用@Asynchronous方法创建了一个@Stateless EJB,以便并行运行任务。
问题是,这个方法将在循环中被调用很多,以便并行处理导入。默认情况下,在Jboss中,EJB Thread Pool for Asynchronous进程为10。
我们还有其他使用@Asynchronous注释的进程,如果我理解的话,这会将其他任务放入队列,直到有一个线程可以运行它。
我不想用这个新任务污染其他异步任务,所以我开始研究在自己的Pool中隔离这个@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
也许这是缺少使用7和ManagedExecutorService修复的Java EE 6之一?如果是,我将不得不看看我的Jboss是否符合Java EE 7。
谢谢,
˚F
答案 0 :(得分:0)
最后,在带有JSR 236: Concurrency Utilities for JavaTM EE的Java EE 7中,引入了ManagedExecutorService来在可配置容器管理线程池中运行任务。在Java EE 6中,没有类似的方法。
因此,如果您的应用程序在Java 7 EE环境中运行,则使用ManagedExecutorService是您的解决方案。
如果您在Java EE 6环境中工作,那么您无法使用ManagedExecutorService,但某些应用程序服务器正在实施JSR 237: Work Manager for Application Servers。
使用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);
}
如何定义工作经理请查看Configure the Java Connector Architecture (JCA) Subsystem(JBoss EAP 6.3 Doc)。
使用JCA工作管理器仅限于某些应用服务器,例如JBoss 6.如果您使用的是JBoss AS7,这将无效。