我一直在尝试使用 Camel 和 CDI 构建和部署一条简单的路线,但没有成功。我专注于部署到 ServiceMix 7.0.0,但也在飞机 jane Karaf 4.1.0 上进行了尝试,并获得了完全相同的结果。
我基于 2.16.4 和 2.18.2 中的 Camel CDI 示例构建了一个非常简单的路由。我暂时排除了一些测试内容,只是想在我将其部署在 Karaf/ServiceMix 中时使其正常工作。
我的 RouteBuilder 是:
public class DemoRouteBuilder extends RouteBuilder {
Logger log = LoggerFactory.getLogger(DemoRouteBuilder.class);
@Override
public void configure() {
log.info("Starting demo CDI route");
from("timer://cdiTimer?period=5000")
.routeId("com.omniprise.demo.cdi.route")
.to("log:com.omniprise..demo.cdi.context")
.to("mock:end");
}
}
我的 POM 中也有必要和内容:
<Export-Package>com.omniprise.demo.cdi.builder</Export-Package>
<Import-Package>*</Import-Package>
<Require-Capability>
osgi.extender; filter:="(osgi.extender=pax.cdi)",
org.ops4j.pax.cdi.extension; filter:="(extension=camel-cdi-extension)"
</Require-Capability>
完整的 Java 和 POM 代码在问题的末尾。
请注意,由于依赖冲突,camel-cdi 功能将无法在 ServiceMix 7.0.0 上安装:
- ServiceMix 7.0.0 正在使用 Camel 2.16.4
- 2.16.4 中的 camel-cdi 正在寻找 DeltaSpike [1.5.0,2.0)
- 2.16.4 中的 camel-cdi 正在寻找 pax-cdi 1.0.0.RC1
- pax-cdi 安装 DeltaSpike 1.3.1
...因此,如果所做的只是:
feature:install pax-cdi pax-cdi-weld camel-cdi
较新版本的 Camel 也存在类似问题。
还要注意,即使包含更新的 DeltaSpike 库,pax-cdi 1.0.0.RC1 也会出现错误,这可能是由于蓝图代理的问题。
因此,这些说明安装了 pax-cdi 1.0.0.RC2 和最新的 DeltaSpike 1.7.2,以及 camel-cdi(ServiceMix 7.0.0 为 2.16.4,Karaf 4.1.0 为 2.18.2)。
在 ServiceMix 7.0.0 中安装和运行(Karaf 4.0.8、Camel 2.16.4)
启动 ServiceMix,连接到 Karaf 控制台并安装:
feature:repo-add mvn:org.ops4j.pax.cdi/pax-cdi-features/1.0.0.RC2/xml/features
install mvn:org.apache.deltaspike.core/deltaspike-core-api/1.7.2
install mvn:org.apache.deltaspike.core/deltaspike-core-impl/1.7.2
feature:install pax-cdi/1.0.0.RC2
feature:install pax-cdi-weld/1.0.0.RC2
feature:install camel-cdi
install -s mvn:com.omniprise.demo/camel-osgi-cdi/0.0.1-SNAPSHOT
在简单的 jane Karaf 4.x 环境(Camel 2.18.2)中安装和运行
启动 Karaf,连接到 Karaf 控制台并安装:
feature:repo-add mvn:org.apache.camel.karaf/apache-camel/2.18.2/xml/features
feature:repo-add mvn:org.ops4j.pax.cdi/pax-cdi-features/1.0.0.RC2/xml/features
install mvn:org.apache.deltaspike.core/deltaspike-core-api/1.7.2
install mvn:org.apache.deltaspike.core/deltaspike-core-impl/1.7.2
feature:install pax-cdi/1.0.0.RC2
feature:install pax-cdi-weld/1.0.0.RC2
feature:install camel/2.18.2
feature:install camel-blueprint/2.18.2
feature:install camel-cdi/2.18.2
install -s mvn:com.omniprise.demo/camel-osgi-cdi/0.0.1-SNAPSHOT
在这两种情况下,软件包都已安装并列为运行,但骆驼上下文没有启动:
70 | Active | 80 | 1.0.0.RC2 | OPS4J Pax CDI Bean Bundle API
71 | Active | 80 | 1.0.0.RC2 | OPS4J Pax CDI Extender for Bean Bundles
72 | Active | 80 | 1.0.0.RC2 | OPS4J Pax CDI Portable Extension for OSGi
73 | Active | 80 | 1.0.0.RC2 | OPS4J Pax CDI Service Provider Interface
74 | Active | 80 | 1.0.0.RC2 | OPS4J Pax CDI Weld Adapter
... content removed for brevity
83 | Active | 50 | 2.18.2 | camel-cdi
... content removed for brevity
92 | Active | 80 | 1.8.1 | OPS4J Pax Swissbox :: Tracker
93 | Active | 80 | 0.0.1.SNAPSHOT | Camel CDI OSGi Demo
addmin@root()> camel:context-list
addmin@root()>
这是与camel-cdi 安装pax-cdi 1.0.0.RC1 相关的日志中的唯一一个错误,即使pax-cdi 1.0.0.RC2 已经存在,因此CDI 提供程序已经注册。在日志的末尾,很明显 CDI 绑定正在启动,但没有创建上下文,并且 Route 没有产生消息 - 没有任何迹象表明找到 RouteBuilder 或启动它时出现问题:
2017-03-08T15:50:24,568 | INFO | pipe-feature:install camel-blueprint/2.18.2 | CdiExtender | 71 - org.ops4j.pax.cdi.extender - 1.0.0.RC2 | creating CDI container for bean bundle camel-osgi-cdi [93] with extension bundles [org.apache.camel.camel-cdi [83]]
2017-03-08T15:50:24,575 | INFO | pipe-feature:install camel-blueprint/2.18.2 | AbstractCdiContainer | 73 - org.ops4j.pax.cdi.spi - 1.0.0.RC2 | Starting CDI container for bundle camel-osgi-cdi [93]
2017-03-08T15:50:24,598 | INFO | pipe-feature:install camel-blueprint/2.18.2 | Version | 69 - org.jboss.weld.osgi-bundle - 2.3.5.Final | WELD-000900: 2.3.5 (Final)
2017-03-08T15:50:24,745 | INFO | pipe-feature:install camel-blueprint/2.18.2 | Bootstrap | 69 - org.jboss.weld.osgi-bundle - 2.3.5.Final | WELD-000101: Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.
2017-03-08T15:50:24,810 | WARN | pipe-feature:install camel-blueprint/2.18.2 | Interceptor | 69 - org.jboss.weld.osgi-bundle - 2.3.5.Final | WELD-001700: Interceptor annotation class javax.ejb.PostActivate not found, interception based on it is not enabled
2017-03-08T15:50:24,811 | WARN | pipe-feature:install camel-blueprint/2.18.2 | Interceptor | 69 - org.jboss.weld.osgi-bundle - 2.3.5.Final | WELD-001700: Interceptor annotation class javax.ejb.PrePassivate not found, interception based on it is not enabled
2017-03-08T15:50:24,938 | INFO | pipe-feature:install camel-blueprint/2.18.2 | Event | 69 - org.jboss.weld.osgi-bundle - 2.3.5.Final | WELD-000411: Observer method [BackedAnnotatedMethod] private org.apache.camel.cdi.CdiCamelExtension.processAnnotatedType(@Observes ProcessAnnotatedType<?>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
源代码
在我非常简单的项目中有两个文件,POM 和 Class。pom.xml 位于项目根文件夹中:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.omniprise.demo</groupId>
<artifactId>camel-osgi-cdi</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Camel CDI OSGi Demo</name>
<description>Deploys simple routes using Camel Java DSL in ServiceMix OSGi Karaf container using CDI</description>
<packaging>bundle</packaging>
<properties>
<default.encoding>UTF-8</default.encoding>
<project.build.sourceEncoding>${default.encoding}</project.build.sourceEncoding>
<project.reporting.outputEncoding>${default.encoding}</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<slf4j.version-range>[1.7.2,1.8)</slf4j.version-range>
<log4j.version>1.2.17</log4j.version>
<!-- Maven Plugins -->
<maven-bundle-plugin.version>3.2.0</maven-bundle-plugin.version>
<maven-bundle-plugin.version>3.2.0</maven-bundle-plugin.version>
<maven-compiler-plugin.version>3.6.0</maven-compiler-plugin.version>
<maven-resources-plugin.version>3.0.2</maven-resources-plugin.version>
<maven-resources-plugin.encoding>${default.encoding}</maven-resources-plugin.encoding>
<depends-maven-plugin.version>1.3.1</depends-maven-plugin.version>
<!-- Tools -->
<!-- camel.version>2.16.4</camel.version -->
<camel.version>2.18.2</camel.version>
<!-- camel-cdi.version>2.16.4</camel-cdi.version -->
<camel-cdi.version>2.18.2</camel-cdi.version>
<cdi-api.version>1.2</cdi-api.version>
</properties>
<dependencies>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>${cdi-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-blueprint</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-cdi</artifactId>
<version>${camel-cdi.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version-range}</version>
</dependency>
<!-- Testing -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version-range}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<defaultGoal>install</defaultGoal>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven-resources-plugin.version}</version>
<configuration>
<encoding>${maven-resources-plugin.encoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.servicemix.tooling</groupId>
<artifactId>depends-maven-plugin</artifactId>
<version>${depends-maven-plugin.version}</version>
<executions>
<execution>
<id>generate-depends-file</id>
<goals>
<goal>generate-depends-file</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>${maven-bundle-plugin.version}</version>
<extensions>true</extensions>
<configuration>
<remoteOBR />
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Private-Package></Private-Package>
<Export-Package>com.omniprise.demo.cdi.builder</Export-Package>
<Import-Package>*</Import-Package>
<Require-Capability>
osgi.extender; filter:="(osgi.extender=pax.cdi)",
org.ops4j.pax.cdi.extension; filter:="(extension=camel-cdi-extension)"
</Require-Capability>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
</project>
DemoRouteBuilder.java 位于 src/main/java/com/omniprise/demo/cdi/builder
package com.omniprise.demo.cdi.builder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.cdi.ContextName;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//@ContextName("com.omniprise.demo.cdi.context")
public class DemoRouteBuilder extends RouteBuilder {
Logger log = LoggerFactory.getLogger(DemoRouteBuilder.class);
@Override
public void configure() {
log.info("Starting demo CDI route");
from("timer://cdiTimer?period=5000")
.routeId("com.omniprise.demo.cdi.route")
.to("log:com.omniprise.demo.cdi.context")
.to("mock:end");
}
}
我不明白为什么 DemoRouteBuilder 类没有被 CDI 基础设施调用,它应该找到所有 RouteBuilder 实例并触发它们。