标签: declarative-services

如何在 WAS 8.0 中部署的我自己的 OSGi 应用程序中启动特定包?

我有一个相当复杂的 OSGi 应用程序,它使用声明式服务,并且设计为部署在 Equinox 中。现在的任务是使该应用程序可以部署在 WAS 8 中。

第一次尝试非常务实:我部署了一个 EAR,它的启动基本上与 Equinox 相同,经过一些 WAS 类加载策略调整后,它已经起作用了。

现在我想更进一步:摆脱 Equinox 运行时并在 WAS 8 中“本地”部署我的捆绑包。因此,我编写了一个 EBA,其中包含我的业务捆绑包、它们的依赖项和 Equinox DS 运行时。EBA 作为资产部署并集成到 BLA 中。应用程序甚至已启动并运行,但组件尚未初始化。

要点是,必须在自己的业务包之前启动 equinox.ds(更新:不是必须的,下面讨论)才能使 DS 完成其工作。但是我如何告诉捆绑包在已部署的 EBA 中首先启动哪个捆绑包呢?我需要 Equinox 的 config.ini 文件的一些模拟。

我知道我可以使用本机支持的蓝图重新连接我的组件,但坦率地说,这是我最不想做的事情。应该可以让 Equinox DS 工作,不是吗?

另一个问题是:如何为自己部署在 WAS 8 下的应用程序获取 OSGi 控制台?我想控制我的捆绑包,但似乎无法从管理控制台做到这一点。

更新

感谢 BJ 和 Neil(下面的讨论),问题归结为“如何在 WAS 8.0 中部署的我自己的 OSGi 应用程序中启动特定的包?”

osgi declarative-services equinox websphere-8 osgi-bundle

5
推荐指数
1
解决办法
213
查看次数

OSGi UI应用程序中的最佳实践

我对OSGi世界有些新意.还有一些概念让我望而却步.

我正在尝试使用Swing,Equinox和Declarative Services创建一个图形OSGi应用程序.目标是简化应用程序的插件和扩展的创建.

我偶然发现了一个设计问题,因为我从头开始这样做,所以我希望尽可能使用所有最佳实践.

我有一个包含API的包,只公开要实现为服务的接口.

public class SomeClass {
}

public interface Manager<T> {
     void add(T obj);
     void update(T obj);
     void remove(T obj);
}

public interface SomeClassManager extends Manager<SomeClass> {
}

public interface Listener<T> {
    void added(T obj);
    void updated(T obj);
    void removed(T obj);
}

public interface SomeClassListener extends Listener<SomeClass> {
}
Run Code Online (Sandbox Code Playgroud)

假设我有一个bundle(Core),它提供的服务是某些类型对象的管理器(它基本上包含一个内部List并添加,删除和更新它).

public class SomeClassCoreManager implements SomeClassManager {

      private ArrayList<SomeClass> list = new ArrayList<SomeClass>();
      private ArrayList<SomeListener> listeners = new ArrayList<SomeListener>();

      protected void bindListener(SomeListener listener) {
            listeners.add(listener); 
      } …
Run Code Online (Sandbox Code Playgroud)

java swing osgi declarative-services equinox

5
推荐指数
1
解决办法
1236
查看次数

JPA与OSGi DS示例

我想弄清楚的一个实例JPA(含学生实体的一个例子,有名称和类)使用Eclipselink & Derby.我能够在Java EE中完成它但我无法想出一种方法来简单地OSGi使用它Declarative Services.

有人可以分享任何使用这些例子的信息JPA with OSGi DS吗?

我经历过的一些例子都在这里,但这些例子使用getReference或者getTracker我不想使用它们.

谢谢.

osgi jpa declarative-services eclipselink

5
推荐指数
1
解决办法
1399
查看次数

OSGi声明性服务 - 在bind方法中获取ServiceReference

我正在使用Eclipse 3.7与Eclipse Gemini JPA/DBAccess.我实现了一个引用EntityManagerBuilderFactory的声明式ServiceComponent.bind方法如下所示:

public void bindEntityManagerFactoryBuilder(EntityManagerFactoryBuilder emfBuilder) {
    emfFactoryBuilders.add(emfBuilder);
}
Run Code Online (Sandbox Code Playgroud)

但是我需要ServiceReference来获取此服务的属性,例如:

    ServiceReference ref = ...
    String unitName = (String)ref.getProperty(EntityManagerFactoryBuilder.JPA_UNIT_NAME);
Run Code Online (Sandbox Code Playgroud)

我是否必须在ServiceRegistry中搜索此ServiceReference,还是有更优雅的方法?

欢呼,Muki

eclipse osgi bind declarative-services service-reference

4
推荐指数
1
解决办法
1650
查看次数

在分离服务组件时如何正确处理OSGi中的日志记录?

我正在使用OSGi和声明性服务(DS),目前正在考虑如何正确处理日志记录。由于无论如何我都在使用DS,因此使用OSGi服务纲要中指定的LogService作为强制性服务参考似乎很自然。我已经在ekkes角落和nogunners的博客上阅读了很多网络文章,但是我仍然不清楚:

如何区分不同的服务组件(或使用分解因子的组件时不同的服务组件实例)?

如果我看一下使用Logback的LogListener的nogunners实现,他将使用bundlecontext的Bundle-Id来区分它们。好的,到目前为止。但是,我将如何区分服务组件?LogService对象自然包含对BundleContext的引用,但是(看着LogService接口)ServiceReference必须由用户(实际记录某些内容的用户)本身提供吗?这对我来说似乎很脆弱。为什么框架在交付BundleContext时不能交付它?

当我在讨论它时,为什么OSGi规范使用详细logger.log(LogService.LOG_INFO,...)而不是准标准logger.info(...), logger.warn(..)等?是否有某些特定原因?

java logging components osgi declarative-services

4
推荐指数
1
解决办法
4834
查看次数

以编程方式添加声明性服务

是否可以使用某种api添加声明性服务?

一点背景:

我有一个基于动态脚本的服务器应用程序(可以随时添加,编辑或删除它们).这些脚本依赖于OSGi服务,并且可能相互依赖.每当编辑脚本时,脚本都会编译为javascript,并检测其依赖关系.

那时,我想(重新)将其注册为声明性服务,因此当它的依赖性来去时它将被激活/停用.

