在JBoss7中,如何限制特定bean中以@Asynchronous启动的线程数

在JBoss7中,如何限制特定bean中以@Asynchronous启动的线程数,asynchronous,jboss7.x,Asynchronous,Jboss7.x,我有一个进程,我想串行运行,但在不同的线程中。我如何在JBoss7中实现这一点?显而易见的答案是@AsynchronousEJB方法,其中EJB配置为一次只运行一个线程(其他请求将在队列中) 如何才能最好地实现这一点?我认为实现这一点的一个很好的方法是使用EJB 3.1中的单例+异步注释的组合,您还可以使用AccessTimeout注释为排队调用提供等待超时,最后您甚至可以使用Lock注释来控制读取,如果需要,请在此上写入锁定: @Singleton public class Singleton

我有一个进程,我想串行运行,但在不同的线程中。我如何在JBoss7中实现这一点?显而易见的答案是@AsynchronousEJB方法,其中EJB配置为一次只运行一个线程(其他请求将在队列中)


如何才能最好地实现这一点?

我认为实现这一点的一个很好的方法是使用EJB 3.1中的单例+异步注释的组合,您还可以使用AccessTimeout注释为排队调用提供等待超时,最后您甚至可以使用Lock注释来控制读取,如果需要,请在此上写入锁定:

@Singleton
public class SingletonAsyncProcessor{

@Asynchronous
@AccessTimeout(5000) //times out after 5 seconds
public Future<String> addJobToQueue(String jobName) {
@Singleton
公共类单音异步处理器{
@异步的
@AccessTimeout(5000)//5秒后超时
公共未来addJobToQueue(字符串jobName){
还请注意,您可以在类级别(所有方法都是异步的)或方法级别使用大多数注释,甚至可以在web容器中运行EJB3.1

EJB3.1岩石


注意。

这是一种方法,但问题是它意味着队列必须在5秒内清除,否则客户端会出现异常。我更希望它的行为像一个单线程执行器服务,其他请求只是等待。异步单线程确实以串行方式处理请求,但不一定是在单线程中。运行simp例如在JBoss AS 7.1.3上,我可以看到每个请求都由EJB线程池中不同的线程处理。如果确实需要单个线程,则必须以依赖于实现的方式配置线程池。如果需要,可以将队列设置为从不超时。只需将@AccessTimeout上的参数设置为-1,然后你不会得到任何与等待超时相关的例外。