Java CDI中的异步方法调用

Java CDI中的异步方法调用,java,cdi,Java,Cdi,我试图在CDIBean中调用异步方法,并获得类似于EJB的@asynchronous的行为。为此,我写了一篇注释如下: @InterceptorBinding @Target({ METHOD, TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface SimpleAsync { } 我正在使用以下代码处理此注释: @AroundInvoke public Object callAsync(InvocationContext

我试图在CDIBean中调用异步方法,并获得类似于EJB的@asynchronous的行为。为此,我写了一篇注释如下:

@InterceptorBinding
@Target({ METHOD, TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface SimpleAsync {

}
我正在使用以下代码处理此注释:

 @AroundInvoke
public Object callAsync(InvocationContext ctx) throws Exception {
    System.out.println("around invoke is called"+ctx.getMethod());
    Runnable runImpl = new Runnable(){
        public void run(){
            try{
               ctx.proceed();
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }
     };

   Thread t = new Thread(runImpl);
   t.start();
   System.out.println("after thread start");
  }
每当我在新线程中调用
ctx.continue
时,
callAsync
方法将进入无限循环,而我在其上放置
@SimpleAsync
注释的实际方法将永远不会执行


是否需要从同一个线程调用
ctx.procedue
,如果需要,是否有其他方法可以在CDI中实现异步方法调用?

您尝试的操作似乎非常危险,因为这样切换线程可能会弄乱上下文。我可以问一下您将注释应用到的bean的范围是什么吗?我怀疑发生的事情是,当您第一次调用该方法时,底层bean被解析,拦截器被应用,然后在新线程中它尝试再次解析该bean,但上下文不同,不包含该bean,因此创建了一个新的bean,而该bean又有一个新的拦截器等等。谢谢。。明白你的意思了!!一定是这样。CDIBean仅在其默认范围内。现在我认为,使用EJB是最好的方式。