Karaf教程第5部分-在OSGi中运行 Apache Camel集成

来源:互联网 发布:数控铣削平面编程实例 编辑:程序博客网 时间:2024/06/05 04:13

Karaf教程第5部分-在OSGi运行 Apache Camel集成

这教程演示如何在OSGi服务器Apache Karaf上运行camel路由。与CXF类似,我们使用blueprint启动camel。本教程演示三个例子:一个简单的blueprint路由、一个jms2rest适配器和一个有序处理的例子。

安装Camel特性

  • 下载Karaf 4.0.4,并解压到文件系统
  • 启动bin\karaf.bat 或者bin/karafunix

Karaf中,键入如下命令:

feature:repo-add camel 2.16.2

feature:list

你应该能看到camel特性已经准备好安装了。

获取示例代码,并构建

你可以在github上找到本教程的示例代码:Karaf Tutorial - camel.

所以你可以clone git仓库,或者就下载下来,然后解压到某个目录。要构建代码,只需要这么做:

cd camel

mvn clean install

启动简单示例(用纯blueprint部署)

我们的第一个例子甚至不需要一个java工程。在Karaf中,可以部署纯 blueprint xml文件。由于camelblueprint很好的集成,所以你可以在简单的blueprint文件中定义一个带有路由的完整的camel上下文。

simple-camel-blueprint.xml

camel上下文的blueprint xml非常类似于spring。主要是命名空间不同。 Blueprint发现依赖于camel,所以它会自动安装camel-blueprint特性。路由中的Camel组件作为OSGi服务被发现。所以只要camel组件使用So as soon as 各自的feature安装,它会自动变的对于路由可用。

所以要安装上面的基于blueprintcamel集成,你只需做下面的几步:

feature:install camel-blueprint camel-stream

复制simple-camel-blueprint.xmlkarafdeploy目录。你应该能在控制台看到每5秒打印一次"Hello Camel"

Blueprint文件会被自动监视,只要它发生变化,这些改变就会反映到Karaf中。为了尝试一下,用编辑器打开deploy/simple-camel-blueprint.xml文件,"stream:out"修改为"log:test",保存。现在控制台的消息应该停止打印,相反你能在Karaf日志文件中看到"Hello Camel",并且被格式化标准的日志。

JMS to REST Adapter (jms2rest)

jms2rest

这个例子不是独立的。前提要先安装Karaf教程第4部分中的person服务例子。

这个例子演示如何将消息世界桥接到REST服务上。它是足够简单的,你可能只需要定义个纯blueprint文件,就像上面的例子那样。任何更大的集成需要一些Java代码的,我都选择使用java工程。

像大多数情况一样,我们主要使用默认配置的maven bundle plugin将工程打包为bundleCamel上下文使用blueprint文件blueprint.xml启动,路由定义在javaJms2RestRoute中。

路由

第一个路由是监视目录"in",将该目录下的任何文件的内容写入到jms队列 "person"。它不是严格必须的,但是这样手动测试示例会更加简单。

2个路由是实际的jms2rest适配器。它监听jms队列person,期望获取personxml内容,就像PersonService中用到的那样。在路由中,personid是从xml中抓取的,并存储到camel消息头中。这个头然后被用于构建resturi。由于最后一步,消息的内容被用PUT请求发送到rest uri。所以它告诉服务用给定的id和数据存储person

使用Properties

除了纯路由,这个例子说明了一些在camel中需要的通用的东西。所以将我们访问的url具体化是最佳实践。Camel使用Properties组件完成这个任务。

这能让我们用简单的语言在终端点写入 {{personServiceUri}}或者 ${properties:personServiceUri}

blueprint上下文中,Properties组件是自动从Config Admin服务注入的。 我们使用cm:property-placeholder定义注入config admin pid "net.lr.tutorial.karaf.cxf.personservice"的属性。由于可能没有这样的pid,我们也定义了personServiceUri的默认值,所以部署集成部需要进一步配置。

JMS组件

我们在路由中使用camel jms组件。这是一个需要进一步配置才能工作的组件。我们在blueprint上下文中通过定义JmsComponent和注入连接工厂进行配置。在OSGi中,最佳实践是不要在bundle中定义连接工厂或数据源工厂,相反我们简单地使用OSGi服务引用引用它。

部署并测试jms2rest适配器

karaf控制台键入如下命令:

feature:repo-add activemq 5.12.2

feature:repo-add camel 2.16.2

feature:install  camel-blueprint camel-jms camel-http camel-saxon activemq-broker jms

