【问题标题】:OSGi-DS: Optional reference to required service in DS Component, is not really dynamically updatableOSGi-DS:对 DS 组件中所需服务的可选引用,并不是真正可动态更新的
【发布时间】:2017-10-27 02:41:42
【问题描述】:

我想启动 DS 组件,它有很多服务是可选的,如果某些服务没有启动,那么这些组件没有被激活。所以我将这些可选服务的基数设置为可选,如果这些可选服务不可用,那么也可以激活目标组件。

但现在的问题是,如果我将任何这些可选服务的配置更改为有效,因此服务变得可用,但它不会反映在该目标组件中

@Component(immediate = true, configurationPolicy = ConfigurationPolicy.IGNORE,name="directory.comp")
public class DirectoryControllers
{
    @Reference(policy=ReferencePolicy.DYNAMIC)
        private volatile IZimbra zimbra;
        @Reference(policy=ReferencePolicy.DYNAMIC,cardinality=ReferenceCardinality.OPTIONAL)
        private volatile IOpenDJ opendj;
        @Reference(policy=ReferencePolicy.DYNAMIC,cardinality=ReferenceCardinality.OPTIONAL)
        private volatile IOpenIDM openidm;

        private ServletRegistration _registration;

        @Activate void activate(BundleContext bc) throws ServletException, NamespaceException
        {
             AppProvisioners provisioners=new AppProvisioners(zimbra,openidm,opendj);
            _registration = ServletRegistration.register(
                bc, _httpService, "/middleware",
                new ProvisioningController(_db,provisioners), 
                new UserEnrollmentController(_db,provisioners)
            );
        }
}

这里,zimbra 组件不是可选的,所以每当我更改配置时,它都会在 DirectoryControllers 组件中受到影响,但对于 openidm、opendj 组件来说并非如此,当然它是可选的,但在更改它们的配置有效时,它不受影响在 DirectoryControllers 组件中

我也尝试过绑定/解除绑定:

private volatile IOpenIDM openidm;

@Reference(name = "openidm.service", service = IOpenIDM.class, cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, unbind = "unbindOpenIDMService")
public void bindOpenIDMService(IOpenIDM openidm) {
        this.openidm = openidm;
}

public void unbindOpenIDMService(IOpenIDM openidm) {
        this.openidm = null;
}

我是否遗漏了导致此问题的任何内容?

谢谢。

【问题讨论】:

    标签: osgi apache-felix declarative-services osgi-ds


    【解决方案1】:

    我认为您需要设置policyOption 以引用ReferencePolicyOption.GREEDYpolicyOption 的默认值为 ReferencePolicyOption.RELUCTANT,当可选服务可用时,它不会重新激活组件。

    【讨论】:

    • 不,它没有帮助:@Reference(policy=ReferencePolicy.DYNAMIC,cardinality=ReferenceCardinality.OPTIONAL,policyOption=ReferencePolicyOption.GREEDY) private volatile IOpenIDM openIDM;
    • 感谢 BJ,它可以将参考设为静态:@Reference(policy=ReferencePolicy.STATIC...)
    【解决方案2】:

    我认为问题在于,因为这些组件是可选的,它们可能在激活时存在,也可能不存在,如果可选引用发生更改,它将不会被重新激活。

    我想说尝试在组件的绑定/取消绑定方法中实现注册代码,在这种情况下,这是您可以“注意到”更改的唯一地方。

    【讨论】:

    • 我正在使用那个但被删除了,使用它也不起作用。
    • 你的意思是这些方法根本不会被调用吗?这很奇怪。
    • 该方法在 DirectoryControllers 被激活时被调用,然后如果我们再次更改 openidm 的配置,那么 DirectoryControllers 的重新激活不会再次发生
    猜你喜欢
    • 2020-12-31
    • 2023-04-02
    • 2016-08-26
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 2012-10-01
    相关资源
    最近更新 更多