2012-08-16 104 views
1

在我的应用程序中,我有一个Service ChatProtocolClient。该实现是一个tcp客户端,它连接到蓝图“init-method”中的远程服务器,并在“destroy-method”中断开连接。如何从服务中取消注册OSGI/Blueprint服务?

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

但我该如何处理服务器的断开连接?我想告诉Blueprint框架,我的ChatProtocolClient实例现在不可用,它应该取消注册这个实例。然后

优选的蓝图会自动调用所有相关的豆类(豆在蓝图注入该服务引用)的破坏,方法和初始化一个新ChatProtocolClient豆和被摧毁,因为依赖所有失败的豆子。

这怎么办?

回答

0

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

  1. 连接“看门狗”豆。

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

  1. 的ChatChannel

的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> 

的构件型设置为服务对象时,是指当一个服务被注册或未注册时,ChatChannel将与“onBind”和“onUnbind”的方法通知。作为参数,他们将获得一个ChatProtocolClientInterface实例。

我不确定这是唯一的还是最好的解决方案,但它适用于我。请注意,在这个xml例子中,你还需要一个“chatProtocolClient”的setter;目前我不使用blueprint设置的列表,而只使用onBind和onUnbind方法。