我正在尝试使FelixDependencyManager正常工作。 我正在使用Karaf 3,我正在使用2个Bundles进行测试,一个用于提供配置信息,另一个用于实现ManagedService-Interface,具体取决于此信息。 所以一切都归结为3个类:
依赖包有2个类: 第一个是扩展使用Felix DependencyManager所需的DependencyActivatorBase类,并实现init方法,其中创建和配置组件:
public class ConfigAdminTester extends DependencyActivatorBase{
@Override
public void init(BundleContext context, DependencyManager manager)
throws Exception {
manager.add(createComponent()
.setImplementation(ConfigTestImpl.class)
.add(createConfigurationDependency()
.setPid("test.configadmintest.testconfig"))
.setCallbacks(null, "start", null, null)
);
System.out.println("ConfigAdminTester init finished");
}
@Override
public void destroy(BundleContext context, DependencyManager manager)
throws Exception {
}
}
捆绑包中的第二个类是ConfigAdmin-Service应该更新的类。它实现了ManagedService并具有updated-method,在部署bundle和更新配置时应该调用它:
public class ConfigTestImpl implements ManagedService{
String host;
String port;
int id;
String password;
public void start(){
System.out.println("Host, Port, Id, Password: " + host + ", " + port +", " + id + ", " + password);
}
@Override
public void updated(@SuppressWarnings("rawtypes") Dictionary properties) throws ConfigurationException {
if (properties != null) {
host= ((String)properties.get("host"));
if (host == null) {
throw new ConfigurationException("host", "must be specified");
}
port=((String)properties.get("port"));
if (port == null) {
throw new ConfigurationException("port", "must be specified");
}
id=((Integer)properties.get("id"));
password=((String)properties.get("password"));
System.out.println("Configuration in Bundle HttpServer was updated");
}
else {
System.out.println("Properties are null");
}
}
}
第二个bundle只有一个类,它实现了BundleActivator,获得了对ConfigAdmin-Service的引用,并创建了一个具有相同pid的新配置,而另一个bundle使用:
public class ConfigCreator implements BundleActivator{
public void start(BundleContext context) throws Exception {
@SuppressWarnings("rawtypes")
ServiceReference serviceRef = context.getServiceReference(ConfigurationAdmin.class.getName());
@SuppressWarnings("unchecked")
ConfigurationAdmin configAdmin = (ConfigurationAdmin) context.getService(serviceRef);
Configuration config = configAdmin.getConfiguration("test.configadmintest.testconfig", null);
Dictionary <String, Object> properties = new Hashtable <String, Object>();
properties.put("host", "test");
properties.put("port", "test");
properties.put("id", 1);
properties.put("password", "test!");
config.update(properties);
System.out.println("config updated");
}
现在的问题是永远不会调用更新的方法。我得到ConfigAdminTest init完成的输出并且Bundle被激活,但ConfigtestImpl中的回调方法从未被调用。如果我只声明没有配置依赖项的组件,一切正常,回调方法应该执行。配置已发布,可用(我使用config:list命令检查)并且有效,但似乎某种配置不适用于依赖包。 任何一个想法? 非常感谢。
答案 0 :(得分:1)
我将您提供的三个类复制到我的IDE中,并从中创建了两个类。我还包括一个实现ConfigurationAdmin和DependencyManager的包。当我开始做所有事情时,我立刻收到了消息:
Configuration in Bundle HttpServer was updated
所以我不确定这里出了什么问题,但你的代码似乎绝对正确!让我向您展示我的运行的完整输出,包括GoGo shell和DM shell命令:
ConfigAdminTester init finished
config updated
Configuration in Bundle HttpServer was updated
Host, Port, Id, Password: test, test, 1, test!
____________________________
Welcome to Apache Felix Gogo
g! lb
START LEVEL 1
ID|State |Level|Name
0|Active | 0|System Bundle (4.2.1)
1|Active | 1|Apache Felix Configuration Admin Service (1.8.0)
2|Active | 1|Apache Felix Dependency Manager (3.1.0)
3|Active | 1|Apache Felix Dependency Manager Shell (3.0.1)
4|Active | 1|Apache Felix Gogo Command (0.12.0)
5|Active | 1|Apache Felix Gogo Runtime (0.10.0)
6|Active | 1|Apache Felix Gogo Shell (0.10.0)
7|Active | 1|osgi.cmpn (4.3.1.201210102024)
8|Active | 1|xxx.stackoverflow.b1 (0.0.0)
9|Active | 1|xxx.stackoverflow.b2 (0.0.0)
g! dm
[8] xxx.stackoverflow.b1
class b1.ConfigTestImpl registered
test.configadmintest.testconfig configuration required available
g!
为了确保,我确实将代码放在两个不同的包中。您提供的示例不显示包或导入,但您不能在OSGi中使用默认(空)包。另一个错误可能是错误的导入。无论如何,如果你仍然卡住了,请告诉我,我很乐意提供完整的源代码。