为了并行运行任务,我创建了一个具有@异步方法的@无状态EJB。
问题是,这个方法将被称为很多,在一个循环中,以便并行处理一个导入。默认情况下,在Jboss中,用于异步进程的EJB线程池为10。
我们还有其他带有@异步注释的进程,如果我理解得很好,就会将其他任务放到队列中,直到线程可用为止。
我不想用这个新的任务来污染其他异步任务,所以我开始考虑将这个@异步进程隔离到它自己的池中的方法。由于该进程可能需要100个线程,因此理想的做法是能够创建具有此大小的线程池。
我发现您可以使用jboss注释@Pool来配置EJB池,所以我认为这就是它,但我刚刚意识到这是针对EJB池的,而不是线程池.
有没有办法说这个异步方法应该由它自己的线程池来管理呢?
我在这里找到了如何为JBoss配置EJB,所以我想知道,如果不能通过注释或其他什么. Pool.html引用它,那又有什么意义呢?
也许这就是Java 6的缺失之一,而Java 6已经被7和ManagedExecutorService修复了?如果是,我必须看看我的Jboss是否符合Java 7。
谢谢,
F
发布于 2016-12-13 22:59:47
Java 7
最后,在Java 7中,在JSR 236: JavaTM EE的并发实用程序中引入了ManagedExecutorService,以便在可配置容器托管线程池中运行任务。在Java 6中,没有类似的方法。
因此,如果您的应用程序在Java7EE环境中运行,那么使用ManagedExecutorService是您的解决方案。
使用JCA工作管理器的Java 6
如果您在Java 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);
}如何定义工作经理请看一下配置Java连接器体系结构(JCA)子系统 (JBoss EAP6.3Doc)。
使用JCA工作管理器的仅限于某些应用服务器,例如JBoss 6。如果您使用的是JBoss AS7,则不会工作。
https://stackoverflow.com/questions/41131099
复制相似问题