gpt4 book ai didi

java - 创建需要用户参数的 OSGI 服务

转载 作者:搜寻专家 更新时间:2023-11-01 03:52:59 24 4
gpt4 key购买 nike

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

最佳答案

我会创建这样的服务:

@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

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

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

希望这对您有所帮助。

关于java - 创建需要用户参数的 OSGI 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19814711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com