标签: aries

什么是Apache Karaf?

我对Apache Karaf究竟是什么感到有些困惑.

你能否说Apache Karaf包含以下内容:

  • Apache Felix(这是OSGi 4.2框架的一个实现)
  • Apache Aries(蓝图标准的实现)

osgi apache-felix apache-karaf aries

64
推荐指数
2
解决办法
5万
查看次数

企业OSGi框架:成熟度比较Apache Aries与Eclipse Gemini

问:截至今天,两个企业OSGi框架中哪一个更成熟:Apache Aries还是Eclipse Gemini?

我对Aries和Gemini Enterprise OSGi功能进行了一些基础研究.我也经历了一个类似的问题:Gemini和Apache Aries蓝图容器.

我的要求和发现如下.非常感谢您的额外投入.

  1. 蓝图容器:Aries和Gemini在蓝图规范的实施方面似乎都同样成熟.

  2. Web开发(将使用Spring Portlet MVC针对JSR 286进行开发):
    虽然Gemini Web源于Spring DM(因此我最初偏爱Gemini框架),但我相信Aries应该同样能够使用基于Spring Portlet MVC的Web应用.

  3. JPA:这是我最关注的领域.虽然我最初更倾向于Gemini(由于它源于Spring DM并且来自活跃的SpringSource社区的支持),但我觉得与Aries JPA相比,Gemini JPA的成熟度相当低.原因:

    • Gemini JPA仅支持与EclipseLink集成为JPA提供程序.我想使用Hibernate.Aries JPA支持Hibernate.
    • 参考Gemini JPA限制:特别限制#5:缺乏对JTA交易的支持.似乎Aries JPA支持JTA ......但是我还没有能够深入了解支持级别的细节.
  4. JNDI:我的新Web应用程序需要从JBoss应用程序服务器内托管的服务层调用现有的Session EJB.因此,JNDI支持对于我在客户端层中启用OSGi的Web应用程序至关重要.
    似乎Gemini Naming 尚未发布,而Aries 已经在这个领域获得了一些能力.

enterprise osgi aries

19
推荐指数
1
解决办法
5826
查看次数

OSGI JNDI是否允许与来自非OSGI代码的JNDI调用共存?

OSGI企业版第5版规范第126章提到了兼容性:

"支持Java SE和Java EE客户端使用的传统JNDI编程模型."

和使用OSGI不知道的代码:

"不知道OSGi的客户端和JNDI上下文提供程序使用静态方法连接到JRE JNDI实现.InitialContext类提供从提供程序访问上下文,提供程序使用静态NamingManager方法进行对象转换并查找URL上下文.传统模型不了解OSGi,因此只有在管理这种缺乏OSGi意识的后果时才能可靠地使用它."

但是我不清楚这个文本是仅适用于在OSGI包内执行的"遗留"代码,还是OSGI容器外部的代码,在OSGI容器嵌入应用程序的情况下.

在嵌入方案中,OSGI容器外部和内部可能存在执行JNDI调用的应用程序代码,并且当它们在同一JVM中执行时,它们将共享JNDI实现.

问题:在嵌入式OSGI容器中运行的OSGI JNDI实现是否允许容器外部的OSGI无意识代码像往常一样执行其JNDI调用,或者是否需要移植到"OSGI-awareness"?

使用Apache Karaf 2.3.0(使用Apache Aries JNDI 1.0.0)自己尝试这个似乎不起作用,因为Apache Aries需要JNDI客户端调用来自OSGI包.
部分堆栈跟踪:

javax.naming.NoInitialContextException: The calling code's BundleContext could not be determined.
    at org.apache.aries.jndi.OSGiInitialContextFactoryBuilder.getInitialContext(OSGiInitialContextFactoryBuilder.java:46)
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
    at javax.naming.InitialContext.init(InitialContext.java:242)
    at javax.naming.InitialContext.<init>(InitialContext.java:192)
Run Code Online (Sandbox Code Playgroud)

问题:这是正确的行为,还是我可以参考的规范中有一部分违反了此限制?

java osgi jndi apache-karaf aries

14
推荐指数
1
解决办法
2559
查看次数

JTA容器管理的事务回滚不适用于jaxrs端点

休息端点

<jaxrs:server id="jaxrs" 
              address="http://127.0.0.1:8080/jaxrs">

    <jaxrs:serviceBeans>
        <ref component-id="service1" />
        ...
        ...
        <ref component-id="serviceX" />
    </jaxrs:serviceBeans>
    <jaxrs:providers>
        <ref component-id="runtimeExceptionMapper" />
    </jaxrs:providers>
</jaxrs:server>
Run Code Online (Sandbox Code Playgroud)

路线