  • 这甚至可能吗?还是有什么重要的我不见了?
  • 如果无法使用OSGi标准,那么Felix或Equinox是否有特定的解决方案?
  • 你能在其他框架中做到这一点,比如iPojo或蓝图吗?

osgi declarative-services equinox apache-felix

4
推荐指数
1
解决办法
996
查看次数

OSGi组件模型中的束内和束间相互依赖性

在我目前的应用程序中,我在几个地方遇到了这种模式:我在一个捆绑包中有两个服务接口,它们执行不同但相关的工作.

interface Service1 { ... }

interface Service2 { ... }
Run Code Online (Sandbox Code Playgroud)

并希望单独的组件实现两者,但找到每个需要对另一个的引用:

public class Service1Impl implements Service1 { 

    private Service2 service2;
    ...

}

public class Service2Impl implements Service2 { 

    private Service1 service1;
    ...

}
Run Code Online (Sandbox Code Playgroud)

三个OSGi组件模型中的哪一个(DS,Blueprint和iPOJO)允许这样:1)何时Service1Impl和Service2Impl在同一捆绑中; 2)当他们在不同的捆绑?

osgi declarative-services ipojo blueprint-osgi

3
推荐指数
1
解决办法
2344
查看次数

OSGi/Equinox,声明性服务和延迟加载

我正在尝试使用Declarative Services来创建一个服务包,为另一个包提供功能.但是,我希望我的服务提供程序包在需要之前不会启动.让我来描述一下我的情况.

有两个包:

-com.example.serviceprovider

-com.example.serviceconsumer

Service Provider捆绑包使用Declarative Services提供服务,如下所示:

<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true"     immediate="true" name="samplerunnable1">
<implementation class="com.example.serviceprovider.SampleRunnable"/>
<service>
    <provide interface="java.lang.Runnable"/>
</service>
Run Code Online (Sandbox Code Playgroud)

服务使用者引用提供的服务如下:

<reference name="SampleRunnable"
    interface="java.lang.Runnable"
    bind="setRunnable"
    unbind="unsetRunnable"
    cardinality="1..n"
    policy="dynamic"/>
Run Code Online (Sandbox Code Playgroud)

当这两个捆绑包在启动时都处于"活动"状态时,服务使用者可以毫无困难地与服务提供商声明的服务进行通信.当我尝试让服务提供商以懒惰的方式开始时,问题就出现了.

服务提供程序设置为加载延迟后,这是我在OSGi控制台中得到的:

osgi> ss
  "Framework is launched."
  id      State       Bundle
  15      STARTING    com.example.serviceconsumer_1.0.0.X
  16      RESOLVED    com.example.serviceprovider_1.0.0.X
Run Code Online (Sandbox Code Playgroud)

我期望看到的是,即使捆绑16只是"已解决"它至少会注​​册的是服务.但是,当我调用"捆绑"命令时,它会声明"没有注册服务".

osgi> bundle 16
com.example.serviceprovider_1.0.0.X [17]
  Id=17, Status=RESOLVED    Data Root=C:\apache\apache-tomcat-.0.40\work\Catalina\localhost\examplesX\eclipse\configuration\org.eclipse.osgi\bundles\17\data
  "No registered services."
  No services in use.
  No exported packages
  Imported packages
     org.osgi.framework; version="1.7.0"<org.eclipse.osgi_3.8.0.v20120529-1548 [0]>
  No fragment bundles
  Named class space
    com.example.serivceprovider; bundle-version="1.0.0.X"[provided]
  No required bundles
Run Code Online (Sandbox Code Playgroud)

也许我已经错过了懒加载捆绑和服务注册的基本概念.如果捆绑包处于"已解决"状态,是否应该连接所有"连线"?(即,有一个类加载器,已解析的导入和导出依赖项和服务已注册.)如果服务使用者试图访问该服务,那么该bundle是否应该转换为"ACTIVE"状态?我在这里错过了什么?

java osgi lazy-loading declarative-services equinox

3
推荐指数
1
解决办法
1593
查看次数

OSGi - 按名称(id)获取 ds 服务

我是 OSGi 的新手。我用谷歌搜索了大约几个小时,但找不到答案。也许我的理解是错误的。所以问题来了。假设我有一个组件。

<component name="sample.component" immediate="true">
  <implementation class="sample.SampleComparator" />
  <service>
    <provide interface="java.util.Comparator" />
  </service>
</component>
Run Code Online (Sandbox Code Playgroud)

并在代码中:

ServiceReference[] serviceReferences = 
    bundleContext.getServiceReferences(
        java.util.Comparator.class.getName(), "(name=sample.component)");
Run Code Online (Sandbox Code Playgroud)

但我明白了null。错误在哪里?过滤器是否(name=sample.component)正确?或者我如何设置服务的 id 并通过它进行查找?

java osgi declarative-services jakarta-ee

3
推荐指数
1
解决办法
862
查看次数