gpt4 book ai didi

java - 将 CDI 与 AsyncResponse 和 ExecutorService 结合使用

转载 作者:行者123 更新时间:2023-11-30 03:05:48 24 4
gpt4 key购买 nike

在将 CDI 添加到我们的应用程序之前,我创建了一个资源,该资源使用 @Suspished AsyncResponse 对象来实现聊天客户端的长轮询。我所做的是创建一个新的 newSingleThreadExecutor() 并向其提交一个使用 .wait(30000)Runnable > 在消息列表上,直到收到新消息已发送的通知。在该任务中,我使用了使用 @Context 获得的 HttpServletRequest,一切都运行良好。

然而,一旦我们将 CDI 添加到我们的应用程序中,即使没有将资源类设置为 bean(仅扫描带注释的 bean,并且我们没有给它任何范围注释),我也会收到一个运行时异常,即请求对象位于 内由于非法状态异常,无法访问可运行任务:

Method threw 'java.lang.IllegalStateException' exception. Cannot evaluate com.sun.proxy.$Proxy74.toString()

我不太确定为什么会发生这种情况,但我知道它与 CDI 相关,因为它引用了代理对象。一种猜测是,资源类本身已成为 CDI 作用域,并且无法从不同的线程访问该作用域?我在某处读到手动启动的线程不受管理,因此无法访问任何与作用域相关的对象。然而,在 CDI 实现之前,这是如何发挥作用的呢?

现在我认为我已经使用 jersey 的 @ManagedAsync 注释解决了这个问题(即释放线程服务请求 I/O 并让工作人员接管等待直到收到通知),该注释应该具有整个方法在内部 Jersey 执行器服务中运行。它是否正确?同样在这种情况下,是否需要 AsyncResponse 对象?

编辑:我还没有解决这个问题。 @ManagedAsync 在资源类未定义为 CDI bean 时起作用。创建@RequestScoped后,每当我尝试调用该方法时,都会收到以下异常

org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped

我认为这是因为请求可以在异步线程完成之前结束,这意味着所有作用域对象(如 HttpServletRequest)都将被销毁,因此我们将无法访问它们。有没有办法在 @RequestScoped bean 中使用 @ManagedAsync 并利用 @Context HttpServletRequest??

TL;博士:

  1. 如何访问手动启动的线程内的上下文资源?
  2. 为什么在实现 CDI 之前我就可以访问请求对象?
  3. 是否可以在 @RequestScoped cdi bean 中使用 @ManagedAsync

旧方法:

@GET
@Path("method")
public void method(@Context HttpServletRequest request, @Suspended AsyncResponse ar) {
//request object was accessible here
Executors.newSingleTHreadExecutor().submit(() -> {
//request object was also accessible here but lost access after implementing CDI.
Object o = foo.bar(request);
ar.resume(Response.ok(o).build());
});
}

当前非工作方法:

@GET
@Path("method")
@ManagedAsync
public void method(@Context HttpServletRequest request, @Suspended AsyncResponse ar) {
Object o = foo.bar(request);
ar.resume(Response.ok(o).build()); //Is there any point to this?
}

最佳答案

回答你的问题 - 不。您不能使用异步和请求作用域对象。 CDI 中缺乏异步支持 - 另请参阅 https://issues.jboss.org/browse/CDI-452

关于java - 将 CDI 与 AsyncResponse 和 ExecutorService 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34787286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com