当前位置: 首页 > 面试题库 >

我可以在其他捆绑软件发布的Blueprint服务之前注入代理吗?

呼延宪
2023-03-14
问题内容

我们正在使用Karaf和许多OSGI Blueprint services实现一个系统。

是否可以制作一种"BundleListener"类型的捆绑包,当其存在于OSGI容器中时,Blueprint services用代理来装饰我们的捆绑包,以便引用这些服务的捆绑包将改为调用代理?

(我想这可以通过以某种方式在Service
Registry中已经存在的服务之前添加代理来实现,也可以通过更改由引用包获得的引用来实现ServiceTracker.addingService


问题答案:

进行这些黑客攻击的标准方法是使用OSGi核心框架中的服务挂钩。挂钩允许您从一个或多个捆绑包的视图中删除服务。然后,您可以注册另一个服务来替代第一个服务,并且该服务不会从捆绑软件的视图中删除。

现有:

  +----------+              +----------+
  | register |------<|------| using    |
  +----------+              +----------+

代理的

  +----------+         hide +----------+
  | register |------<|-+--X-| using    |---|>---+ proxied
  +----------+         |    +----------+        |
                       |                        |
                       |    +----------+        |
                       +----|  manager |--------+
                            +----------+

尽管乍一看有些奇怪,但这种“从视图中删除”功能使您可以详细html" target="_blank">控制捆绑包所提供的服务,同时将总体复杂性降至最低。请参阅OSGi 5.0.0
Core中的第55章。第55.3.1节详细介绍了此代理。

<soapbox>

我称这些事情为骇客,因为这种方式的代理具有不良的运行时时间排序质量。如果您的经理捆绑包(用于隐藏和创建代理的捆绑包)的启动晚于使用该服务的捆绑包,则您会遇到麻烦,因为使用捆绑包暂时会暴露于非代理服务。

尽管有一些方法可以解决您开始订购此问题的方法,但是由于您现在具有未声明的(订购)依赖性,因此它们基本上都很烂。因此,最好确保使用代理的捆绑包具有特殊的依赖性,例如另一种服务类型或特殊的服务属性。由于依存关系是显式的,因此您不必再担心排序,时间依存关系已成为一个普通的服务依存关系问题,DS和OSGi中的其他服务管理器可以很好地解决此问题。

使用属性/其他类型代理

  +----------+              +----------+    proxied=true
  | register |              | using    |---|>---+ 
  +----------+              +----------+        |
        |                                       |
        |                   +----------+        |
        +-----------<|------|  manager |--------+
                            +----------+

您显然不想修改注册该服务的捆绑包或使用该服务的捆绑包,因为这将杀死可重用方面的整个想法。注册/使用捆绑软件的程序员应该很高兴不知道经理的方案。那么,如何在使用包中设置过滤器?

如果您使用声明式服务(DS),那么您很幸运!使用DS,您可以通过Configuration
Admin使用“目标”对服务参考设置过滤器。配置属性。因此,管理器捆绑包看到要代理的服务,它注册了具有特殊属性的第二个服务(例如’proxied =
true’)。然后,使用包通过Configuration Admin DS’目标引用属性(例如’(proxied = *)’)设置了过滤器。

</soapbox>



 类似资料:
  • 问题内容: 我正在尝试将服务注入如下指令: 但是,这给了我一个错误。有人可以调查一下代码,并告诉我是否做错了什么? 问题答案: 您可以对指令进行注入,看起来就像在其他地方一样。

  • 在我的应用程序中,我有一个服务聊天原型客户端。该实现是一个tcp客户端,它在蓝图“init-method”中连接到远程服务器,并在“破坏方法”中断开连接。 我还有另一个捆绑包,它使用此ChatRogcolClient的连接从通道ChatChannel读取和发布消息。目前,我有一个xml文件,它创建了ChatProcolClient的bean,并创建了一个bean ChatChannel,其中注入了

  • 我有一个java应用程序,并试图使用Azure运营模式来构建和部署。能够进行构建并在构建管道中发布工件。在发布管道中,我在每个阶段都有一个maven任务来分解特定于环境的构建,我可以这样做,但是我想把它作为一个类似于构建管道中的工件来发布。有没有任何任务可以做到这一点或任何其他替代方法?

  • 问题内容: 我对mvc4捆绑器有一个奇怪的问题,不包括扩展名为.min.js的文件 在我的BundleConfig类中,我声明 我认为 当它渲染时,它只会渲染 如果我将jquery.tmpl.min.js重命名为jquery.tmpl.js(并相应地更新捆绑软件中的路径),则两个脚本均正确呈现。 是否有一些配置设置导致其忽略“ .min.js”文件? 问题答案: 我最初发布的解决方案是有问题的(很

  • 我试图在我的中使用waet-for-it来等待mysql准备就绪,然后再创建依赖于它的服务。这是我的: 尝试使用docker compose运行此操作时出现以下错误: 开始集成tests_mysql_1错误 错误:对于集成-tests_mysql_1无法开启服务mysql:OCI运行时创建失败:container_linux.go:348:启动容器进程导致"exec: \"./ wait-for-