java camel exchange类_让Camel处理各种URI类型
我想编写一个获取URI(可以是http,ftp,file,...)的Camel Route,然后获取数据并将其本地存储在文件中。
这个URI-String可以是,例如:
"FTP://localhost/example.txt"
"文件://tmp/example.txt"
"JMS:队列:dataInputQueue"
...
基于此字符串,应使用正确的Camel组件来访问数据。 像Java中的case / switch一样:
(1)接收URI(来自uri ="vm:incomingUri")
(2)选择"正确"的Camel组件
switch(URI)
case HTTP: use Camel HTTP component
case FTP: use Camel FTP component
case JMS: use Camel JMS component
...
(3)使用"正确的"Camel组件从该URI读取数据
(4)在本地存储文件(到uri ="file:// ...)
例:
从"vm:incomingUri"我读取一个字符串"ftp://localhost/example.txt"。 现在最终需要发生的事情应该等同于:
这在骆驼中看起来怎么样?
您最有可能想要查看新的"动态到"语法(如果您使用的是Camel 2.16+)或收件人列表模式。 两者都将允许动态评估uri。
我相信一个难点是,对于你提到的组件(HTTP,FTP,文件,JMS),你可能想要使用生产者或消费者:
FTP,文件:绝对是读取文件的消费者。
HTTP(或HTTP4):绝对是生产者,向服务器发送请求(服务器的回复将由新的消息体)
JMS:取决于您想要从队列(消费者)读取数据,还是使用ReplyTo标头将消息发送到队列,然后等待答案(生产者)。
制片人:
如果您使用的是Camel 2.16+,则可以使用新的"动态到"语法。它基本上与常规"to"相同,除了端点uri可以使用简单表达式(或者,optionnaly,另一种表达式)动态评估。或者,您可以使用内容丰富模式的enrich风格,也支持从Camel 2.16开始的动态uris。
如果您使用的是较旧版本的Camel,或者您需要动态路由到多个端点(而不仅仅是一个端点),则可以使用收件人列表模式。
这是一个例子。我们将通过调用端点来转换消息体;该端点的uri将在名为TargetUri的标头中找到,并将针对每条消息动态评估。
// An instance of this class is registered as 'testbean' in the registry. Instead of
// sending to this bean, I could send to a FTP or HTTP endpoint, or whatever.
public class TestBean {
public String toUpperCase(final String str) {
return str.toUpperCase();
}
}
// This route sends a message to our example route for testing purpose. Of course, we
// could send any message as long as the 'TargetUri' header contains a valid endpoint uri
from("file:inbox?move=done&moveFailed=failed")
.setHeader("TargetUri").constant("bean:testbean?method=toUpperCase")
.setBody().constant("foo")
.to("direct:test");
// 1. The toD example :
from("direct:test")
.toD("${header.TargetUri}")
.to("log:myRoute");
// 2. The recipient list example :
from("direct:test")
.recipientList(header("TargetUri"))
.to("log:myRoute");
// 3. The enrich example :
from("direct:test")
.enrich().simple("${header.TargetUri}") // add an AggregationStrategy if necessary
.to("log:myRoute");
消费者:
使用Camel 2.16+,您可以使用内容丰富模式的pollEnrich风格。
对于旧版本的Camel,您可以在处理器中使用ConsumerTemplate。
// 4. The pollEnrich example (assuming the TargetUri header contains, e.g., a file
// or ftp uri) :
from("direct:test")
.pollEnrich().simple("${header.TargetUri}") // add an AggregationStrategy if necessary
.to("log:myRoute");
// 5. The ConsumerTemplate example (same assumption as above)
from("direct:test")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
String uri = exchange.getIn().getHeader("TargetUri", String.class);
ConsumerTemplate consumer = exchange.getContext().createConsumerTemplate();
final Object data = consumer.receiveBody(uri);
exchange.getIn().setBody(data);
}
})
.to("log:myRoute");
制片人还是消费者?
可悲的是,我想不出任何真正优雅的解决方案来处理两者 - 我认为你必须根据uri和已知的组件路由到两个分支......这是我可能会做的事情(使用Camel 2.16+) ,它不是很漂亮:
// This example only handles http and ftp endpoints properly
from("direct:test")
.choice()
.when(header("TargetUri").startsWith("http"))
.enrich().simple("${header.TargetUri}")
.endChoice()
.when(header("TargetUri").startsWith("ftp"))
.pollEnrich().simple("${header.TargetUri}")
.endChoice()
.end()
.to("log:myRoute");
Re:"......或者如果你需要动态路由到多个端点"。我的问题是:我必须路由来自几个不同的端点(记住:我得到一个URI(作为String),并从该URI我必须得到数据。所以这个URI成为我的"来自("URI ..." ))。
我理解你的问题的方式是:你想从静态端点(vm:incomingUri)接收消息,然后路由到动态端点(取决于消息内容)来丰富/转换消息,然后最后发送富集/将消息转换为静态端点(file:...)。这就是我在我的例子中试图说明的内容。不是你想做什么的?您是否真的想设置新的路由,这些路由将继续从动态端点接收新消息?
更多地考虑一下:当你提到一个HTTP端点时,我的响应比你提到FTP或文件端点更有意义...使用HTTP(假设你发送了HTTP请求),你会想要使用一个生产者(和我一样)以java bean为例;使用FTP或文件,您将需要使用消费者...所以我认为您需要以不同于其他端点的方式调用某些端点(pollEnrich用于类似FTP; enrich,to或recipientList之类的东西像HTTP)。我试着把它添加到我的答案中。
"vm:incomingUri"只启动整个事情:从"vm:incomingUri"我只得到我需要读取的文件的URI(通过FTP或JMS或...)
我编辑的答案有帮助吗?
可以通过使用
但是你需要在属性中添加它。
并且您可以添加任何您想要http,ftp,file,log,jms,vm等的端点。
SomeEndPoint的价值。
日志组件:log:mock
JMS组件:activemq:someQueueName
文件组件:file:// someFileShare
VMComponent:vm:toSomeRoute
这对我来说不起作用,因为配置是静态的(请参阅原始问题中的编辑)
java camel exchange类_让Camel处理各种URI类型相关推荐
- java camel exchange类_camel
最近项目里会用到camel,近期会写一篇文章来总结camel中的一些常用的'知识点'. 总结一下. 1 from from("file://C:\\Users\\xxx\\documents ...
- java camel exchange类_Exchange服务器之camel 基本概念
本文将带你了解Exchange服务器之camel 基本概念,希望本文对大家学Exchange有所帮助. camel 对exchange的几种处理consuming方式: 1. bean 2. bean ...
- java自动生成类_自动生成优化的Java类专业知识
java自动生成类 如果您今年访问过JavaOne,您可能已经参加了我的演讲"如何从数据库生成定制的Java 8代码". 在那次演讲中,我展示了如何使用Speedment Open ...
- java rhino js类_让Rhino JS看Java类
我正在玩 Rhino,我已经成功使用了stdlib中的Java类,但没有使用我编译的Java代码. 例如,这工作正常: print(new java.util.Date()); 但是使用NanoHTT ...
- java导入自定义类_导入自定义Java类
我是Java的新手,但我一直在网上寻找解决方案,但似乎都没有用.请帮我. 我有两个文件.其中之一是包含主要功能的java文件.在里面: ... VaporVisitor visitor = new V ...
- java中script类_在Scripting java(javax.script)中导入一个类
我想将我在项目中创建的类导入到我的脚本中 我这样做但它不起作用: function doFunction(){ //Objectif Mensuel importPackage(java.lang); ...
- java 文本工具类_干货:排名前16的Java工具类
原标题:干货:排名前16的Java工具类 作者丨Java技术栈 https://www.jianshu.com/p/9e937d178203 在Java中,工具类定义了一组公共方法,这篇文章将介绍Ja ...
- java中公用类_提示公用类型
我用eclipse新建一个类,名为OblongTester,下面是代码,我是自学菜鸟,大家帮看一下,谢谢 public class Oblong{ private double length; pri ...
- 怎么查看java的引用类_一段代码看 Java 引用类型
Java 中的操作数(不知道叫什么,相对于 bytecode 而言,类似 CPU 的操作码和操作数)分为值类型和引用类型: 值类型就是直接存储最终数值的,如 char, int, float, dou ...
最新文章
- python turtle画彩虹-Python turtle 绘制彩色螺旋线
- ​Efficient GlobalPointer:少点参数,多点效果
- easyui使用时出现这个Uncaught TypeError: Cannot read property 'combo' of undefined
- 通过通用数据访问扩展AWS生态系统
- ClickedOnce部署方法
- C/C++知识分享:C++标准库之 string 类型,各种运算全部掌握
- selenium模拟登陆豆瓣网
- 递归下降分析器的设计java_数据结构(Java版)教与学(48和60学时教学大纲)
- 三月活动之“桃花朵朵开 求爱上上签”
- nginx: [emerg] bind() to 0.0.0.0:66 failed (98: Address already in use)
- 剑指offer——面试题22:栈的压入、弹出序列
- 多语言可视化编辑webControl 2.0版
- UWB超宽带定位技术
- 文本相似度计算-度量方法
- Intellj(IDEA)部署新项目, “warning no artifacts configured” 完美解决方案
- 【合金装备xp热门主题】
- 如何在 arm 官网上找到合适的手册
- 屏蔽烦人的百度搜索热点
- linux平台使用yum安装mysql
- 喜马拉雅数据接口 JSSDK API 接入 demo WEB版 标准登录 、免登陆
热门文章
- 快充伤电池?我来帮何同学做个假设检验
- C#,图像二值化(20)——全局阈值的耶恩算法(Yen Thresholding)及源代码
- 图灵计算机与网络论文,论文导读 | 阿兰·图灵《计算机器与智能》
- cf四大战区合区列表?
- 为什么国家将加快人工智能研究生培养?又为什么很多研究生评论人工智能是个大坑呢?...
- 1100 校庆分数 25
- #个人日记-《扫黑·决战》电影观后感-20210511
- 大数据产业助力上饶经济转型
- 根据不同的厂商,分析师和IT用户对云计算的理解,我们将云计算细分以下几类?
- echarts 设置仪表盘数字的位置_【Python代替Excel】11:用Python做数据仪表盘