<route id="secureBridgeRoute">
    <from uri="jetty:https://0.0.0.0:443/jaxrs?sslContextParametersRef=sslContextParameters&amp;matchOnUriPrefix=true&amp;minThreads=8&amp;maxThreads=16" />
    <transacted ref="JTA_TRANSACTION" />
    <to uri="jetty:http://127.0.0.1:8080/jaxrs?bridgeEndpoint=true&amp;throwExceptionOnFailure=true" />
</route>
Run Code Online (Sandbox Code Playgroud)

DAO

<bean id="dao1" class="com.example.Dao1" activation="eager">
    <jpa:context unitname="PU" property="entityManager" type="TRANSACTION" />
</bean>
Run Code Online (Sandbox Code Playgroud)

服务bean

<bean id="service1" class="com.example.Service1" activation="eager">
    <property name="dao1" ref="dao1" />
    <property name="dao2" ref="dao2" />
    <tx:transaction method="*" value="Required" />
</bean>
Run Code Online (Sandbox Code Playgroud)

服务bean方法伪代码

boolean create(entity1, entity2) {
    dao1.persist(entity1);
    dao2.persist(entity2);
}
Run Code Online (Sandbox Code Playgroud)

当dao2持久失败时,事务没有回滚.Entity1被插入到DB中.

附加信息

1)TransactionManager定义

<reference id="platformTransactionManager" interface="org.springframework.transaction.PlatformTransactionManager" />
<bean id="JTA_TRANSACTION" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> …
Run Code Online (Sandbox Code Playgroud)

jta jax-rs apache-camel aries jbossfuse

13
推荐指数
1
解决办法
363
查看次数

OSGi中的OpenJPA没有找到MySQL JDBC Connector Bundle

我目前正在研究Felix的OSGi项目(v4.0.3).我需要使用JPA,所以我安装了Apache Aries JPA包.我还安装了OpenJPA,我需要它使用MySQL Connector Bundle连接到MySQL数据库.不幸的是它不起作用,OpenJPA说它无法找到MySQL JDBC类,我无法弄清楚什么是坏的,也许我做错了.我将在下面解释我安装的内容以及persistence.xml文件和我得到的实际异常.

这是我安装的Apache Aries软件包列表:

  1. org.apache.aries.jpa.api-0.3.jar
  2. org.apache.aries.jpa.container.context-0.3.jar
  3. org.apache.aries.jpa.container-0.3.jar
  4. org.apache.aries.util-0.4.jar

然后我安装了那些Apache Aries JPA包的依赖项.我从Springsource下载了它们:

  1. com.springsource.javax.transaction-1.1.0.jar
  2. com.springsource.org.apache.log4j-1.2.16.jar
  3. com.springsource.slf4j.api-1.6.1.jar
  4. com.springsource.slf4j.log4j-1.6.1.jar
  5. javax.persistence_2.0.4.v201112161009.jar(这个来自EclipseLink以防万一)

