无法在Eclipse上运行Configuration Admin

Exc*_*ite 1 eclipse osgi declarative-services equinox apache-felix

我正在尝试使用Configuration Admin将配置信息传递给捆绑包.我正在使用基于Equinox OSGI实现的声明式服务.首先,因为我找不到Config Admin的Equinox实现我已经安装了felix实现,所以如果有人建议我可以获得equinox版本,那将会很棒.

我的主要问题是:当我运行程序时,我一直收到以下错误.看起来像一个null'配置'对象被传递给我的更新方法.

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/
Run Code Online (Sandbox Code Playgroud)

我创建了一个configurator包来创建配置对象,其中的主要内容是activate方法(由声明性服务调用)是:

    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);  
     }     
Run Code Online (Sandbox Code Playgroud)

实现managedServices的bundle中的更新方法如下:

    @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 ");
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当我停止并启动更新的包时,它总是显示"配置等于null",就好像我还没有创建配置对象一样.我在这里失踪了什么?我花了差不多两个星期的时间来尝试解决运行配置管理员的问题,但是我的时间太多了.我真的很感激有关这方面的一些信息.TXS!

编辑:这里我添加了注册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 );
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ans 6

您的问题不在于您在Equinox上使用Felix软件包.遵循该标准的OSGi包可用于任何框架实现.

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

configAdmin.getConfiguration("de.services.logger.mtinylogger");
Run Code Online (Sandbox Code Playgroud)

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

configAdmin.getConfiguration("de.services.logger.mtinylogger", null);
Run Code Online (Sandbox Code Playgroud)

这样,配置不受约束,并且可用于预期目标.

我对绑定的解释相对较短,OSGi规范(免费提供)更详细地解决了这个问题.