使用Java的Apache Camel入门

Apache Camel是一个非常有用的库,可以帮助您处理来自许多不同来源的事件或消息。 您可以通过许多不同的协议(例如在VM,HTTP,FTP,JMS甚至DIRECTORY / FILE之间)移动这些消息,但仍使处理代码不受传输逻辑的影响。 这样,您就可以专注于摘要消息的内容。

在这里,我将提供一个教程,介绍如何使用Java而不是Groovy来开始使用Apache Camel。

让我们首先创建一个Maven项目pom.xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>camel-spring-demo</groupId>
    <artifactId>camel-spring-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <camel.version>2.11.1</camel.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-core</artifactId>
            <version>${camel.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.5</version>
        </dependency>
    </dependencies>

</project>

我们将仅探索camel-core ,它实际上包含许多您可能会使用的有用组件。 同样出于记录目的,我添加了一个slf4j-simple作为记录器实现,因此我们可能会在控制台上看到输出。

接下来,您只需要一个类即可构造RouteRoute就像是对骆驼的指令定义,关于如何将消息从一个点移动到另一个点。 我们将创建src/main/java/camelcoredemo/TimerRouteBuilder.java文件,该文件将src/main/java/camelcoredemo/TimerRouteBuilder.java生成一次计时器消息,然后传递给仅对其进行记录的处理器。

package camelcoredemo;

import org.slf4j.*;
import org.apache.camel.*;
import org.apache.camel.builder.*;

public class TimerRouteBuilder extends RouteBuilder {
    static Logger LOG = LoggerFactory.getLogger(TimerRouteBuilder.class);
    public void configure() {
        from("timer://timer1?period=1000")
        .process(new Processor() {
            public void process(Exchange msg) {
                LOG.info("Processing {}", msg);
            }
        });
    }
}

这就是您开始所需要的。 现在您可以构建并运行这个简单的演示。

bash> mvn compile
bash> mvn exec:java -Dexec.mainClass=org.apache.camel.main.Main -Dexec.args='-r camelcoredemo.TimerRouteBuilder'

请注意,我们甚至没有编写Java 类,而只是使用org.apache.camel.main.Main选项来接受RouteBuilder类名作为参数。 然后它将自动加载并创建路线。

控制

启动Camel时,它将创建一个CamelContext对象,该对象包含有关如何运行它的许多信息,包括我们创建的Route的定义。 现在,如果您想对此CamelContext进行更多控制,则需要编写自己的Main类。 我会在这里给你看一个简单的例子。

package camelcoredemo;

import org.slf4j.*;
import org.apache.camel.*;
import org.apache.camel.impl.*;
import org.apache.camel.builder.*;

public class TimerMain {
    static Logger LOG = LoggerFactory.getLogger(TimerMain.class);
    public static void main(String[] args) throws Exception {
        new TimerMain().run();
    }
    void run() throws Exception {
        final CamelContext camelContext = new DefaultCamelContext();
        camelContext.addRoutes(createRouteBuilder());
        camelContext.setTracing(true);
        camelContext.start();

        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                try {
                    camelContext.stop();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        });

        waitForStop();
    }
    RouteBuilder createRouteBuilder() {
        return new TimerRouteBuilder();
    }
    void waitForStop() {
        while (true) {
            try {
                Thread.sleep(Long.MAX_VALUE);
            } catch (InterruptedException e) {
                break;
            }
        }
    }
}

如您所见,我们在createRouteBuilder()方法中重新使用了现有的TimerRouteBuilder类。 现在,我们的Main类可以完全控制何时创建,启动和停止CamelContext 。 此上下文使您可以控制如何全局配置骆驼,而不是在Route级别。 javadoc链接提供了您可以探索的所有setter方法。

注意,我们还需要在Main类中提供一些设置代码。 首先,我们需要处理正常关闭,因此我们添加了一个Java关闭挂钩来调用上下文stop() 。 其次,我们需要在上下文启动后添加一个线程块。 原因是CamelContext#start()方法是非阻塞的! 如果您在启动后没有阻塞Main线程,那么它将仅在它之后立即退出,这将没有太大用处。 您想要将Camel作为服务(例如服务器)运行,直到您明确按CTRL+C终止该过程为止。

