我对OSGi和所有与之接近的东西都很陌生。
跳转到问题:我有一个服务器类,它保存了一个监听器列表,监听器可以通过一个方法(register(this))注册自己,该方法将监听器放到上面提到的列表中(当然,所有的监听器都实现了服务器类的监听器接口):
public void register(ServerListener listener) {
if(theListeners == null)
theListeners = new ArrayList<ServerListener>();
theListeners.add(listener);
}这就是ServerListener接口:
public interface ServerListener {
public void update(JsonObject data);
}现在,服务器类通过update(JsonObject object)方法不时地向侦听器提供新数据。
public void updateListeners() {
new Thread() {
public void run() {
for(ServerListener l : theListeners) {
l.update(jsonObject);
}
}
}.start();
}现在,我想将服务器类修改为OSGi框架(Knopflerfish)中的服务包。我对此一点也不熟悉。我想尝试只是为了好玩,但是我现在这样做是行不通的,监听器实际上不知道他们应该实现ServerListener接口。所以服务器不能通过接口注册它们。
问题是,我希望服务器推送数据,而不是客户端拉取(在我的理解中,这会更容易)。有人(理解我糟糕的解释)能给我指出正确的方向吗?
发布于 2011-12-24 03:38:02
一种“以OSGi为中心”的方法是使用一种称为白板模式的模式,而不是像使用普通Java那样使用侦听器模式。您的侦听器不是向服务器类注册,而是向OSGi服务注册表注册为服务。这意味着框架负责处理注册、注销和离开的侦听器。
这里有一个关于白板模式的免费白皮书:http://www.osgi.org/wiki/uploads/Links/whiteboard.pdf,我们也在企业OSGi in Action (http://www.manning.com/cummins )的第5章中对它进行了讨论。
理解侦听器模式可能需要一段时间,因为提供服务的是您的侦听器,而使用服务的是您的“服务器”,这在一开始感觉是倒退的。但是,一旦你习惯了它,它就会工作得很好。您的服务器使用实现ServiceListener接口的所有服务,并根据需要向它们推送数据。
最好不要直接使用SCR来注册和使用服务-使用声明性服务( OSGi )或蓝图来注入OSGi服务的依赖项。它们允许您通过XML元数据文件或注释注册和使用服务。
(正如其他人所建议的那样,对ServerListener接口使用包级依赖项应该允许服务器和侦听器包都可以导入它,而不管哪个包导出包。)
发布于 2011-12-23 19:26:00
这里有多个问题:
with
通常,尝试将现有代码改造到OSGi中可能会很痛苦,除非您已经有了一个模块化的体系结构。
侦听器接口可以位于服务器捆绑包中,也可以将其放在单独的API/契约捆绑包中-两者都是有效的设计。
从您描述问题的方式来看,您似乎不知道在OSGi中可以有哪些不同类型的依赖项。
来自传统的Java开发,大多数开发人员都会从“我的依赖项基于JAR”开始--这不是最好的模型。
OSGi提供了包级依赖关系。这样,只要某个包提供了所需的包,您的包就不会关心哪个包/JAR提供了依赖项。
因此,如果您为侦听器接口使用了包级依赖项,则实现不需要关心它是来自服务器包还是契约/API包。
最后要注意的是,您的设计将服务器与侦听器紧密耦合在一起。如果侦听器失败,会发生什么情况?还是挂了?发布/订阅是这种类型通信的更好模型。
*编辑*
Holly的回答再次让我想起了白板模式--这绝对是个好主意。
https://stackoverflow.com/questions/8614310
复制相似问题