我想编写一个获取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类型相关推荐

  1. java camel exchange类_camel

    最近项目里会用到camel,近期会写一篇文章来总结camel中的一些常用的'知识点'. 总结一下. 1 from from("file://C:\\Users\\xxx\\documents ...

  2. java camel exchange类_Exchange服务器之camel 基本概念

    本文将带你了解Exchange服务器之camel 基本概念,希望本文对大家学Exchange有所帮助. camel 对exchange的几种处理consuming方式: 1. bean 2. bean ...

  3. java自动生成类_自动生成优化的Java类专业知识

    java自动生成类 如果您今年访问过JavaOne,您可能已经参加了我的演讲"如何从数据库生成定制的Java 8代码". 在那次演讲中,我展示了如何使用Speedment Open ...

  4. java rhino js类_让Rhino JS看Java类

    我正在玩 Rhino,我已经成功使用了stdlib中的Java类,但没有使用我编译的Java代码. 例如,这工作正常: print(new java.util.Date()); 但是使用NanoHTT ...

  5. java导入自定义类_导入自定义Java类

    我是Java的新手,但我一直在网上寻找解决方案,但似乎都没有用.请帮我. 我有两个文件.其中之一是包含主要功能的java文件.在里面: ... VaporVisitor visitor = new V ...

  6. java中script类_在Scripting java(javax.script)中导入一个类

    我想将我在项目中创建的类导入到我的脚本中 我这样做但它不起作用: function doFunction(){ //Objectif Mensuel importPackage(java.lang); ...

  7. java 文本工具类_干货:排名前16的Java工具类

    原标题:干货:排名前16的Java工具类 作者丨Java技术栈 https://www.jianshu.com/p/9e937d178203 在Java中,工具类定义了一组公共方法,这篇文章将介绍Ja ...

  8. java中公用类_提示公用类型

    我用eclipse新建一个类,名为OblongTester,下面是代码,我是自学菜鸟,大家帮看一下,谢谢 public class Oblong{ private double length; pri ...

  9. 怎么查看java的引用类_一段代码看 Java 引用类型

    Java 中的操作数(不知道叫什么,相对于 bytecode 而言,类似 CPU 的操作码和操作数)分为值类型和引用类型: 值类型就是直接存储最终数值的,如 char, int, float, dou ...

最新文章

  1. python turtle画彩虹-Python turtle 绘制彩色螺旋线
  2. ​Efficient GlobalPointer:少点参数,多点效果
  3. easyui使用时出现这个Uncaught TypeError: Cannot read property 'combo' of undefined
  4. 通过通用数据访问扩展AWS生态系统
  5. ClickedOnce部署方法
  6. C/C++知识分享:C++标准库之 string 类型,各种运算全部掌握
  7. selenium模拟登陆豆瓣网
  8. 递归下降分析器的设计java_数据结构(Java版)教与学(48和60学时教学大纲)
  9. 三月活动之“桃花朵朵开 求爱上上签”
  10. nginx: [emerg] bind() to 0.0.0.0:66 failed (98: Address already in use)
  11. 剑指offer——面试题22:栈的压入、弹出序列
  12. 多语言可视化编辑webControl 2.0版
  13. UWB超宽带定位技术
  14. 文本相似度计算-度量方法
  15. Intellj(IDEA)部署新项目, “warning no artifacts configured” 完美解决方案
  16. 【合金装备xp热门主题】
  17. 如何在 arm 官网上找到合适的手册
  18. 屏蔽烦人的百度搜索热点
  19. linux平台使用yum安装mysql
  20. 喜马拉雅数据接口 JSSDK API 接入 demo WEB版 标准登录 、免登陆

热门文章

  1. 快充伤电池?我来帮何同学做个假设检验
  2. C#,图像二值化(20)——全局阈值的耶恩算法(Yen Thresholding)及源代码
  3. 图灵计算机与网络论文,论文导读 | 阿兰·图灵《计算机器与智能》
  4. cf四大战区合区列表?
  5. 为什么国家将加快人工智能研究生培养?又为什么很多研究生评论人工智能是个大坑呢?...
  6. 1100 校庆分数 25
  7. #个人日记-《扫黑·决战》电影观后感-20210511
  8. 大数据产业助力上饶经济转型
  9. 根据不同的厂商,分析师和IT用户对云计算的理解,我们将云计算细分以下几类?
  10. echarts 设置仪表盘数字的位置_【Python代替Excel】11:用Python做数据仪表盘