2

我一直在尝试使用 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 实例并触发它们。

4

0 回答 0