jms:create -t activemq localhost

install -s mvn:net.lr.tutorial.karaf.camel/example-jms2rest/1.0-SNAPSHOT

这会安装activemqcamel特性文件。activemq:create命令在deploy文件夹创建代理定义。这个代理会自动启动。代理定义也为适合的连接工厂发布OSGi服务。这个稍后会在我们的bundle中引用。

最后一步,安装了我们自己的camel路由bundle

当键入如下命令时,应该能看到路由:

> camel:route-list

Route Id             Context Name         Status

[file2jms          ] [jms2rest          ] [Started           ]

[personJms2Rest    ] [jms2rest          ] [Started           ]

现在将文件src/test/resources/person1.xml复制到karaf目录下的 "in"文件夹。这个文件应该被第一条路由发送到队列person,然后被第二条路由发送到rest服务。

如果安装了personservice,你应该能看到类似于"Update request received for ..."的消息。如果没有安装personservice服务,那么当访问rest服务时,你应该能看到404错误。

订单处理示例

 

order

这个例子中的业务案例是一个商店,这个商店与外部商贩一起工作。

我们接收到一个xml文件的订单(参见order1.xml)。这个订单包含一个 customer元素和几个item元素。每一个item指定一个商贩。这个item要么是"direct"(自己派送item),要么是外部的商贩名字。如果item的商贩是direct,那么这个item应该被导出文件到用customer名字命名的目录中。所有其他的item都是通过邮件发送。邮件内容应该是可自定义的,邮件地址是从将商贩名字映射到邮件地址的服务获取的。

它是怎么工作的

这个例子再次使用maven构建,用blueprint.xml上下文启动cameljavaOrderRouteBuilder构建camel路由。所以从OSGi的角度看,它跟jms2rest例子几乎是一样的。

路由定义在net.lr.tutorial.karaf.camel.order.OrderRouteBuilder中。 "order"路由监听目录"orderin",期望xml订单文件放置到这个目录。路由使用xpath将订单的属性提取到消息头。分离器用于分别处理每一个(/order/item)。然后基于内容的router用于处理来自其他路由的不同的"direct" item

至于direct itemrecipientlist模式被用于使用简单语言表达式动态构建目的文件夹。

recipientList(simple("file:ordersout/${header.customer}"))

如果商贩不是"direct",那么路由"mailtovendor" 会被调用,以创建并发送邮件到商贩。主题和目的地址使用特殊的邮件组件能够理解的头名字设置。消息体期望是邮件的内容。由于消息体应该是可配置的,velocity组件用于向mailtemplate.txt文件填写来自头的值(期望的)。

部署到karaf

部署类似于之前的例子,但是更简单点,我们不需要jms。在karaf中键入下面的命令 :

feature:repo-add camel 2.16.2

feature:install camel-blueprint camel-mail camel-velocity camel-stream

install -s mvn:net.lr.tutorial.karaf.camel/example-order/1.0-SNAPSHOT

为了能收到邮件,你还需要编译配置pid。你也可以将属性文件放到etc/net.lr.tutorial.karaf.cxf.personservice.cfg,或者使用karaf webconsole编译配置pid(参见Karaf教程第2部分和第3部分).

从根本上说,你需要设置在你自己的邮件环境中设置这些属性。

mailserver=yourmailserver.com

testVendorEmail=youmail@yourdomain.com

测试订单示例

将文件order1.xml复制到karaf目录下的文件夹"ordersin" 

Karaf控制台将会显示::

Order from Christian Schneider

 

Count: 1, Article: Flatscreen TV

这与你邮箱的收件箱里是一样的。同时, ordersout/Christian Schneider/order1.xml 文件会被创建,文件中包含book item

总结和展望

这些示例演示了camel可以完成相当复杂的集成,可以很好地部署到Apache Karaf容器。这些示例也演示了一些配置管理、jms连接工厂和自定义模板的最佳实践。这些示例也为你自己集成工程提供了好的起点。许多人在生成环境中使用OSGi还是很犹豫的。我希望这些示例可以说明在实践中是多么容易。当然,问题总是有的。如果有问题,建议从供应商例如Talend获得支持。整个Talend Integration portfolio是基于Apache Karaf,所以我们这个领域是很有经验的。

在这个教程中,我没有考虑Apache Camel比较大的使用场景-数据库集成。这是一个很大的领域, 保证很快就与单独的教程。我也会解释如何处理那些和OSGi不兼容的driver的数据源和连接工厂。

 


原创粉丝点击