Spring Boot和Apache Camel

随着软件世界的发展,正在开发更加复杂的系统,这些系统必须相互集成。 它从SOA开始,然后一直到微服务。

骆驼是我想到的第一大集成工具,因为如今的骆驼springboot是一个非常强大的组合。

第一步是将骆驼依赖项包含到我们的spring项目中。

buildscript {ext {springBootVersion = '1.5.9.BUILD-SNAPSHOT'}repositories {mavenCentral()maven { url "https://repo.spring.io/snapshot" }maven { url "https://repo.spring.io/milestone" }}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")}
}apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'group = 'com.gkatzioura'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8repositories {mavenCentral()maven { url "https://repo.spring.io/snapshot" }maven { url "https://repo.spring.io/milestone" }
}dependencies {compile('org.apache.camel:camel-spring-boot-starter:2.20.0')testCompile('org.springframework.boot:spring-boot-starter-test')testCompile('org.apache.camel:camel-test-spring:2.20.0')
}

为了从头开始更快地进行项目设置,您可以始终使用在线spring 初始化程序 。

现在让我们添加一条简单的路线

package com.gkatzioura.springcamel.routes;import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;@Component
public class TimerRoute extends RouteBuilder {public static final String ROUTE_NAME = "TIMER_ROUTE";@Overridepublic void configure() throws Exception {from("timer:initial//start?period=10000").routeId(ROUTE_NAME).to("log:executed");}
}

我们不必担心骆驼上下文的配置,因为Camel自动配置会为您创建一个SpringCamelContext并负责该上下文的正确初始化和关闭。

骆驼自动配置还从Spring上下文中收集所有RouteBuilder实例,并将它们自动注入到提供的CamelContext中。 因此,我们不必注册到CamelContext的路线。

如您所见,我们的路由具有一个计时器,该计时器的周期为10000毫秒,该计时器路由到日志端点。 日志端点将每10000毫秒打印一次执行的字符串。

请记住,如果未指定routeId,骆驼将自己分配一个名称,因此在我们要检索根定义的情况下,为我们的路线定义命名是一个好习惯。

为了使骆驼保持不动,我们需要保持主线程处于阻塞状态。 因此,我们将此配置添加到application.yml文件中。

camel:springboot:main-run-controller: true

代替这个,我们可以包括spring-boot-starter-web依赖关系,但是我们的应用程序具有尽可能少的依赖关系,因此我们需要保持这种方式。

但是,与其他系统集成中最困难的部分是测试。 多年来,我们在测试和使用的工具方面取得了长足的进步。
骆驼还带有一些很棒的工具,以便进行单元测试。

例如,我们将对先前指定的路线进行测试。

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
public class SpringCamelApplicationTests {@EndpointInject(uri = MOCK_RESULT)private MockEndpoint resultEndpoint;@Autowiredprivate CamelContext camelContext;@EndpointInject(uri = MOCK_TIMER)private ProducerTemplate producer;private static final String MOCK_RESULT = "mock:result";private static final String MOCK_TIMER = "direct:mock-timer";@Beforepublic void setup() throws Exception {camelContext.getRouteDefinition(TimerRoute.ROUTE_NAME).autoStartup(true).adviceWith(camelContext, new AdviceWithRouteBuilder() {@Overridepublic void configure() throws Exception {replaceFromWith(MOCK_TIMER);interceptSendToEndpoint("log*").skipSendToOriginalEndpoint().to(MOCK_RESULT);}});}@Testpublic void sendMessage() throws Exception {resultEndpoint.expectedMessageCount(1);producer.sendBody("A message");resultEndpoint.assertIsSatisfied();}}

让我们看一下测试的每个部分。

我们选择的JUnit运行器将是CamelSpringBootRunner.class

@RunWith(CamelSpringBootRunner.class)

我们注入一个ProducerTemplate 。 通过ProducerTemplate接口,您可以通过各种不同的方式将消息交换发送到端点,从而可以轻松地从Java代码使用Camel Endpoint实例。

然后我们注入一个MockEndpoint。 MockEndpoint将通过替换原始端点为我们服务。 然后,我们将设置预期的接收消息数。 处理完成后,我们断言已满足接收消息的数量。

