2010-07-18 45 views
1

在我当前的应用程序中,我想通过用户界面在运行时创建和配置osgi服务。我研究过OSGi Metatype规范,但它只支持简单的类型属性。动态创建和配置具有依赖关系的OSGi服务

所以我的问题是:是否有一个很好的理由有属性类型不支持,如其他OSGi服务,没有人知道一个已经存在的项目,做这样的事情?

UPDATE

为了进一步澄清我的问题:

什么我想要做的是创造,并根据需要通过软件的用户配置新的服务。如果将新的服务接口添加到系统中,这应该甚至可以工作。

让我们假设我有一个服务接口,用于发送通知

public interface NotificationService { 
    void notify(Notification n); 
} 

和用于发送通知到例如一个实现推特。通过Metatype规范,我可以编码Twitter服务需要用户名和密码的信息。这使我可以在运行时动态创建一个用于创建新的twitter通知服务的UI。

这适用于简单的数据类型,但元类型规范不处理依赖于其他服务。例如。可以说Notification具有文件附件,因此Twitter服务需要FileUpload服务来存储文件。

回答

0

可以使用的BundleContext#registerService(),但是当时的服务必须已初始化并准备运行始终注入新的服务。您可能会发现OSGi 4.2规范的新Blueprint服务 - 甚至动态服务,这种服务虽然比较老,但更为广泛。

最终,它取决于你想要做什么。当你在运行时说“创建”和“配置”osgi服务时,你是什么意思?

+0

我试图通过一个例子来阐明我的问题。我希望这有助于理解我想要做什么。 – crazymaik 2010-07-22 13:57:03

+0

举个例子。 Metatype服务不能帮助您,我认为这与您设想的用例不太匹配。你可以做的是拥有一个简单的字符串值属性,并提供特定文件上传服务的可用选项(当然,这些服务之间的硬编码依赖关系 - 如果您使用新的文件上传服务添加捆绑软件,会发生什么情况?)然后使用ServiceTracker获取具有自定义属性过滤器的服务。 我认为使用自己的元数据描述系统(使用注释!)会更好地为你工作。甚至是Eclipse注册表。 – 2010-07-22 15:17:27

+0

只是想知道这是否回答了crazymaik的原始问题。 – 2010-08-08 10:10:55

0

所以在你的例子中,你基本上说可以配置一个服务的实现,并且该配置可能会声明该实现需要另一个服务。基本上,你正在寻找一个系统,允许你在代码中声明一个实现的依赖关系,而不是静态的XML文件(就像声明式服务和大多数其他服务一样)。

一个解决问题的方法是使用Apache菲利克斯依赖管理。它有一个声明式Java API,允许您在运行时添加和删除依赖项。可以在这里找到一些基本的例子:http://felix.apache.org/site/apache-felix-dependency-manager-getting-started.html我建议你从源代码构建一个3.0.0-SNAPSHOT,因为这是迄今为止最新,最好,相当稳定的。

如果有帮助,我可以为你提供上面描述的例子中实际的示例代码。让我知道。