java - OSGI:声明性服务在捆绑启动后可用

标签 java osgi apache-felix declarative-services

问题很简单,但我找不到答案 - 我可以声明 bundle A 中的所有声明性服务在 bundle A 启动后都可用吗?例如,

bundle=context.installBundle("file:bundleA-1.0.0.jar");
bundle.start();
//In this point are declarative services of bundle A 100% available?

附注我使用apache felix,但我认为它必须在规范中定义,而不是在实现中定义。

编辑:
我假设 DS 运行时正在运行,配置存在并且所有强制引用都存在。

最佳答案

你的问题的答案很简单:不。无论是基于时间还是顺序,都无法保证 OSGi 中的可用性。唯一的保证在服务事件中指定。

在代码中做出时序/顺序假设是造成复杂性的最大原因之一,因为它们总是以最模糊的方式被违反。

DS 使得编写能够在服务依赖项出现和消失时对其做出正确 react 的代码变得非常简单。确保获得与服务相关的保证非常复杂,如果您开始假设调用方法后某些东西应该可用,那么您就会破坏所有这些值(value)。

在您的示例中,只需依赖您需要的服务。如果该服务可用,那么您确定所有初始化都已完成。

如果您坚持服务依赖关系,OSGi 中的生活将相当简单且非常健壮。

更新了问题后的示例

非 OSGi 端:

 systemBundleContext = ... create framework
 systemBundleContext.registerService( 
    BundleActivator.class, 
    new BundleActivator() {
        public void start(BundleContext c) {
           // start non-OSGi code
        }
        public void stop(BundleContext c) {
           // stop non-OSGi code
        }
     },
     null );

DS 组件:

 @Component
 public class Initiator {
    @Reference
    BundleActivator ba;

    @Referenc
    MyService myService;

    @Activate void activate(BundleContext context) throws Exception {
      ba.start(context);
    }

    @Deactivate void deactivate(BundleContext context) throws Exception {
      ba.stop(context);
    }
 }      

关于java - OSGI:声明性服务在捆绑启动后可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38815998/

相关文章:

java - 如何在 Equinox OSGI 服务器中定义默认欢迎页面?

java - java osgi中拦截方法调用

java - 运行时 OSGi 依赖项中的 POJO 忽略导入的 Jackson 注释

java - 如何连接osgi框架(felix)

Java,扩展类或实例化时出现 StackOverflowError

java - 在 Java 中将 GMT 转换为 IST?

java - 删除布局中按/触摸时的深色高光

java - OSGi bundle - 获取 DataSourcePool 以在 Adob​​e CQ5 中的 servlet 中使用

java - OSGI DS : properties -> ParseException

java - 将 java 代码转换为字符串时出错 - 从函数传输结果