首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java/OSGi将现有应用程序修改为OSGi服务

Java/OSGi将现有应用程序修改为OSGi服务
EN

Stack Overflow用户
提问于 2011-12-23 17:31:15
回答 2查看 387关注 0票数 3

我对OSGi和所有与之接近的东西都很陌生。

跳转到问题:我有一个服务器类,它保存了一个监听器列表,监听器可以通过一个方法(register(this))注册自己,该方法将监听器放到上面提到的列表中(当然,所有的监听器都实现了服务器类的监听器接口):

代码语言:javascript
复制
public void register(ServerListener listener) {
    if(theListeners == null)
        theListeners = new ArrayList<ServerListener>();

    theListeners.add(listener);
}

这就是ServerListener接口:

代码语言:javascript
复制
public interface ServerListener {
    public void update(JsonObject data);
}

现在,服务器类通过update(JsonObject object)方法不时地向侦听器提供新数据。

代码语言:javascript
复制
public void updateListeners() {
    new Thread() {
        public void run() {
            for(ServerListener l : theListeners) {
                l.update(jsonObject);
            }
        }
    }.start();
}

现在,我想将服务器类修改为OSGi框架(Knopflerfish)中的服务包。我对此一点也不熟悉。我想尝试只是为了好玩,但是我现在这样做是行不通的,监听器实际上不知道他们应该实现ServerListener接口。所以服务器不能通过接口注册它们。

问题是,我希望服务器推送数据,而不是客户端拉取(在我的理解中,这会更容易)。有人(理解我糟糕的解释)能给我指出正确的方向吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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接口使用包级依赖项应该允许服务器和侦听器包都可以导入它,而不管哪个包导出包。)

票数 6
EN

Stack Overflow用户

发布于 2011-12-23 19:26:00

这里有多个问题:

with

  • Interested

  • 您需要为其他对象公开服务(服务器类)才能注册with

  • Interested对象需要找到该服务才能注册自身

  • 其他对象需要实现特定的接口才能正常工作

通常,尝试将现有代码改造到OSGi中可能会很痛苦,除非您已经有了一个模块化的体系结构。

侦听器接口可以位于服务器捆绑包中,也可以将其放在单独的API/契约捆绑包中-两者都是有效的设计。

从您描述问题的方式来看,您似乎不知道在OSGi中可以有哪些不同类型的依赖项。

来自传统的Java开发,大多数开发人员都会从“我的依赖项基于JAR”开始--这不是最好的模型。

OSGi提供了包级依赖关系。这样,只要某个包提供了所需的包,您的包就不会关心哪个包/JAR提供了依赖项。

因此,如果您为侦听器接口使用了包级依赖项,则实现不需要关心它是来自服务器包还是契约/API包。

最后要注意的是,您的设计将服务器与侦听器紧密耦合在一起。如果侦听器失败,会发生什么情况?还是挂了?发布/订阅是这种类型通信的更好模型。

*编辑*

Holly的回答再次让我想起了白板模式--这绝对是个好主意。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8614310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档