【发布时间】:2019-10-18 07:31:08
【问题描述】:
我在 Java SE 应用程序中使用 Jersey。 HK2 为整个应用程序提供依赖注入。 HK2 RunLevel 服务注册在应用服务定位器中,它是 Jerseys 服务定位器的父代。
+ application locator
|\- RunLevel capabilities
| - MyCustomService, @RunLevel(value=1)
\
+ jersey locator
\- jersey resource class
\ @Inject MyCustomService
我的问题是我无法从 Jersey 访问运行级别范围的服务。当 - 在上面的示例中 - 打开球衣资源时,MyCustomService 的注入失败:
java.lang.IllegalStateException: 找不到 org.glassfish.hk2.runlevel.RunLevel 的活动上下文
原因似乎是 HK2 RunLevel 功能背后的服务具有可见性LOCAL:球衣定位器无法通过其父定位器访问它们。见here。
问题:
- 为什么运行级别功能的服务的可见性受到限制?
- 我能做些什么来克服这个问题?
更新
为了给出问题的上下文,我使用的是“System-V”风格的运行级别。
- Java SE 应用程序启动。默认初始运行级别为 -1,目标运行级别为 3。在此过程中,必须成功通过不同阶段才能继续。
- 在运行级别 1 中,建立了与相关外部应用程序(数据库、内存缓存、消息代理等)的连接。
- 在运行级别 2,
ExecutorServices用于后台处理和 HTTP 服务(运行球衣)。 Jersey 拒绝此级别的所有传入请求。 - 在运行级别 3,
MessageListeners附加到代理,将请求提供给后台执行程序。 Jersey 接受并处理 HTTP 请求。
此概念允许对可用性和长时间运行的请求进行精细控制。关闭时,应用程序将处于运行级别 2,直到满足先前接受的 HTTP 请求并完成排队的后台任务。但是,不接受新的任务/请求。然后,运行级别 1、0、-1,退出。
【问题讨论】:
-
是的,我的意思是,这正是运行级服务的设计方式/目的。我们在 GlassFish 和 WebLogic 中做的事情几乎完全相同(我们有更多关卡,但想法相同)