使用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.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的积木。 除了仅处理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

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

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

相关文章

Mvc+Hui+SqlSugar+Autofac+NLog+T4 架构设计(一)

一、前言 作为小菜鸟第一次写博客的我还有点小激动&#xff0c;最近开始打算着手写一个属于自己架构。算下来差不多最近花一周多的下班时间了来写这个框架&#xff0c;本来想整体架构开发完成测试完成后才写博客&#xff0c;怕自己没时间或失去动力&#xff0c;就先把自己架构设…

闲话杂谈—至曾经的自己

【这篇闲话杂谈写的背景时间是&#xff1a;2018年9月30号】 今天估计是自己突然灵光一闪&#xff0c;又或许是想到昨天团建时曾经带自己的师傅&#xff08;刘工&#xff09;的一番话。让我觉得大家都在变化&#xff0c;都慢慢的不再是曾经咱们一块儿奋斗、一块儿无话不谈&#…

房价在手,天下我有 --反手就撸一个爬虫(终)

接上篇&#xff0c;科科&#xff0c;好&#xff0c;我们继续 我们在这里先把json数据入库吧&#xff5e; 首先&#xff0c;database/scheme里定义好数据类型。 const mongoose require(mongoose)const detailHouseSchema new mongoose.Schema({ //定义数据模式link:String…

1.1 计算机网络的形成和发展

1.早期计算机网络&#xff1a;20世纪60年代前 计算机和通信技术结合的先驱&#xff1a;SAGE半自动化地面防空系统 &#xff0c;该系统由麻省理工学院林肯实验室设计。 计算机通信在民用领域的代表&#xff1a;飞机订票系统SABRE-I &#xff0c;美国航空公司与IBM公司联合开发。…

Spring MVC:带有CNVR卷的REST应用程序。 1个

不久前&#xff0c;我阅读了Paul Chapman撰写的有关内容协商视图解析器 &#xff08;CNVR&#xff09;的文章。 Spring Framework Blog上的那篇文章启发了我研究这个框架的领域。 因此&#xff0c;我开发了一个基于Spring MVC和CNVR的 REST示例应用程序。 该应用程序演示了REST…

《精通Spring 4.x 企业应用开发实战》学习笔记

第四章 IoC容器 4.1 IoC概述 IoC&#xff08;Inverse of Control 控制反转&#xff09;&#xff0c;控制是指接口实现类的选择控制权&#xff0c;反转是指这种选择控制权从调用类转移到外部第三方类或容器的手中。 也就是由Spring容器借由Bean配置来进行控制。 DI&#xff08;D…

微前端——无界wujie

B站课程视频 课程视频 课程课件笔记&#xff1a; 1.微前端 2.无界 现有的微前端框架&#xff1a;iframe、qiankun、Micro-app&#xff08;京东&#xff09;、EMP&#xff08;百度&#xff09;、无届 前置 初始化 新建一个文件夹 1.通过npm i typescript -g安装ts 2.然后可…

java executor spring_Spring+TaskExecutor实例

一 TaskExecutor接口Spring的TaskExecutor接口等同于Java.util.concurrent.Executor接口。 实际上&#xff0c;它存在的主要原因是为了在使用线程池的时候&#xff0c;将对Java 5的依赖抽象出来。 这个接口只有一个方法execute(Runnable task)&#xff0c;它根据线程池的语义和…

小程序居然可以用WXS模拟实现过滤器!

小程序目前官方还没有出过滤器&#xff0c;特别不方便&#xff0c;但是可以用wxs来模拟过滤器&#xff0c;话不多说&#xff0c;直接上代码。当然&#xff0c;不熟悉wxs的可以先看一下 官方文档 1.新建一个filter.wxs的文件我个人建议是一个过滤器写一个wxs&#xff0c;避免引用…

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

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

(十二)Bind读取配置到C#实例

继续上一节的&#xff0c;接下来用Options或者Bind把json文件里的配置转成C#的实体&#xff0c;相互之间映射起来。首先新建一个asp.net core mvc项目OptionsBindSampleStartup.cs&#xff0c;这里用依赖注入把Configuration加进来 1 public IConfiguration Configurat…

转-测试用例-常用控件

1. 文本框 是否是必填项 是 为空时提交&#xff0c;给出提示 输入空格时提交&#xff0c;给出提示 否 为空时提交&#xff0c;可提交成功 不为空时提交&#xff0c;提交后内容与输入的一致&#xff0c;存储到数据库中正确 是否支持TAB键在文本框中输入回车键&#xff0c;是…

java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...

一、缓存当系统的并发量上来了&#xff0c;如果我们频繁地去访问数据库&#xff0c;那么会使数据库的压力不断增大&#xff0c;在高峰时甚至可以出现数据库崩溃的现象。所以一般我们会使用缓存来解决这个数据库并发访问问题&#xff0c;用户访问进来&#xff0c;会先从缓存里查…

[译] SpaceAce 了解一下,一个新的前端状态管理库

原文地址&#xff1a;Introducing SpaceAce, a new kind of front-end state library原文作者&#xff1a;Jon Abrams译文出自&#xff1a;掘金翻译计划本文永久链接&#xff1a;https://github.com/xitu/gold-miner/blob/master/TODO1/introducing-spaceace-a-new-kind-of-fro…

Spring MVC:带有CNVR卷的REST应用程序。 3

这是带有CNVR的Spring MVC REST教程的最后一部分。 在这里&#xff0c;我将演示所有这些东西如何工作&#xff0c;这是我在前两部分中开发的。 对于每种类型的CRUD操作&#xff0c;这将分为四个部分&#xff1a;CREATE&#xff0c;READ&#xff0c;UPDATE&#xff0c;DELETE。 …

Python学习笔记——txt文件转csv文件

import numpy as np import pandas as pdtxt np.loadtxt(data1.txt) txtDF pd.DataFrame(txt) txtDF.to_csv(file1.csv, indexFalse)转载于:https://www.cnblogs.com/yucen/p/9343574.html

左侧固定,右侧自适应的布局方式(新增评论区大佬教的方法)

一.浮动布局 1.先让固定宽度的div浮动&#xff01;使其脱离文档流。 2.margin-left的值等于固定div的宽度相等。 .aside{float: left;width: 200px;background-color: red;}.content{margin-left: 200px;background-color: blue;}<div class"aside">Lorem ipsu…

java 中io的删除文件_总结删除文件或文件夹的7种方法-JAVA IO基础总结第4篇

本文是Java IO总结系列篇的第4篇&#xff0c;前篇的访问地址如下&#xff1a;如果您阅读完成&#xff0c;觉得此文对您有帮助&#xff0c;请给我点个赞&#xff0c;您的支持是我不竭的创作动力。为了方便大家理解&#xff0c;我特意制作了本文对应的视频&#xff1a;总结删除文…

Koa2和Redux中间件源码研究

一、Koa2中间件源码分析 在Koa2中&#xff0c;中间件被存放在一个数组中。 使用koa中&#xff0c;最常见的就是app.use(fn)&#xff0c;use函数部分源码如下所示。首先中间件必须是个函数。若是generator函数&#xff0c;则需要进行转化。最后把该中间件推入middelaware数组中…

Web应用程序的简单插件系统

我们需要制作多个具有很多共享功能的基于Web的项目。 为此&#xff0c;某种插件系统将是一个不错的选择&#xff08;作为复制粘贴内容的替代方法&#xff09;。 有些框架&#xff08;例如grails&#xff09;可以选择制作Web插件&#xff0c;但大多数没有&#xff0c;因此需要实…