apache camel_使用Java的Apache Camel入门

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.0http://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 beansstatic 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块的LEGO。 除了仅处理bean外,Camel还将此注册表空间用于许多其他服务。 例如,您可以使用其他功能和/或配置来自定义许多其他组件端点。 或者诸如线程池策略实现替换之类的东西。

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

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

  • 豆成分
  • 浏览组件
  • 数据集组件
  • 直接成分
  • 文件组件
  • 日志组件
  • 模拟组件
  • 属性组件
  • 色达成分
  • 测试组件
  • 计时器组件
  • 存根组件
  • 验证器组件
  • vm组件
  • xslt组件

玩得开心!

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

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

apache camel

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【自适应(盲)均衡6】信号过多径衰落信道的矩阵乘法表示之Toeplitz矩阵和Toeplitz块矩阵的生成(分数间隔FSE)

关注公号【逆向通信猿】更精彩!!! 信号过系统(多径信道)的连续形式 信号过系统(多径信道)的离散采样形式 通常接收端处理的是数字信号,需对接收信号进行采样,当采样率为符号速率时,即为符号间隔采样;采样率为符号速率的P倍时,为分数间隔采样 至于为什么要用分数…

JDK 9/10/11:Java字符串上+ =带来的副作用

问题“ 为什么array [i &#xff05;n] i ”在Java 8和Java 10中给出不同的结果&#xff1f; ”已于本周初发布在StackOverflow.com上 。 它指向JDK9和更高版本中存在的Java编译器中的错误 &#xff0c;但JDK8中不存在。 如StackOverflow线程上所述&#xff0c; Didier L提供…

Matlab库中过采样函数rcosflt参数及源代码详解(翻译)

函数定义 rcosflt函数作为MATLAB即将被替换的函数,在MATLAB R2018b中还可以使用,但是已经查不到帮助文档;虽说是要即将被替换,但是函数内部的原理其实都是一样的,这个函数搞懂了,不管被替换成什么,只要看看新函数的说明文档就知道怎么使用了,说白了就是“万变不离其宗…

【自适应盲均衡7】分数间隔的复数常模算法(FSE-CMA)

关注公号【逆向通信猿】更精彩!!! 理论推导 基于分数间隔的复数常模算法(FSE-CMA)的推导其实与符号间隔的算法是类似的,见 【自适应盲均衡2】多径衰落信道的复数常模算法(CMA)的理论推导与MATLAB仿真 分数间隔均衡器模型 分数间隔均衡器通常有两种比较经典的模型,…

Java机器学习,第2部分

欢迎使用本教程的第二部分&#xff0c;该教程使用LightningScorer评分PMML文件。 让我们找出其他参数是如何工作的。 初始步骤与教程的第一部分相似。 首先获取本地副本 git clone https://github.com/sezinkarli/lightningscorer.git并用Maven构建 mvn clean install并通…

【自适应盲均衡8】基于分数间隔的复数改进常模算法(FSE-MMA)的瑞利衰落信道盲均衡MATLAB仿真

关注公号【逆向通信猿】更精彩!!! 知识回顾 关于最基本的盲均衡算法,即CMA盲均衡的原理、推导与MATLAB仿真,可以参考 【自适应盲均衡2】多径衰落信道的复数常模算法(CMA)的理论推导与MATLAB仿真 关于改进的CMA算法,即MMA的原理、推导与MATLAB仿真,可以参考 【自适应盲…

JavaFX技巧30:带有DropShadow的ScrollPane

最近&#xff0c;在我的一个项目中&#xff0c;我发现用户很难看到ScrollPane实例的内容当前是否已滚动。 一种更清晰的方法是在滚动窗格的顶部添加阴影。 这也是Google的Material Design建议的。 所以我尝试了一下。 在我的解决方案中&#xff0c;我只是向ScrollPane添加了一…

【有限域除法】二元多项式除法电路原理及MATLAB详解

关注公号【逆向通信猿】试读更多内容!!! 二元多项式除法电路原理 例: g ( x ) = x 4 + x 2 + x + 1 g(x)=x^4 + x^2+x+1

Spring Apache Kafka教程

在本SpringApache Kafka课程中&#xff0c;我们将学习如何在Spring Boot项目中开始使用Apache Kafka&#xff0c;并开始生成和使用我们所选主题的消息。 除了一个简单的项目外&#xff0c;我们还将深入探讨Kafka的术语以及分区概念在Kafka中的工作方式。 让我们开始吧。 1.简介…

【OFDM系列3】AWGN下基于循环前缀(CP)OFDM调制解调原理、信噪比计算及仿真(H Harada经典OFDM书籍中代码详解及更正)

一、OFDM调制技术发展 在无线传输系统中,如果传输信号的带宽大于信道的相干带宽,信道为频率选择性信道,这会带来严重的码间串扰,极大的影响系统的传输性能。在研究对抗多径衰落的过程中,多载波并行传输体制逐渐受到人们的重视。并行传输是将高速数据分成若干路低速数据,…

【有限域生成】本原多项式生成有限域的原理及MATLAB实现

关注公号【逆向通信猿】更精彩!!! GF ⁡ ( 2 r ) \operatorname {GF}(2^r) GF(2

adf4351使用方法_ADF:使用HTTP POST方法进行URL任务流调用

adf4351使用方法众所周知&#xff0c;可以通过某些URL直接从浏览器或某些外部应用程序调用有限任务流。 如果任务流的属性“ URL invoke”设置为“ URL-invoke-allowed”&#xff0c;则启用此功能&#xff0c;该功能通常在集成项目中使用。 通常&#xff0c;客户端&#xff08;…

【BCH码1】系统BCH码编码原理及MATLAB实现(不使用MATLAB库函数)

关注公号【逆向通信猿】更精彩!!! BCH编码原理 设一个 ( n , k ) (n,k) (n,k)循环码的生成多项式为 g

【定时同步系列2】16QAM调制+OM定时+信号分段处理+误码率曲线之MATLAB仿真(复信号模型)

关注公号【逆向通信猿】阅读更多内容!!! 算法回顾 关于O&M算法的原理、公式推导与详解,请参考博客: 【定时同步系列1】定时同步之MARTIN OERDER算法原理与公式推导 鉴于前期有很多读者私信博主O&M算法的MATLAB仿真过程,前期太忙没来得及做。终于抽得一日闲,可…

使用Stream.peek在Java Streams内部进行窥视

对于刚接触JDK 8的管道和流的Java开发人员而言&#xff0c; Stream接口提供的peek&#xff08;Consumer&#xff09;方法可以用作可视化流操作行为的有用工具。 即使是更熟悉Java流和聚合操作的Java开发人员&#xff0c;有时也会发现Stream.peek&#xff08;Consumer&#xff0…

【定时同步系列3】8PSK调制+OM定时+信号分段处理+误码率曲线之MATLAB仿真(实信号模型)

关注公号【逆向通信猿】更精彩!!! 仿真结果 对于8PSK调制,仿真结果如下: 误码率曲线图 假设 E b / n 0 = 14 d B Eb/n_0 = 14dB

借助Web技术,桌面用户界面将保持活跃

要了解Java桌面应用程序有什么问题&#xff0c;让我们看一下JavaFX&#xff08;桌面应用程序的领先UI框架&#xff09;的新功能。 很明显&#xff0c;它正在向Web方法发展&#xff0c;从Web世界中借用了越来越多的功能。 JavaFX支持一部分CSS功能&#xff0c;并附带其自己的属性…

Win10窗口侧边栏设置Win7模式

本人非常不喜欢Win10的几个系统功能 贴靠窗口时自动调整窗口大小&#xff0c;填满可用空间关将窗口对齐时&#xff0c;显示能够在其旁边对齐的内容当我调整某个贴靠窗口的大小时&#xff0c;也调整任何相邻贴靠窗口的大小 想调整成Win7那种模式和风格的话&#xff0c;设置如下…

VS2017无法打开文件MSVCRTD.lib

需要添加组件&#xff0c;如下图

groovy 2.5.4_Java 7 vs Groovy 2.1性能比较

groovy 2.5.4自从我与Grails上一次接触以来&#xff0c;我已经有两年没有使用Groovy了。 我陷入&#xff08;硬&#xff09;核心企业Java中&#xff0c;但在后台遇到了一些性能方面的问题。 我几乎错过了学习Spock的机会&#xff0c;但是幸运的是&#xff0c; 华沙Java用户组帮…