在我们的设置方法中,我们将用伪造的生产者模板端点替换原始端点。 这样,我们的路线将接收到我们将从ProducerTemplate发出的事件。
然后,我们还将拦截日志端点,并将消息定向到先前指定的MockEndpoint。

因此,我们最终得到了骆驼应用程序和指定路线的单元测试。 您可以在github上找到源代码。

翻译自: https://www.javacodegeeks.com/2017/11/spring-boot-apache-camel.html

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

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

相关文章

MySQL 如何复制表

文章目录一、复制表结构及数据到新表二、只复制表结构到新表(一)使用关键字 like(二)使用 select 语句三、真正完整复制表四、复制表,同时重新定义字段名(拷贝旧表中部分的字段)五、复制表&…

android获取应用安装通知消息,如何在Android 11 上获取已安装应用列表

在Android 11上,我们可以看到很多的更新都是用来保护隐私的,如果你的app 在使用PackageManger的方法来获取安装的应用列表,那么在Android11上,就需要做一点改变了。我们来看看一下获取应用列表的代码,会不会和你的很相…

python特征选择pso_粒子群优化算法(PSO)之基于离散化的特征选择(FS)(三)

作者:Geppetto前面我们介绍了特征选择(Feature Selection,FS)与离散化数据的重要性,总览的介绍了PSO在FS中的重要性和一些常用的方法,介绍了FS与离散化的背景,介绍本文所采用的基于熵的切割点和最小描述长度原则(MDLP)…

postgresql_PostgreSQL开放自由

postgresqlOpen Liberty是源自WebSphere Liberty的有趣的新型OSS Java EE应用服务器。 您可以将Open Liberty配置为使用PostgreSQL作为其默认数据源&#xff0c;如下所示&#xff1a; 将<datasource> &#xff0c; <jdbcDriver>和<library>指令添加到server…

MySQL注释形式_可执行注释语句(/*!...*/)_数据库注释_数据库脚本注释_SQL脚本注释格式_SQL脚本注释分类

文章目录单行注释多行注释可执行注释为什么要把可执行的 SQL 语句写在注释里面呢&#xff1f;注释示例导入数据时禁止/激活索引测试禁止索引再导入数据的效率单行注释 SELECT * from tf_user; # 单行注释&#xff0c;从这个注释符号起直到该行结束 SELECT * from tf_user; -- …

苹果android投屏,iphone怎么投屏到mac?苹果手机投屏到苹果电脑方法

iphone和mac的使用人群越来越多,其中投屏功能却难倒了大部分新手用户,许多使用iPhone以及Mac的用户朋友都还不知道iPhone怎么投屏到mac,好奇的用户朋友马上点击查看iphone投屏到mac教程来实现这个具有科技革新感的功能吧。官方推荐方法1&#xff1a;用数据线- 1.使用lightning线…

微服务java模块内存管理_Java 9模块服务

微服务java模块内存管理接线与查找 Java长期以来都有一个ServiceLoader类。 它是在1.6中引入的&#xff0c;但是自Java 1.2以来就使用了类似的技术。 一些软件组件使用了它&#xff0c;但是使用并不广泛。 它可以用于模块化应用程序&#xff08;甚至更多&#xff09;&#xff0…

学python多大年龄可以学车_多大年龄可以学驾照?

展开全部最少要满 18 岁才32313133353236313431303231363533e4b893e5b19e31333365656662可以考部分车型的《机动车驾驶证》一、根据《中华人民共和国公安部令》第十一条规定申请《机动车驾驶证》的人&#xff0c;应当符合下列规定1. 年龄条件(1)申请小型汽车、小型自动挡汽车、…

Linux 命令之chgrp -- 用来改变文件或目录所属的用户组

文章目录命令介绍常用选项参考示例&#xff08;一&#xff09;修改指定目录及其所含的文件的用户组&#xff08;二&#xff09;更改指定文件的用户组&#xff08;三&#xff09;把指定文件的所属群组设成和参考文件的所属群组相同命令介绍 chgrp 是英语单词“change group”的…

signature=02d2eb69b4d24e2f9bb2956f66089339,Signature Balancing

