当前位置: 首页 > news >正文

【协议转换和消息路由】camel-spring-boot-starter 实践

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Apache Camel uses URIs to work directly with any kind of Transport or messaging model such as HTTP, ActiveMQ, JMS, JBI, SCA, MINA or CXF, as well as pluggable Components and Data Format options. Apache Camel is a small library with minimal dependencies for easy embedding in any Java application. Apache Camel lets you work with the same API regardless which kind of Transport is used - so learn the API once and you can interact with all the Components provided out-of-box.

以上是引用 Apache Camel 官网对它的定义。

Apache Camel 在编排模式中依托 URI 描述规则,实现了传输协议和消息格式的转换,即它具备协议转换,消息路由的能力。

白话翻译下Apache Camel功能:apache camel 能把业务数据封装在 Message 协议中,在各种不同的协议(如:HTTP,JMS,CXF等)中exchange下去。

接下来列举一个业务场景:

    定时抓取百度页面内容,并存储到本地磁盘。

    分析:1)百度提供的服务是http://www.baidu.com --> 这里的协议便是 http。

            2)抓取百度的内容 --> 这里的内容就是数据,camel抓取到数据会把它封装进 Message,

            3)抓取到的内容存储到本地磁盘 --> 本地磁盘的协议是 file, 存储下来涉及到内容的转移,即Message 的 Exchange.

简单代码实现:

package com.simonton.camel;

import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.junit.Test;

public class CamelDemoTest {

	@Test
	public void demo() throws Exception {
		//Camel 的上下文对象 类似Spring ApplicationContext
		CamelContext context = new DefaultCamelContext();
		// 添加路由
		context.addRoutes(new RouteBuilder() {
			@Override
			public void configure() throws Exception {
				from("timer://foo?fixedRate=true&delay=0&period=10000")
				.to("http4:www.baidu.com?bridgeEndpoint=true")
				.to("file:/Users/simonton/tmp/baidu?fileName=baidu.html");
			}
		});
		//启动
		context.start();
		while(true) {
			
		}
	}
}

上面这段代码,涉及到 Camel 的三个基础概念:CamelContext, RouteBuilder 和 EndPoint。

CamelContext: 相对好理解每个框架会定义自己的上下文。

RouteBuilder: 通过继承它可以实现一个路由规则,实现多个,可以通过调用顺序来编排路由规则业务。

EndPoint:  Camel是一个系统继承的基础服务组件,在已经编排好的路由规则中,EndPoint就是和其它系统进行通讯的设定点。这个“其它系统”,可以是本地或远程的文件系统,可以是进行业务处理的订单系统,可以是消息队列服务,可以是提供防伪地址的任何服务。Apache Camel 利用自身提供的组件(Component)支持广泛的通信协议,如 RPC,JMS,FTP,HTTP等。

 

        刚才简单demo了下每隔10秒抓取百度页面存储到本地磁盘,接下来,我们用springboot把 camel 做成一个微服务,当然业务也再强化下。

强化后的业务:

        1)每天上午8点到10点,每隔30分钟抓取一次百度页面,存储在本地。

        2)支持手动触发该业务。

 

微服务实现如下:

1)用gradle 构建好springboot项目,目录如下:

├── build.gradle
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── simonton
    │   │           └── camel
    │   │               ├── CamelDemoApp.java
    │   │               └── router
    │   │                   ├── BaseRoute.java
    │   │                   ├── baidu
    │   │                   │   └── DownloadRouter.java
    │   │                   ├── demo
    │   │                   │   └── HelloRouter.java
    │   │                   └── utils
    │   │                       └── ContentTypeUtils.java
    │   └── resources
    │       └── application.properties
    └── test
        └── java
            └── com
                └── simonton
                    └── camel
                        └── CamelDemoTest.java

2) apache camel springboot 集成相关的 jar 依赖如下:

buildscript {
	repositories {
		jcenter()
	}
	
	dependencies {
		classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.5.6.RELEASE'
	}
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'

repositories {
    jcenter()
}

dependencies {
	compile 'org.springframework.boot:spring-boot-starter-web'
	compile group: 'org.apache.camel', name: 'camel-spring-boot-starter', version: '2.21.0'
	compile group: 'org.apache.camel', name: 'camel-http4-starter', version: '2.21.0'
	compile group: 'org.apache.camel', name: 'camel-servlet-starter', version: '2.21.0'
	compile group: 'org.apache.camel', name: 'camel-quartz2-starter', version: '2.21.0'
	compile 'org.springframework.boot:spring-boot-starter-test'
}

 

3) 主要业务代码download实现如下:

