【问题标题】:How to use referenced DS OSGi services directly after they were set?设置后如何直接使用引用的 DS OSGi 服务?
【发布时间】:2015-01-15 12:01:52
【问题描述】:

几周前我开始使用 OSGi,并且有一个关于 DS 的问题。

假设我有 2 个捆绑包,捆绑包 A 和捆绑包 B。两者都通过 DS / BND 注释注册服务。

Bundle A 引用了Bundle B 的服务,实现了所需的set 和unset 函数。

@Reference(dynamic = true, optional = true)
    void setConnector(IDataBaseConnect connector) {
    this.connector = connector;
    doSomeStuff();
    sysout("Connector SET");  <---- NOT called when doSomeStuff runs into an error

}

doSomeStuff() 遇到错误时永远不会调用它

void unsetConnector(IDataBaseConnect connector){
   this.connector = null
}

如您所见,我希望引用是动态的和可选的,但是,如果连接器服务可用,我想在包 A 中做一些事情。

在我的例子中,Bundle B 有一些基本的数据库功能。 Bundle A 使用它从数据库中读取一些数据并将其缓存在一些 java 对象中。这些数据将被其他服务使用。

但是,我对这种方法有疑问。如果我的数据库服务引用设置为 Bundle A,我将在 setConnector 函数中启动我的数据库操作。只要一切顺利,我就没有问题。设置参考,数据变红,一切正常。但是如果 DB-Service 遇到异常(是的,它被捕获并处理),DS 似乎“忘记”了设置的引用,并且当我停止服务时它永远不会被删除。

我想我不应该调用 setConnector 函数中的任何函数,但如果是这样,我将如何实现一个仅在设置了新引用时才调用的方法?

【问题讨论】:

    标签: java osgi


    【解决方案1】:

    在极少数情况下应使用动态和可选引用。尽管我实现了很多组件,但到目前为止我既没有使用过动态引用也没有使用过可选引用。如果数据库连接还有其他问题:

    • 如果在运行两条 SQL 语句之间替换了 IDatabaseConnect 引用怎么办?
    • 如果调用者访问了单独的函数,IDatabaseConnect 被替换但全局事务是相同的,该怎么办?

    我建议您应该使用非动态、非可选的引用并将 doSomeStuff() 逻辑放入您的 activate 方法中。在这种情况下,您可以确保在您的业务逻辑运行时引用可用。

    【讨论】:

      【解决方案2】:

      如果doSomeStuff() 抛出异常,然后从绑定方法setConnector 传播出去,DS 将假定您的绑定方法已损坏并且您的组件无法接受绑定服务。然后 DS 会认为服务没有绑定到组件,因此不会调用服务的 unbind 方法。

      您需要在您的绑定方法中处理来自doSomeStuff() 的任何异常。例如:

      @Reference(dynamic = true, optional = true)
      void setConnector(IDataBaseConnect connector) {
        this.connector = connector;
        try {
          doSomeStuff();
        } catch (Exception e) {
           // handle e but don't let it propagate out of this bind method
        }
        sysout("Connector SET");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-01
        • 2016-05-15
        • 1970-01-01
        • 2013-06-14
        • 2014-05-15
        • 2021-04-03
        • 1970-01-01
        • 2017-10-27
        相关资源
        最近更新 更多