【问题标题】:Could not run Configuration Admin on Eclipse无法在 Eclipse 上运行配置管理
【发布时间】:2014-10-03 06:01:50
【问题描述】:

我正在尝试使用配置管理将配置信息传递给捆绑包。 我正在使用基于 OSGI 的 Equinox 实现的声明性服务。首先,因为我找不到 Config Admin 的 Equinox 实现,所以我已经安装了 felix 实现,所以如果有人建议我在哪里可以获得 Equinox 版本,那就太好了。

我的主要问题是:我在运行程序时不断收到以下错误。似乎将一个空“配置”对象传递给我的更新方法。

osgi> !SESSION 2014-08-10 06:54:09.862 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.7.0_51
java.vendor=Oracle Corporation
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US
Command-line arguments:  -dev file:C:/Users/Desktop/OSGI/eclipseee/workspace1/.metadata/.plugins/org.eclipse.pde.core/configurator/dev.properties -os win32 -ws win32 -arch x86 -consoleLog -console

!ENTRY org.apache.felix.configadmin 4 0 2014-08-10 07:09:52.639
!MESSAGE Cannot use configuration de.services.logger.mtinylogger for   [org.osgi.service.cm.ManagedService, id=33, bundle=11/initial@reference:file:../workspace1/de.services.logger.mtinylogger/]: No visibility to configuration bound to initial@reference:file:../workspace1/de.init.configurator/

我制作了一个配置器包,用于创建配置对象,它的激活方法(由声明性服务调用)中的主要内容是:

    protected void activate(BundleContext bundleContext) throws IOException
    {
    //Retrieve a reference to the Configuration Admin service
    ServiceReference serviceReference = bundleContext.getServiceReference(ConfigurationAdmin.class.getName());  
    if(serviceReference != null)
    {
        ConfigurationAdmin configAdmin = (ConfigurationAdmin) bundleContext.getService(serviceReference);

        if(configAdmin != null)
        {
        Configuration configuration = configAdmin.getConfiguration("de.services.logger.mtinylogger");

        //Update configuration object
        Dictionary<String, Object> configProperties = new Hashtable<String, Object>();
        configProperties.put("port", 8080);

        configuration.update(configProperties);  
     }     

并且实现 managedServices 的包内的更新方法如下:

    @Override
@SuppressWarnings( { "rawtypes", "unchecked" } )
public void updated( Dictionary configuration ) throws ConfigurationException
{

    if( configuration != null ) {

        System.out.println(configuration.get("port"));
    }
    else
        System.out.println("configuration is equal to 'null ");
}

奇怪的是,当我停止并启动正在更新的包时,它总是显示'配置等于 null',就好像我还没有创建配置对象一样。我在这里想念什么?我花了将近 2 周的时间试图解决运行配置管理员的问题,但这占用了我太多时间。我真的很感激有关此的一些信息。发送!!

编辑: 这里我添加了注册 ManagedService 类的 'activate' 方法。

    protected void activate( BundleContext ctx )
{
    Dictionary< String, Object > properties = new Hashtable< String, Object >();

    //properties.put( Constants.SERVICE_PID, ctx.getBundle().getSymbolicName() );//optionally
    properties.put( Constants.SERVICE_PID, "de.services.logger.mtinylogger" );

    mService = ctx.registerService( ManagedService.class.getName(), this, properties );
}

【问题讨论】:

    标签: eclipse osgi apache-felix equinox declarative-services


    【解决方案1】:

    您的问题不在于您在 Equinox 上使用了 Felix 捆绑包。遵循该标准的 OSGi 包可用于任何框架实现。

    您的问题是您使用“错误”的方法来创建配置:

    configAdmin.getConfiguration("de.services.logger.mtinylogger");
    

    问题是这个方法会隐式地将配置“绑定”到这个包(配置器),因此这个配置真正用于的包将不再看到它。简而言之,用这个替换你的方法:

    configAdmin.getConfiguration("de.services.logger.mtinylogger", null);
    

    这样,配置不会被绑定,并且可以用于预期的目标。

    我对绑定的解释比较简短,OSGi 规范(免费提供)更详细地解决了它。

    【讨论】:

    • 我已按照您的建议添加了“null”,但我仍然得到完全相同的结果。如果它有帮助,我已经添加了我的激活类的代码,我在问题底部注册了 managedService。
    • 在尝试我的建议之前,您是否清除了捆绑缓存。如果没有,旧配置可能仍然存在。
    • 另外,您的激活器似乎依赖于在此捆绑包之前启动的配置管理。如果没有,显然不会设置任何配置。我建议您考虑使用其中一种依赖管理解决方案。作为 Apache Felix 依赖管理器的作者,我显然可以推荐一个,但 OSGi 规范也提供声明式服务,它也适用于您的代码。
    • 非常感谢它现在可以工作了。我不确定你对依赖管理的意思,但我已经在使用声明式服务。我仍然需要确保 Configuration Admin 的启动级别高于其他级别,以便首先启动它。这就是我现在遵循的方法。 (顺便说一句,我现在发布另一个问题,关于每当我从控制台启动 OSGI 时我在日志文件中遇到的错误,也许你也可以帮助我
    • 依赖于起始级别通常是一件非常危险的事情。我写了一篇博客来解释一下:planetmarrs.net/start-levels-in-osgi
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多