package com.simonton.camel.router.baidu;

import org.springframework.stereotype.Component;

import com.simonton.camel.router.BaseRoute;
import com.simonton.camel.router.utils.ContentTypeUtils;

@Component
public class DownloadRouter extends BaseRoute{

	@Override
	public void doConfigure() {
		//restful 手动触发url
		rest("/baidu")
		.produces(ContentTypeUtils.textPlain())
		.get("/download")
		.route()
		.to("direct:download");
		
		//定时任务触发
		from("quartz2:demo/download?cron=0 */30 8-10 * * ? *&job.name=download&stateful=true")
		.to("direct:download");
		
		//下载业务实现
		from("direct:download")
		.process(exchange -> {
			System.out.println(" download active...");
		})
		.to("http4:www.baidu.com?bridgeEndpoint=true&connectionClose=true")
		.to("file:/Users/simonton/tmp/baidu?fileName=baidu.html")
		.setBody(constant("download success..."))
		.end();
	}

}

4). 步骤3)中的 BaseRoute主要是在RouteBuilder基础上对异常做了下处理:

package com.simonton.camel.router;

import org.apache.camel.builder.RouteBuilder;

public abstract class BaseRoute extends RouteBuilder{

	@Override
	public void configure() throws Exception {
		handleException();
		doConfigure();
	}
	
	public abstract void doConfigure();
	
	public void handleException() {
		onException(Exception.class)
		.handled(true)
		.transform()
		.body()
		.setBody(constant("系统异常"))
		.end();
	}

}

5) 配置文件内容如下:

server.port=8888
camel.springboot.name=demo
camel.springboot.jmx-enabled=false
camel.component.quartz2.enabled=true
camel.component.quartz2.enable-jmx=false
#camel servlet 集成 context-path配置
camel.component.servlet.mapping.context-path=/demo/*

 

总结:

    Apache Camel 是一个系统继承的基础服务组件,具备消息转换和协议路由的能力,其拥有的各种现成的 component 使得 camel 可以轻松的支持 http,ftp,jms,amq等协议。Apache Camel可以轻松集成进 java  standard alone 程序,另外,通过 camel-servlet 可以轻松集成进 java web项目。利用Apache Camel具备的协议转换和消息路由的能力,可以轻松的实现文件转移服务,本人现已使用该框架落地了支付系统中支付通道对账文件的获取及转移服务。

 

完整源码:

github url: https://github.com/simonton/Camel.git

gitee url: https://gitee.com/simonton/camel.git

 

转载于:https://my.oschina.net/simonton/blog/1673528

相关文章:

  • 坑货!阿里奇门中心
  • [ssh]如何设计ARM板上多用户key登录系统
  • 71. Simplify Path
  • numpy 数组运算
  • Java 选择排序selection sort
  • 磁盘管理
  • 利用SCVMM 2012 R2来管理Azure虚拟机
  • AlphaGo告诉我们人工智能成功的五大秘诀,AI下一个风口在哪里?
  • 互联网面临新挑战,区块链经济将兴起
  • 2016年全球IDC市场规模达到451.9亿美元,增速达17.5%
  • YII2中查询生成器Query()的使用
  • notepad++(NPP) 任意多光标编辑,超越列块模式
  • JAVA jdk安装教程及环境变量配置
  • 第一阶段:前端开发_HTMLCSS
  • JavaScript正则表达式学习笔记(一)
  • JavaScript-如何实现克隆(clone)函数
  • [case10]使用RSQL实现端到端的动态查询
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 5、React组件事件详解
  • CSS相对定位
  • Git的一些常用操作
  • Hibernate最全面试题
  • Mybatis初体验
  • PAT A1017 优先队列
  • React-Native - 收藏集 - 掘金
  • Terraform入门 - 1. 安装Terraform
  • Xmanager 远程桌面 CentOS 7
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前嗅ForeSpider教程:创建模板
  • 深入浅出webpack学习(1)--核心概念
  • 收藏好这篇,别再只说“数据劫持”了
  • 与 ConTeXt MkIV 官方文档的接驳
  • 在electron中实现跨域请求,无需更改服务器端设置
  • ionic入门之数据绑定显示-1
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 组复制官方翻译九、Group Replication Technical Details
  • ​虚拟化系列介绍(十)
  • ​一些不规范的GTID使用场景
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • !!Dom4j 学习笔记
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • (4)Elastix图像配准:3D图像
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (Python) SOAP Web Service (HTTP POST)
  • (Python第六天)文件处理
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [20190416]完善shared latch测试脚本2.txt
  • [51nod1610]路径计数
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)