【问题标题】:Create OSGI Service which requires user parameter创建需要用户参数的 OSGI 服务
【发布时间】:2013-11-17 20:17:14
【问题描述】:

我刚开始学习osgi。需要创建应用程序,提供搜索服务。搜索服务依赖于平台(SearchServiceLinux、SearchServiceAndroid、SearchServiceXXX ...)。搜索服务还取决于用户输入的参数。参数为必填项。

我的搜索服务消费者(然后用户设置参数 i 创建新的 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。

【问题讨论】:

    标签: java service osgi apache-felix


    【解决方案1】:

    我会创建这样的服务:

    @Component(
            metatype = false)
    @SlingServlet(
            paths = { "/bin/test/service" }, methods = { "POST" }, extensions = { "json" },
            selectors = { "selector1", "selector2"}, generateComponent = false)
    public class TestConsumer extends SlingAllMethodsServlet {
       //inject all the services here like SearchServiceLinux, etc. 
       @Reference 
       private SearchServiceLinux searchServiceLinux;
    }
    

    你可以像这样使用这个服务

    http://localhost/bin/test/service.seletor1.html
    

    现在基于选择器,您可以决定哪个类将处理请求意味着您可以决定选择器1​​ 将由X 类处理,选择器2 将由Y 类处理

    如果参数是强制性的,那么我建议您在此服务上仅接受 POST,并确保您在 POST 中提供搜索参数,例如参数名称为 searchParam,因此您可以根据选择器决定处理程序,并且可以传递 @ 987654324@ 到此处理程序以生成搜索结果。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-12-29
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 2013-11-12
      相关资源
      最近更新 更多