Karaf 中的分布式 OSGI - 消费者服务未启动
Distributed OSGI in Karaf -Consumer service not starting
我刚开始使用 Zookeeper 在 Karaff 中使用 DOSGi。我在 Karaf 实例中提供服务,在另一个实例中提供消费者。
服务端运作良好。发布后,我可以在安装了 Zookeeper 服务器的 Karaf 控制台中使用 log:display 命令查看它,我也可以通过浏览器访问 wsdl。
问题出在消费者方面。它应该在服务启动时写一条消息(下面的参考代码),但它从未发生过。
消费者代码:
package org.osgi.proyecto.dev.internal.consumer;
import org.osgi.proyecto.dev.consumer.IConsumer;
import org.osgi.proyecto.dev.sensor.ISensor;
public class Consumer implements IConsumer {
public void sensorActivo(ISensor sensor){
System.out.println("El sensor esta activo");
}
}
和component.xml:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" enabled="true" name="OSGI_Bundle-Consumer">
<implementation class="org.osgi.proyecto.dev.internal.consumer.Consumer"/>
<reference bind="sensorActivo" cardinality="1..1" interface="org.osgi.proyecto.dev.sensor.ISensor" name="ISensor" policy="dynamic"/>>
</scr:component>
清单:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: OSGI_Bundle-Consumer
Bundle-SymbolicName: OSGI_Bundle-Consumer2
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Service-Component: OSGI-INF/component.xml
Import-Package: org.osgi.framework;version="1.8.0",
org.osgi.proyecto.dev.sensor
我尝试强制使用消费者包(启动包),但它给了我这个错误:
Error starting bundle 137: Unable to resolve OSGI_Bundle-Consumer [137](R 137.1): missing requirement [OSGI_Bundle-Consumer [137](R 137.1)] osgi.wiring.package; (osgi.wiring.package=org.osgi.proyecto.dev.sensor) Unresolved requirements: [[OSGI_Bundle-Consumer [137](R 137.1)] osgi.wiring.package; (osgi.wiring.package=org.osgi.proyecto.dev.sensor)]
似乎存在依赖性错误。这是在消费者实例中安装传感器包(已安装状态)解决的。
如何避免在两个 Karaf 实例中安装相同的传感器包?
您应该将服务接口放在一个单独的包中。然后你可以在消费者端安装消费者和接口包,在服务器端安装服务和接口包。
我刚开始使用 Zookeeper 在 Karaff 中使用 DOSGi。我在 Karaf 实例中提供服务,在另一个实例中提供消费者。 服务端运作良好。发布后,我可以在安装了 Zookeeper 服务器的 Karaf 控制台中使用 log:display 命令查看它,我也可以通过浏览器访问 wsdl。 问题出在消费者方面。它应该在服务启动时写一条消息(下面的参考代码),但它从未发生过。 消费者代码:
package org.osgi.proyecto.dev.internal.consumer;
import org.osgi.proyecto.dev.consumer.IConsumer;
import org.osgi.proyecto.dev.sensor.ISensor;
public class Consumer implements IConsumer {
public void sensorActivo(ISensor sensor){
System.out.println("El sensor esta activo");
}
}
和component.xml:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" enabled="true" name="OSGI_Bundle-Consumer">
<implementation class="org.osgi.proyecto.dev.internal.consumer.Consumer"/>
<reference bind="sensorActivo" cardinality="1..1" interface="org.osgi.proyecto.dev.sensor.ISensor" name="ISensor" policy="dynamic"/>>
</scr:component>
清单:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: OSGI_Bundle-Consumer
Bundle-SymbolicName: OSGI_Bundle-Consumer2
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Service-Component: OSGI-INF/component.xml
Import-Package: org.osgi.framework;version="1.8.0",
org.osgi.proyecto.dev.sensor
我尝试强制使用消费者包(启动包),但它给了我这个错误:
Error starting bundle 137: Unable to resolve OSGI_Bundle-Consumer [137](R 137.1): missing requirement [OSGI_Bundle-Consumer [137](R 137.1)] osgi.wiring.package; (osgi.wiring.package=org.osgi.proyecto.dev.sensor) Unresolved requirements: [[OSGI_Bundle-Consumer [137](R 137.1)] osgi.wiring.package; (osgi.wiring.package=org.osgi.proyecto.dev.sensor)]
似乎存在依赖性错误。这是在消费者实例中安装传感器包(已安装状态)解决的。 如何避免在两个 Karaf 实例中安装相同的传感器包?
您应该将服务接口放在一个单独的包中。然后你可以在消费者端安装消费者和接口包,在服务器端安装服务和接口包。