当前位置: 首页 > 知识库问答 >
问题:

如何从服务中注销OSGI/Blueprint服务?

蓬宾白
2023-03-14

在我的应用程序中,我有一个服务聊天原型客户端。该实现是一个tcp客户端,它在蓝图“init-method”中连接到远程服务器,并在“破坏方法”中断开连接。

我还有另一个捆绑包,它使用此ChatRogcolClient的连接从通道ChatChannel读取和发布消息。目前,我有一个xml文件,它创建了ChatProcolClient的bean,并创建了一个bean ChatChannel,其中注入了对创建的ChatProcolClient服务的引用。

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

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

如何做到这一点?

共有1个答案

马航
2023-03-14

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

    < li >连接“看门狗”beans。

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

  1. 聊天频道

现在,ChatChannel在Blueprint中配置了一个。

<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,这意味着当一个服务被注册或取消注册时,ChatChannel将被通知“onBind”和“onUnbind”方法。作为参数,他们将获得一个ChatProtocolClientInterface实例。

我不确定这是唯一的还是最好的解决方案,但它对我很有效。注意,对于这个示例xml,您还需要一个“chatProtocolClient”的setter目前我不使用blueprint设置的列表,我只使用onBind和onUnbind方法。

 类似资料:
  • 我找到了关于SSO的教程https://github.com/dsyer/spring-security-angular/tree/master/oauth2带配置 oauth2 authserver oauth2 ui 我只需要authserver进行一次登录验证,所以当用户已经通过身份验证并重定向到oauth2 ui应用程序时,服务器中的身份验证登录将过期。因此,当用户在oauth2 ui中注

  • 我目前正面临一个问题,即Eureka不能注销已注册的服务。我直接从git hub中提取了Eureka服务器示例,只做了一个更改,。我的application.yml如下所示: 到目前为止,一旦eureka客户端启动,它将在3秒内注册。它只是在服务突然终止时从不取消注册。在我终止服务后,Eureka仪表盘上写着: 紧急情况!EUREKA可能错误地声称实例已经出现,而它们不是.续约低于阈值,因此实例不

  • 我有一个服务(位于核心/服务内部)和服务实现(位于核心/服务/impl)。 我有一个扩展com的现有类(位于core/impl/view/components内部)。土砖cq。很明显。WCMUsePojo。使用getSlingScripterHelper,这个类可以访问我上面提到的服务。 我正在尝试在不使用WCMUsePojo的情况下访问该服务。我怎么做? 谢谢!

  • 我有一个桌面java应用程序,一个MySQL数据库和一个Spring启动服务器。用户通过桌面应用程序登录,并通过与服务器分离的数据库验证用户。 但是在它验证用户之后,我希望它将用户登录到服务器中,并且能够在用户退出程序时注销他们。 我已将应用程序连接到服务器,并能够发送GET和POST请求。我环顾了一下互联网和stack overflow,但是我看不到任何有帮助的答案或资源。我看到的唯一解决方案是

  • 我尝试的方法之一是在从MessageBusListener创建FlowListener实例的同时传递服务引用。然而,当参数化服务被停用和激活回来时,我认为OSGi服务将创建一个新的服务实例并绑定到MessageBusListener,但是FlowListener仍然会有一个过时的引用。 期待其他方法,可以满足我的要求。

  • 我们的javaspring应用程序(sp)允许客户端进行SSO集成。我们计划引入SLO(单点注销)作为安全审计要求的一部分。 我有一个疑问,如果我们的应用程序请求SLO到idp,那么特定客户的所有其他开放应用程序都会注销? 我们不想让客户的其他应用程序因我们的应用程序而注销。 请告知。如果SAML SLO请求只会影响请求注销的唯一服务提供商或客户SSO登录的所有服务提供商?