小编Iar*_*kyi的帖子

将请求范围数据传递给 CDI 中的异步方法

Java EE 7 应用程序在 Wildfly 9.0.2.Final 上运行。从@Asynchronous 方法中访问请求范围的数据存在问题。

在 Web 过滤器中,数据(例如令牌)被设置到 RequestScoped CDI bean 中。稍后我们要访问这些数据。如果我们在一个线程中工作,则一切正常。但是如果需要异步运行代码,就会出现问题。CDI 注入空 bean,请求数据丢失。

这是示例:

@RequestScoped
public class CurrentUserService implements Serializable {
  public String token;
}

@Stateless
public class Service {
   @Inject
   private RestClient client;

    @Resource
    private ManagedExecutorService executorService;

    @Resource
    private ContextService contextService;

    @Asynchronous
    private <T> Future<T> getFuture(Supplier<T> supplier) {
        Callable<T> task = supplier::get;
        Callable<T> callable = contextService.createContextualProxy(task, Callable.class);
        return executorService.submit(callable);
    }

   public String getToken() throws Exception {
      return getFuture(client::getToken).get();
   }
}

@ApplicationScoped
public class RestClient { …
Run Code Online (Sandbox Code Playgroud)

java asynchronous cdi java-ee-7 wildfly

6
推荐指数
1
解决办法
4369
查看次数

标签 统计

asynchronous ×1

cdi ×1

java ×1

java-ee-7 ×1

wildfly ×1