我找到了实现这一点的方法。在此解决方案中,重新创建所有相关服务实例的不是蓝图。它是这样的:
- 连接“看门狗”bean。
我没有创建“ChatProtocolClient”bean,而是从 xml 创建了 ConnectionWatchDog bean。在这些 bean 中注入 BundleContext 并从 .xml 文件设置连接属性。ConnectionWatchDog 然后尝试创建/连接 ChatProtocolClient 实例。如果连接成功,它会在 BundleContext 中注册一个服务(使用 bundleContext.registerService(..))。ServiceRegistration 保存在看门狗中。看门狗以设定的时间间隔测试连接(它运行自己的线程)。如果连接似乎失败;看门狗调用 serviceRegistration.unregister() 并清理客户端连接实例的剩余部分,并开始创建、连接和注册新 ChatProtocolClient 实例的整个过程。
- 聊天频道
ChatChannel 现在在蓝图中配置为 . xml 看起来像这样:
<blueprint xmlns=...>
<reference-list id="chat-connection" member-type="service-object" interface="com.example.ChatProtocolClientInterface">
<reference-listener bind-method="onBind" unbind-method="onUnbind" ref="Channel1"/>
</reference-list>
<bean id="Channel1" class="ChatChannel" init-method="startUp">
<property name="chatProtocolClient" ref="chat-connection">
... some other properties ...
</bean>
</blueprint>
member-type 设置为 service-object,表示当服务注册或注销时,将通过“onBind”和“onUnbind”方法通知 ChatChannel。作为参数,他们将获得一个 ChatProtocolClientInterface 实例。
我不确定这是否是唯一或最好的解决方案,但它对我有用。请注意,对于此示例 xml,您还需要一个用于“chatProtocolClient”的设置器;目前我不使用蓝图设置的列表,我只使用 onBind 和 onUnbind 方法。