我有一个spring上下文,它导出/META-INF/spring/spring-dao.xml
下定义的osgi服务,就像这样
<osgi:service ref="stockDao" interface="com.test.StockDao" />`
问题是:我想在我的蓝图中使用上面定义的服务,该服务在位置/OSGI-INF/blueprint/blueprint.xml
下定义。
<reference id="stockDao" interface="com.test.StockDao" />`
完成此配置后,我收到以下错误
java.lang.Exception: Can not resolve feature:
Unsatisfied requirement(s):
---------------------------
service:(service=com.test.StockDao)
Boohoo Database Test
at org.fusesource.fabric.agent.ObrResolver.resolve(ObrResolver.java:215)[67:org.fusesource.fabric.fabric-agent:7.2.0.redhat-024]
at org.fusesource.fabric.agent.DeploymentAgent.updateDeployment(DeploymentAgent.java:566)[67:org.fusesource.fabric.fabric-agent:7.2.0.redhat-024]
at org.fusesource.fabric.agent.DeploymentAgent.doUpdate(DeploymentAgent.java:432)[67:org.fusesource.fabric.fabric-agent:7.2.0.redhat-024]
at org.fusesource.fabric.agent.DeploymentAgent$1.run(DeploymentAgent.java:242)[67:org.fusesource.fabric.fabric-agent:7.2.0.redhat-024]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)[:1.6.0_43]
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)[:1.6.0_43]
at java.util.concurrent.FutureTask.run(FutureTask.java:138)[:1.6.0_43]
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)[:1.6.0_43]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)[:1.6.0_43]
at java.lang.Thread.run(Thread.java:662)[:1.6.0_43]
目前,在spring bean中导出的osgi服务只能由spring bean引用。另一方面,蓝图导出的服务只能由另一个蓝图引用。
如果我弄错了,请纠正我?如果可能,我该怎么做。
答案 0 :(得分:1)
我找到了解决方案。
捆绑'A' - 你的春天骆驼背景 - 应该有清单输入
Export-Service: com.test.StockDao
捆绑'B' - 您的蓝图骆驼背景 - 应该有清单输入
Import-Service: com.test.StockDao
即使spring在ServiceRegistry中注册了osgi服务,蓝图也会查看导出服务的清单条目。因此,在清单文件中创建一个条目可以解决这个问题。
这可以使用相应捆绑包中的maven bundle插件来完成
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.7</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Private-Package>${osgi.private.pkg}</Private-Package>
<Export-Package>${osgi.export.pkg}</Export-Package>
<DynamicImport-Package>*</DynamicImport-Package>
<Import-Package>${osgi.import.package}</Import-Package>
<Export-Service>${osgi.export.service}</Export-Service>
</instructions>
</configuration>
</plugin>
答案 1 :(得分:0)
这是错误的,在OSGi的服务注册表中注册的任何服务都可以通过std消费。 OSGi服务机制,蓝图,DS,iPOJO等.... 您只需要在Blueprint XML中引用相应的接口。 BTW。语法与Spring-OSGi xml几乎相同。