我刚开始学习osgi。需要创建应用程序,提供搜索服务。搜索服务依赖于平台(SearchServiceLinux、SearchServiceAndroid、SearchServiceXXX ...)。搜索服务还取决于用户输入的参数。参数是强制性的。
我的搜索服务使用者(然后用户设置参数我创建 SearchService 的新实例):
@Component(immediate = true, publicFactory = false)
@Provides(specifications = {TestConsumer.class})
@Instantiate
public class TestConsumer {
@Requires(filter = "(factory.name=package.ISearchService)")
private Factory mFactory;
private ComponentInstance mSearchComponentInstance;
...
public void userSetParameter(String pParameter) {
Properties lProperties = new Properties();
lProperties.put("instance.name", mFactory.getName() + "-" + pParameter);
lProperties.put("Parameter", pParameter);
if (mSearchComponentInstance != null) {
mSearchComponentInstance.dispose();
}
try {
mSearchComponentInstance = mFactory.createComponentInstance(lProperties);
} catch (UnacceptableConfiguration e) {
e.printStackTrace();
} catch (MissingHandlerException e) {
e.printStackTrace();
} catch (ConfigurationException e) {
e.printStackTrace();
}
}
我的搜索服务:
@Component
@Provides(specifications = {ISearchService.class}, strategy = "SINGLETON")
public class TestServise implements ISearchService{
@ServiceProperty(name = "Parameter", mandatory = true)
private int mParameter;
...
问题:1)这是程序的真实结构吗?在这种情况下,@ServiceProperty 或 @Property 更可取?需要用户输入参数的 OSGI 服务的最佳实践是什么?是否可以改革消费者的结构以使用:
@Requires (filter = "need filter for SearchService with Parameter=XXX or create this service")
ISearchService mSearchService;
2) 可以在这种情况下应用 iPOJO Event Admin Handlers 吗?
消费者:
@Publishes(name = "p1", topics = "userChangeParameter")
private Publisher mPublisher;
public void userChangeParameter(String pParameter) {
Properties lProperties = new Properties();
lProperties.put("Parameter", pParameter);
mPublisher.send(lProperties);
}
搜索服务:
@Subscriber(name = "s0", topics = "foo")
public void subscriber(Event pEvent) {
System.out.println("Subscriber : " + pEvent.getProperty("Parameter"));
}
3) 根据用户输入的参数创建服务的最佳结构是什么?也许通过使用 Apache Felix 子项目可以轻松解决问题?
我使用 apache felix 4.2.1。