gpt4 book ai didi

java - HK2:从子定位器访问 RunLevel 范围的服务

转载 作者:行者123 更新时间:2023-12-02 09:24:16 25 4
gpt4 key购买 nike

我在 Java SE 应用程序中使用 Jersey。 HK2 为整个应用程序提供依赖注入(inject)。 HK2 RunLevel服务在应用程序服务定位器中注册,该定位器是 Jerseys 服务定位器的父级。

+ application locator
|\- RunLevel capabilities
| - MyCustomService, @RunLevel(value=1)
\
+ jersey locator
\- jersey resource class
\ @Inject MyCustomService

我的问题是我无法从 Jersey 内访问运行级别范围的服务。当 - 在上面的示例中 - 打开 Jersey 资源时,MyCustomService 的注入(inject)失败:

java.lang.IllegalStateException: Could not find an active context for org.glassfish.hk2.runlevel.RunLevel

原因似乎是 HK2 RunLevel 功能背后的服务具有可见性 LOCAL : Jersey 定位器无法通过其父定位器访问它们。请参阅here .

问题:

  • 为什么运行级别功能的服务可见性受到限制?
  • 我可以采取什么措施来克服这个问题?

更新

为了给出问题的背景,我使用“System-V”样式的运行级别。

  • Java SE 应用程序启动。默认初始运行级别为-1,目标运行级别为3。在此过程中,必须成功通过不同的阶段才能继续。
  • 在运行级别 1,建立与相关外部应用程序的连接(数据库、内存缓存、消息代理等)。
  • 在运行级别 2 上,启动用于后台处理和 HTTP 服务(运行 Jersey )的 ExecutorServices。 Jersey 拒绝此级别的所有传入请求。
  • 在运行级别 3,MessageListeners 附加到代理,向后台执行程序提供请求。 Jersey 接受并处理 HTTP 请求。

这个概念允许对可用性和长时间运行的请求进行精细控制。关闭时,应用程序将处于运行级别 2,直到完成先前接受的 HTTP 请求并完成排队的后台任务。但是,不接受新的任务/请求。然后,运行级别1、0、-1,退出。

最佳答案

解决方案是尊重 DescriptorVisibility#LOCAL 并仅从管理它们的服务定位器注入(inject)依赖于 RunLevelContext 的服务。。 p>

有点麻烦:

  • 从 Jersey 资源中,按名称获取具有运行级别功能的服务定位器
  • 获取显式注入(inject)的运行级别范围的服务

    ServiceLocator applicationLocator = ServiceLocatorFactory.getInstance().find("applicationLocator");
    MyCustomService mcs = applicationLocator.getService(MyCustomService.class);
    mcs.doSomething();

为了减少忘记这样做的危险,而只是将 MyCustomService 注入(inject) Jersey 资源,我现在已将我的运行级别范围的服务标记为DescriptorVisibility#LOCAL 的 >。这样它们就不能被 Jersey 定位器注入(inject)。

关于java - HK2:从子定位器访问 RunLevel 范围的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58445967/

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