gpt4 book ai didi

java - OSGi/Equinox、声明式服务和延迟加载

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:28:31 24 4
gpt4 key购买 nike

我正在尝试使用声明式服务创建一个服务包,为另一个包提供功能。但是,我希望我的服务提供商包在需要时才启动。让我描述一下我的条件。

有两个包:

-com.example.serviceprovider

-com.example.serviceconsumer

Service Provider bundle 使用声明式服务提供如下服务:

<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true"     immediate="true" name="samplerunnable1">
<implementation class="com.example.serviceprovider.SampleRunnable"/>
<service>
<provide interface="java.lang.Runnable"/>
</service>

服务消费者引用提供的服务如下:

<reference name="SampleRunnable"
interface="java.lang.Runnable"
bind="setRunnable"
unbind="unsetRunnable"
cardinality="1..n"
policy="dynamic"/>

当这两个 bundle 在启动时都处于“ACTIVE”状态时,服务消费者可以毫无问题地与服务提供者声明的服务进行通信。当我尝试让服务提供商以懒惰的方式启动时,就会出现问题。

将服务提供者设置为延迟加载后,这是我在 OSGi 控制台中得到的:

osgi> ss
"Framework is launched."
id State Bundle
15 STARTING com.example.serviceconsumer_1.0.0.X
16 RESOLVED com.example.serviceprovider_1.0.0.X

我希望看到的是,即使 bundle 16 只是“已解决”,它至少会注​​册服务。但是当我调用“bundle”命令时,它显示“没有注册服务”。

osgi> bundle 16
com.example.serviceprovider_1.0.0.X [17]
Id=17, Status=RESOLVED Data Root=C:\apache\apache-tomcat-.0.40\work\Catalina\localhost\examplesX\eclipse\configuration\org.eclipse.osgi\bundles\17\data
"No registered services."
No services in use.
No exported packages
Imported packages
org.osgi.framework; version="1.7.0"<org.eclipse.osgi_3.8.0.v20120529-1548 [0]>
No fragment bundles
Named class space
com.example.serivceprovider; bundle-version="1.0.0.X"[provided]
No required bundles

也许我错过了延迟加载包和服务注册的基本概念。如果 bundle 处于“已解决”状态,它不应该连接所有“电线”吗? (即,有一个类加载器、已解析的导入和导出依赖项以及已注册的服务。)如果服务消费者尝试访问该服务,该 bundle 是否应该转换为“ACTIVE”状态?我在这里缺少什么?

最佳答案

处于 RESOLVED 状态的 Bundle 不能提供服务,它们将被 Declarative Services 忽略。你通常应该在启动时启动所有的包,即使你想要延迟加载行为。关键是要使 bundle 的激活变得便宜(或免费!),并且仅在需要时为组件的初始化付费。

默认情况下,DS 已经负责延迟激活。您无需启用或更改任何内容即可实现此目的。本质上,DS 会在注册表中发布服务条目,但它不会实际实例化您的组件(甚至加载其类),直到某些客户端尝试使用该服务。

此外,因为 DS 在需要时才加载类,OSGi 甚至不需要为 bundle 创建 ClassLoader,只要您的 bundle 没有 BundleActivator。

重申一下,您不应该试图让您的包保持在已解决状态。这样的 bundle 只能导出静态代码和资源,但不能“做”任何事情,也不能参与服务注册。

关于java - OSGi/Equinox、声明式服务和延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16987681/

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