当前位置 : 首页 » 文章分类 :  开发  »  Apache-Camel

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&amp;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组件定时产生消息。


参考


上一篇 JBoss-集群

下一篇 Ehcache

阅读
评论
1.4k
阅读预计6分钟
创建日期 2016-11-08
修改日期 2017-07-22
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论