我对Apache Karaf究竟是什么感到有些困惑.
你能否说Apache Karaf包含以下内容:
问:截至今天,两个企业OSGi框架中哪一个更成熟:Apache Aries还是Eclipse Gemini?
我对Aries和Gemini Enterprise OSGi功能进行了一些基础研究.我也经历了一个类似的问题:Gemini和Apache Aries蓝图容器.
我的要求和发现如下.非常感谢您的额外投入.
蓝图容器:Aries和Gemini在蓝图规范的实施方面似乎都同样成熟.
Web开发(将使用Spring Portlet MVC针对JSR 286进行开发):
虽然Gemini Web源于Spring DM(因此我最初偏爱Gemini框架),但我相信Aries应该同样能够使用基于Spring Portlet MVC的Web应用.
JPA:这是我最关注的领域.虽然我最初更倾向于Gemini(由于它源于Spring DM并且来自活跃的SpringSource社区的支持),但我觉得与Aries JPA相比,Gemini JPA的成熟度相当低.原因:
JNDI:我的新Web应用程序需要从JBoss应用程序服务器内托管的服务层调用现有的Session EJB.因此,JNDI支持对于我在客户端层中启用OSGi的Web应用程序至关重要.
似乎Gemini Naming 尚未发布,而Aries 已经在这个领域获得了一些能力.
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)
问题:这是正确的行为,还是我可以参考的规范中有一部分违反了此限制?
休息端点
<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&matchOnUriPrefix=true&minThreads=8&maxThreads=16" />
<transacted ref="JTA_TRANSACTION" />
<to uri="jetty:http://127.0.0.1:8080/jaxrs?bridgeEndpoint=true&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) 我目前正在研究Felix的OSGi项目(v4.0.3).我需要使用JPA,所以我安装了Apache Aries JPA包.我还安装了OpenJPA,我需要它使用MySQL Connector Bundle连接到MySQL数据库.不幸的是它不起作用,OpenJPA说它无法找到MySQL JDBC类,我无法弄清楚什么是坏的,也许我做错了.我将在下面解释我安装的内容以及persistence.xml文件和我得到的实际异常.
这是我安装的Apache Aries软件包列表:
然后我安装了那些Apache Aries JPA包的依赖项.我从Springsource下载了它们:
我还安装了OpenJPA及其所有依赖项.我在apache-openjpa-2.2.0下载文件夹的lib文件夹中找到了bundle 2到5(commons-*).我在这里下载了Serp ,因为在lib文件夹中找到的jar不是OSGi包.最后我找到了Springsource中的最后两个包(#7和#8):
一旦我最终安装了OpenJPA,我仍然需要MySQL JDBC Driver包,我也从Springsource存储库获得了它的commons-logging依赖:
现在,此时安装的软件包列表变得非常庞大.我说我安装了OpenJPA,但这只是因为我无法弄清楚如何使用任何其他提供商与Aries.我最初想使用EclipseLink,但显然Apache Aries没有检测到它作为提供者,根据这个博客,你必须制作另一个包含你自己的激活器的包,让Aries注意到EclipseLink.我尝试了但它没有用,所以我又回到了使用OpenJPA.
所以现在我有两个问题:
或者:
这是我使用的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) 我在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) 我们在Equinox OSGi运行时运行我们的应用程序.有一个扩展机制,与OSGi本身一起用于从第二方/第三方加载插件.问题是这些插件可能会引入干扰"核心"应用程序或其他插件的软件包.
这就是为什么我正在尝试使用Aries Subsystem 2.0.10来引入一些捆绑范围,并避免干扰"核心"应用程序和其他插件,也允许插件开发人员使用常见库的版本(例如Spring) )他们想要的.
目前,我从插件包集合中生成ESA,并在OSGi框架中安装Application类型的子系统.问题在启动子系统时开始,我们的扩展机制(在内核区域内)依赖于为子系统内的启动包集合触发的BundleEvents,但是子系统部署在它自己的Region中,因此bundle事件被过滤,并且永远不会到达内核区域的监听器.
有没有办法从内核区域的子系统区域接收BundleEvents,而不使用子系统内部的"人工"捆绑包在某些全局事件总线上重新传输所述事件?
为什么Aries算法在撤消之前应用重做,如果它已经知道在分析阶段之后要撤消哪些事务?
我知道(认为)它与Lsn数字有关并且在某种意义上保持一致性,因为在磁盘上刷新的数据可能与在崩溃时撤消事务不同(由于脏页面),但我找不到任何形式的"正式"答案(至少有一个我能理解的).
我有一个简单的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
aries ×9
osgi ×6
java ×4
apache-karaf ×3
apache-camel ×2
apache ×1
apache-felix ×1
blueprint ×1
database ×1
enterprise ×1
equinox ×1
jax-rs ×1
jbossfuse ×1
jdbc ×1
jndi ×1
jta ×1
openjpa ×1
recovery ×1
subsystem ×1