4

我刚开始学习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。

4

1 回答 1

0

我会创建这样的服务:

@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,因此您可以根据选择器决定处理程序,您可以传递searchParam给此处理程序以生成搜索结果.

希望这可以帮助。

于 2013-11-15T13:46:12.750 回答