【问题标题】:OSGI component not activated after bundle activated捆绑激活后 OSGI 组件未激活
【发布时间】:2019-08-31 15:50:41
【问题描述】:

OSGI 新手。

我在 OSGI 中使用 spring-boot。在 bundle activator 中,spring-boot 应用程序启动成功。我有一个组件类如下

@Service // spring-boot annotation
@Component(immediate = true) // osgi annotation
public class Test {
    @Activate
    public void activate() {
        System.out.println("osgi component activated");
    }

    @Reference
    public void set(ServiceComponentXXX a) {
        System.out.println("reference got");
}

Test 类只绑定服务,不被任何其他服务绑定。 ServiceComponnetXXX 类来自其他捆绑包。 activate 和 set 方法永远不会执行。

删除spring-boot注解@Service后,代码运行正常。那么问题来了,一个类可以同时是 spring-boot 组件和 OSGI 组件吗?

【问题讨论】:

    标签: spring-boot osgi


    【解决方案1】:

    让一个类两者兼而有之是没有意义的。 Spring Boot 和声明式服务的生命周期是完全分开的。因此,在最好的情况下,您最终会得到该类的两个实例——一个由 Spring Boot 填充,另一个由声明性服务填充——但它更有可能只是不起作用。

    我建议你决定是否要使用 OSGi。如果是,那么只需使用声明性服务而不是 spring boot。通常决定一个注入框架。在 OSGi 中,您可以通过捆绑拥有一个注入框架,但它们必须与 OSGi 兼容。 Spring boot 并不是真正的 OSGi 兼容。

    【讨论】:

    • 是否有任何解决方案可以让 OSGI 组件在同一个 OSGI 包中使用 spring-boot 组件,反之亦然?背景是1)有一个用OSGI实现的传统桌面应用程序,2)我需要为那个应用程序提供一个Web界面,3)目前的解决方案是将spring-boot嵌入到OSGI包中,从服务中获取数据-组件并通过spring-boot响应http请求,从服务组件检测桌面应用程序状态变化,并通过RabbitMQ通知Web客户端状态变化
    • spring boot和OSGi没有很好的集成方式。我建议依靠 OSGi 的 http 解决方案。有 http 白板规范和 jax-rs 白板规范。因此,如果您想提供或调用休息服务,这可以在纯 OSGi 包中完成。 Rabbit mq 也支持 OSGi。所以我的建议是使用声明式服务作为依赖注入和上述规范实现和rabbitmq驱动程序进行通信。
    • 旧版应用使用 java7 运行;用于 OSGI 的 rabbitmq 依赖于 java8;与 spring-boot 相比,OSGI 的 http 需要更多的编码。
    猜你喜欢
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 2019-05-08
    • 2014-03-02
    相关资源
    最近更新 更多