拦截器的Catch返回值



我想检索这个拦截器的返回值:

https://arjan-tijms.omnifaces.org/2012/01/cdi-based-asynchronous-alternative.html

@Interceptor
@Asynchronous
@Priority(PLATFORM_BEFORE)
public class AsynchronousInterceptor implements Serializable {
private static final long serialVersionUID = 1L;

@Resource
private ManagedExecutorService managedExecutorService;

private static final ThreadLocal<Boolean> asyncInvocation = new ThreadLocal<Boolean>();
@AroundInvoke
public synchronized Object submitAsync(InvocationContext ctx) throws Exception {

if (TRUE.equals(asyncInvocation.get())) {
return ctx.proceed();
}

return new FutureDelegator(managedExecutorService.submit( ()-> { 
try {
asyncInvocation.set(TRUE);
return ctx.proceed();
} finally {
asyncInvocation.remove();
}
}));

}
}

这是我的一个CdiBean,它通过让数据异步加载从AsynchronousInterceptor中获利。。

public class SomeCDI {
@Asynchronous
public void loadDataAsync() {....}
}

这就是我稍后在代码中使用cdi-bean的方式:

@Inject
SomeCDI dataLoader;
dataLoader.loadDataAsync(); // the loading starts async but I never find out when is the Future class done???

所以我的问题是如何检索返回值(在我的例子中来自FutureDelegator(???

你不会的。EJB上的异步调用和Tijms建议的模型中的异步调用是"异步调用";火与遗忘":你调用它们,让它们完成自己的工作。最终,您可以使async方法在结束时激发一些事件;返回";结果,观察这个事件给用户一些响应(可能是websockets?(。

理想情况下,异步方法应该是void,并进行一些回调提升。

请注意,CDI2.0事件模型具有fireAsync方法,应该使用该方法而不是您自己的实现,因为它已经具有适当的上下文,并且可以通过事务标记和自定义选项来丰富(当使用NotificationOptions方法签名时(。