Apache-Camel
[TOC]
概述
Apache Camel是Apache基金会下的一个开源项目,它是一个基于规则路由和处理的引擎,提供企业集成模式的Java对象的实现,通过应用程序接口 或称为陈述式的Java领域特定语言(DSL)来配置路由和处理的规则。
其核心的思想就是从一个from源头得到数据,通过processor处理,再发到一个to目的的。
这个from和to可以是我们在项目集成中经常碰到的类型:一个FTP文件夹中的文件,一个MQ的queue,一个HTTP request/response,一个webservice等等。
Camel可以很容易集成到standalone的应用,在容器中运行的Web应用,以及和Spring一起集成。
Camel示例
启动camel的步骤
- 创建 CamelContext
- 为路由配置组件或终端节点,即from.to
- 添加路由到CamelContext
- 启动CamelContext
camel支持的组件还包括:bean browse dataset direct file log mock properties seda test timer stub validator vm xlst等。其中常用的有bean和direct以及file
关于exchange,是用来交换的对象,通过exchange.getIn()可以获取从from传递过来的Message,exchange.getOut()或以设置将要发给to的Message。Message又分为headers和body,类似于html协议中的头协议和协议内容。headers是一个Map<String, Object>,body可以是任意Object。
添加camel的maven依赖
创建一个maven-archetype-quickstart 简单maven项目,在pom.xml文件中添加apache camel的依赖camel-core和camel-stream,保存后稍等片刻,maven会将camel依赖的jar包下载到本地仓库目录中。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>2.17.0</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-stream</artifactId>
<version>2.17.0</version>
</dependency>
</dependencies>
file组件移动文件
package com.masi.camel_test;
import java.util.Date;
import org.apache.camel.CamelContext;
import org.apache.camel.Processor;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
public class App
{
public static void main( String[] args )
{
camelFile();
}
public static void camelFile() {
try {
CamelContext context = new DefaultCamelContext();
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("file:D:\\opt\\applog\\project\\mq-push?delay=30000").to("file:D:");
}
});
context.start(); // 4. 启动CamelContext.
Thread.sleep(Integer.MAX_VALUE); // 为了保持CamelContext处于工作状态,这里需要sleep主线程
context.stop(); // 最后停止CamelContext
} catch (Exception e) {
e.printStackTrace();
}
}
}
其中file:类似于http:,是camel的协议组件。运行上述程序,会发现D:\opt\applog\project\mq-push下的文件被转移到D盘根目录了,并且在D:\opt\applog\project\mq-push下会生成一个.camel文件夹存放刚才被转移的文件。
timer组件定时
新建App.java文件,创建并运行camel
package com.masi.camel_test;
import java.util.Date;
import org.apache.camel.CamelContext;
import org.apache.camel.Processor;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
public class App
{
public static void main( String[] args )
{
try {
CamelContext context = new DefaultCamelContext(); // 1. 创建 CamelContext.
context.addRoutes(new RouteBuilder() {
public void configure() {
from("timer://foo?fixedRate=true&period=1000").
process(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody(new Date());
}
}).to("stream:out"); // 2. 为路由配置组件或终端节点.
}
}); // 3. 添加路由到CamelContext
context.setTracing(true);
context.start(); // 4. 启动CamelContext.
Thread.sleep(Integer.MAX_VALUE); // 为了保持CamelContext处于工作状态,这里需要sleep主线程
context.stop(); // 最后停止CamelContext
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上程序实现如下功能:
1,使用timer组件,每隔1s发送一次消息.
2,消息在到达to之前,被Processor劫持,Processor添加了当前时间作为消息内容。
3,使用stream component,将接收到的消息打印到控制台。
Camel与Spring整合
Apache Camel提供了和spring的集成,通过Spring容器(ApplicationContext)来管理Camel的CamelContext,这样的话,就不需要写代码来控制CamelContext的初始化、启动和停止了。Camel会随着Spring的启动而启动起来。
添加camel-spring依赖
由于使用Spring,除了camel-core和camel-stream外,还需要在pom.xml文件中添加camel-spring依赖
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring</artifactId>
<version>2.17.0</version>
</dependency>
创建bean配置文件
项目名上右键->Properties->Java Build path,点击source标签,添加src/main/resource文件夹,在其中新建xml文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:camel="http://camel.apache.org/schema/spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
<bean id="myProcess" class="com.masi.camel_test.MyProcessor"></bean>
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="timer://foo?fixedRate=true&period=1000" />
<process ref="myProcess"></process>
<to uri="stream:out" />
</route>
</camelContext>
</beans>
创建处理类
package com.masi.camel_test;
import java.util.Date;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
public class MyProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody(new Date().toString());
}
}
创建主类启动spring
package com.masi.camel_test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class CamelSpring {
public static void main( String[] args ) throws Exception {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
ac.start();
System.in.read();
}
}
Run As Java Application启动,实现timer组件定时产生消息。
参考
Apache Camel系列(2)—-Hello World
http://www.cnblogs.com/zengbiaobiao2016/p/5481008.htmlCamel框架的快速认识和使用
http://raising.iteye.com/blog/2223900Camel in action(第一章译文)
http://www.shaoqun.com/a/87792.aspx
上一篇 JBoss-集群
下一篇 Ehcache
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: