1

在我的应用程序中,我有一个 Service ChatProtocolClient。实现是一个 tcp 客户端,它在蓝图“init-method”中连接到远程服务器,并在“destroy-method”中断开连接。

我还有另一个包,它使用这个 ChatProtocolClient 的连接来读取和发布来自频道 ChatChannel 的消息。目前,我有一个 xml 文件,它创建了 ChatProtocolClient 的 bean,并创建了一个 bean ChatChannel,其中注入了对创建的 ChatProtocolClient 服务的引用。

但是如何处理与服务器的断开连接?我想告诉蓝图框架我的 ChatProtocolClient 实例现在无法使用,它应该取消注册该实例。

然后,Blueprint 最好自动调用所有依赖 bean(Blueprint 在其中注入此服务引用的 bean)上的销毁方法,并初始化一个新的 ChatProtocolClient bean 和所有因依赖失败而被销毁的 bean。

如何才能做到这一点?

4

1 回答 1

0

我找到了实现这一点的方法。在此解决方案中,重新创建所有相关服务实例的不是蓝图。它是这样的:

  1. 连接“看门狗”bean。

我没有创建“ChatProtocolClient”bean,而是从 xml 创建了 ConnectionWatchDog bean。在这些 bean 中注入 BundleContext 并从 .xml 文件设置连接属性。ConnectionWatchDog 然后尝试创建/连接 ChatProtocolClient 实例。如果连接成功,它会在 BundleContext 中注册一个服务(使用 bundleContext.registerService(..))。ServiceRegistration 保存在看门狗中。看门狗以设定的时间间隔测试连接(它运行自己的线程)。如果连接似乎失败;看门狗调用 serviceRegistration.unregister() 并清理客户端连接实例的剩余部分,并开始创建、连接和注册新 ChatProtocolClient 实例的整个过程。

  1. 聊天频道

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 方法。

于 2012-09-10T09:44:32.817 回答