我还安装了OpenJPA及其所有依赖项.我在apache-openjpa-2.2.0下载文件夹的lib文件夹中找到了bundle 2到5(commons-*).我在这里下载了Serp ,因为在lib文件夹中找到的jar不是OSGi包.最后我找到了Springsource中的最后两个包(#7和#8):

  1. OpenJPA的-2.2.0.jar
  2. 公地集合-3.2.1.jar
  3. 公地DBCP-1.4.jar
  4. 公地郎2.4.jar
  5. commons-pool的-1.5.4.jar
  6. org.apache.servicemix.bundles.serp-1.13.1_4.jar
  7. com.springsource.javax.servlet-2.5.0.jar
  8. com.springsource.org.objectweb.asm-3.2.0.jar

一旦我最终安装了OpenJPA,我仍然需要MySQL JDBC Driver包,我也从Springsource存储库获得了它的commons-logging依赖:

  1. com.springsource.com.mysql.jdbc-5.1.6.jar
  2. com.springsource.org.apache.commons.logging-1.1.1.jar

现在,此时安装的软件包列表变得非常庞大.我说我安装了OpenJPA,但这只是因为我无法弄清楚如何使用任何其他提供商与Aries.我最初想使用EclipseLink,但显然Apache Aries没有检测到它作为提供者,根据这个博客,你必须制作另一个包含你自己的激活器的包,让Aries注意到EclipseLink.我尝试了但它没有用,所以我又回到了使用OpenJPA.

所以现在我有两个问题:

  • 如何让OpenJPA注意到我的MySQL Bundle?

或者:

  • 如何让Apache Aries注意到EclipseLink?

这是我使用的persistence.xml文件:

<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="userManager.model" transaction-type="RESOURCE_LOCAL">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <class>org.project.dao.entity.UserEntity</class>
    <properties>
        <property name="openjpa.ConnectionDriverName" value="com.mysql.jdbc.Driver" />
        <property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/usermanager?autoReconnect=true" />
        <property name="openjpa.ConnectionUserName" value="root" />
        <property …
Run Code Online (Sandbox Code Playgroud)

java osgi jdbc openjpa aries

7
推荐指数
1
解决办法
5310
查看次数

Aries管理服务工厂是否也管理物业?

我在Servicemix 4.3.1中使用Apache Aries 0.2并创建cm:managed-service-factory.使用.cfg文件创建服务工作正常(#ARIES-584除外),但.cfg文件中的属性不会注入服务对象.它们确实在ConfigAdmin中正确设置,只是我的bean setter方法永远不会调用我的配置文件中的值.

我以为我应该使用cm:托管属性或类似嵌套在我的托管服务工厂中的东西,但这需要一个单独的pid,所以似乎不对.

如果我没有放入属性标记,则不会设置任何值.使用属性标记,然后只设置默认值,但从不实际配置文件值.

我找不到任何使用Aries CM子项目的文档,但blueprint-sample.xml除外,它没有在托管服务工厂内显示托管属性.我一直在尝试使用Servicemix,但是在每个角落都缺少文档,功能损坏或丢失,或者影响核心功能的错误.

无论是春季双子座的文件表明,他们的托管服务工厂实现也应作为管理的属性.


foo.xml:

<blueprint>
  <cm:managed-service-factory id="myfoo-msf" factory-pid="my.msf" interface="my.IFoo">
    <cm:managed-component class="my.Foo"> 
      <property name="name" value="default />
    </cm:managed-component>
  </cm:managed-service-factory>
</blueprint>
Run Code Online (Sandbox Code Playgroud)

IFoo.java

package my;
public interface IFoo {
  public String getName();
  public void setName(String name);
}
Run Code Online (Sandbox Code Playgroud)

Foo.java

package my;
public class Foo implements IFoo {
  private String name;
  public void setName(String name) {
    this.name = name;
    System.out.println("name set to: " + name);
  }
  public String getName() {
    return …
Run Code Online (Sandbox Code Playgroud)

java apache osgi blueprint aries

6
推荐指数
1
解决办法
2133
查看次数

跨Equinox区域的BundleEvents

我们在Equinox OSGi运行时运行我们的应用程序.有一个扩展机制,与OSGi本身一起用于从第二方/第三方加载插件.问题是这些插件可能会引入干扰"核心"应用程序或其他插件的软件包.

这就是为什么我正在尝试使用Aries Subsystem 2.0.10来引入一些捆绑范围,并避免干扰"核心"应用程序和其他插件,也允许插件开发人员使用常见库的版本(例如Spring) )他们想要的.

目前,我从插件包集合中生成ESA,并在OSGi框架中安装Application类型的子系统.问题在启动子系统时开始,我们的扩展机制(在内核区域内)依赖于为子系统内的启动包集合触发的BundleEvents,但是子系统部署在它自己的Region中,因此bundle事件被过滤,并且永远不会到达内核区域的监听器.

有没有办法从内核区域的子系统区域接收BundleEvents,而不使用子系统内部的"人工"捆绑包在某些全局事件总线上重新传输所述事件?

java osgi equinox subsystem aries

5
推荐指数
0
解决办法
51
查看次数

为什么Aries在撤消数据库管理恢复之前执行重做?

为什么Aries算法在撤消之前应用重做,如果它已经知道在分析阶段之后要撤消哪些事务?

我知道(认为)它与Lsn数字有关并且在某种意义上保持一致性,因为在磁盘上刷新的数据可能与在崩溃时撤消事务不同(由于脏页面),但我找不到任何形式的"正式"答案(至少有一个我能理解的).

database recovery aries

2
推荐指数
2
解决办法
2764
查看次数

在Karaf 3.0.5中的骆驼应用程序捆绑中动态配置加载

我有一个简单的Camel应用程序捆绑包,该捆绑包将在Apache Service Mix 6.1下的Karaf 3.0.5中部署。配置文件放置在etc/目录中(假设它名为wf.cfg)。我想在我的应用程序包中具有动态配置更改功能。这样,无论何时更改了内容wf.cfg,都可以立即打包。为此,我在我的 blueprint.xml

<cm:property-placeholder persistent-id="wf"
    update-strategy="reload">
    <cm:default-properties>
        <cm:property name="env" value="local" />
    </cm:default-properties>
</cm:property-placeholder>

<!-- a bean that uses a blueprint property placeholder -->
<bean id="configBean" class="com.jabong.orchestratorservice.basecomponent.config.ConfigBean">
        <property name="env" value="${env}" />
</bean>
Run Code Online (Sandbox Code Playgroud)

我现在面临的问题是如果将update-strategy设置为reload。然后,它似乎正在重新加载整个bean。

有人可以让我知道是否可以只重新加载configBean整个捆绑包吗?如果我能做到这一点,那么可能是我可以对configBean应用程序包可以使用的配置变量进行静态引用?

完整blueprint.xml的放在这里

apache-camel apache-karaf aries blueprint-osgi apache-servicemix

0
推荐指数
1
解决办法
1672
查看次数