改进

如果您不想处理上面的许多Main类设置代码,则可以简单地扩展camel-core intead提供的org.apache.camel.main.Main类。 piggy带这个类,您将不仅没有自动设置上下文的功能,还可以获得所有其他命令行功能,例如控制运行该进程的时间,启用跟踪,加载自定义路由类等。

重构前面的示例,如下所示。

package camelcoredemo;

import org.slf4j.*;
import org.apache.camel.builder.*;
import org.apache.camel.main.Main;

public class TimerMain2 extends Main {
    static Logger LOG = LoggerFactory.getLogger(TimerMain2.class);
    public static void main(String[] args) throws Exception {
        TimerMain2 main = new TimerMain2();
        main.enableHangupSupport();
        main.addRouteBuilder(createRouteBuilder());
        main.run(args);
    }
    static RouteBuilder createRouteBuilder() {
        return new TimerRouteBuilder();
    }
}

现在我们的TimerMain2变得更短了,您可以尝试一下,它的功能应该与以前相同。

bash> mvn compile
bash> mvn exec:java -Dexec.mainClass=camelcoredemo.TimerMain2 -Dexec.args='-t'

注意,我们给了-t选项,它将转储Route跟踪。 使用-h ,您将看到所有可用的选项。

将豆添加到骆驼

在上面的TimerRouteBuilder示例中,我们即时创建了一个Processor 。 现在,如果您要将几个不同的Processor组合在一起,那么将噪音降至最低会更好。 Camel允许您通过在其注册表空间中注册处理Bean来做到这一点,然后您就可以在路由中将它们作为bean组件进行引用。 这是将上述示例转换为Bean处理的方法。

package camelcoredemo;

import org.slf4j.*;
import org.apache.camel.*;
import org.apache.camel.builder.*;
import org.apache.camel.main.Main;

public class TimerBeansMain extends Main {
    static Logger LOG = LoggerFactory.getLogger(TimerBeansMain.class);
    public static void main(String[] args) throws Exception {
        TimerBeansMain main = new TimerBeansMain();
        main.enableHangupSupport();
        main.bind("processByBean1", new Bean1());
        main.bind("processAgainByBean2", new Bean2());
        main.addRouteBuilder(createRouteBuilder());
        main.run(args);
    }
    static RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
                public void configure() {
                    from("timer://timer1?period=1000")
                    .to("bean:processByBean1")
                    .to("bean:processAgainByBean2");
                }
            };
    }

    // Processor beans
    static class Bean1 implements Processor {
        public void process(Exchange msg) {
            LOG.info("First process {}", msg);
        }
    }
    static class Bean2 implements Processor {
        public void process(Exchange msg) {
            LOG.info("Second process {}", msg);
        }
    }
}

现在您看到我的Route非常狭窄,没有杂音; 而且我已经将处理代码重构为各个类。 当您编写更复杂的Route来解决业务逻辑时,这可以促进更好的代码管理和测试。 它使您可以构建类似于可重用POJO bean的积木。 除了仅处理bean外,Camel还将此注册表空间用于许多其他服务。 例如,您可以使用其他功能和/或配置自定义许多其他组件端点。 或者诸如线程池策略实现替换之类的东西。

上面示例中的Route是使用所谓的Java DSL构建的。 该路线可读性强,但是您将获得完整的IDE支持,以浏览可用于该路线的所有方法。

我希望本文能帮助您快速开始骑骆驼之旅。 除了提到的timer组件之外, camel-core还从其核心jar中附带了以下组件。

玩得开心!

参考: A程序员杂志博客上的JCG合作伙伴 Zemian Deng从Java入门使用Apache Camel

翻译自: https://www.javacodegeeks.com/2013/08/getting-started-with-apache-camel-using-java.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值