摘要&#xff1a;Signatures are an important part of the design of a ship. In an ideal situation, signatures must be as low as possible. However, due to budget constraints it is most unlikely to reach this ideal situation. The arising question is which leve…

使用实例工厂方法实例化_一些工厂实例

使用实例工厂方法实例化我时不时地发现自己摸索了一些旧代码&#xff0c;找到了“我在哪里做过类似工厂的事情”的示例。 上周再次发生这种情况时&#xff0c;我决定只查找所有示例&#xff0c;并创建一个示例项目和有关该示例的博客文章。 所以在这篇文章中&#xff0c;我&a…

linux内核设计与实现 epub_Epoll学习服务器的简单实现-Linux内核Epoll结构

1.Begins~有的人学习linux编程很久&#xff0c;只知道网络编程是socket&#xff0c;bind&#xff0c; listen。。。&#xff0c;然而这些都是网络通信软件最基本的接口。在某网络公司待了y&#xff0c;也了解到公司的基础就是网络转发 &#xff0c;然而网络转发实现并非我们平时…

Linux 命令之 sftp -- 交互式的文件传输程序

文章目录一、命令介绍二、常用选项三、参考示例&#xff08;一&#xff09;使用 sftp 连接远程主机&#xff08;二&#xff09;使用 sftp 上传文件到远程主机&#xff08;三&#xff09;使用 sftp 从远程主机下载文件&#xff08;四&#xff09;查看远程主机的当前目录&#xf…

鸿蒙有安卓内核吗,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪

在华为开发者大会上&#xff0c;华为消费业务CEO 余承东&#xff0c;正式发布鸿蒙OS2.0&#xff0c;并宣布华为鸿蒙OS将全面启用全场景生态&#xff0c;并将于2020年12月发布手机版。余承东还表示&#xff0c;明年&#xff0c;华为的智能手机将全面升级&#xff0c;以支持鸿蒙操…

命名对象实体对象_我的对象命名

命名对象实体对象这是最常见的辩论之一。 大多数人对此主题有自己的见解&#xff0c;却没人能真正说出哪个是正确的。 我当然不能&#xff0c;但是尽管如此&#xff0c;我还是决定与大家分享我的想法&#xff0c;投入两美分&#xff0c;也许对某人会有帮助。 当我创建一个新类…

python查看关键字列表的命令是_Python 41 完整查询语句 和 一堆关键字

一&#xff1a;完整查询语句1、拷贝表 ***create table copy_table select *from customer ; 拷贝结构 与数据create table copy_table select *from customer where 0 > 1; 仅拷贝结构共同点&#xff1a; 索引 不能拷贝 描述不能拷贝(自增)[ ] 表示可选的{ }表示必选的增…

程序员的技术人生

文章目录第一阶段&#xff0c;高级程序员第二阶段&#xff0c;技术经理第三阶段&#xff0c;技术总监第四阶段&#xff0c;架构师第五阶段&#xff0c;CTO人们常常把 CTO、架构师、技术经理的头衔&#xff0c;乱授予技术负责人。在国内这种现象尤其严重。比如&#xff0c;一个初…

python csv转为html,在Python中将CSV转换为HTML表格

首先安装熊猫&#xff1a;pip install pandas然后运行&#xff1a;import pandas as pdcolumns [age, week, opp, ACscr, OPPscr, location]df pd.read_csv(Crushers.csv, namescolumns)# This you can change it to whatever you want to getage_15 df[df[age] U15]# Othe…

python椭圆拟合_opencv python 轮廓特征/凸包/外接矩形/外接圆/拟合矩形/拟合直线/拟合圆...

Contour Features1 图像的矩cv2.moments()图像的矩可以帮助计算物体的某些特征&#xff0c;如对象的质心&#xff0c;对象的区域等.代码&#xff1a;import cv2import numpy as npimg cv2.imread(img7.png,0)ret,thresh cv2.threshold(img,127,255,0)im2,contours,hierarchy …

RPM 软件包命名规范

文章目录命名格式示例命名格式 name-version-release.os.arch.rpm&#xff0c;软件名称-版本号-发布次数.适合linux系统.硬件平台.rpm name&#xff1a;程序名称 version&#xff1a;程序版本号 release&#xff1a;用于标识 RPM 包本身的发行号&#xff0c;其实就是软件包…