在rest调用之后,我尝试设置camel route以返回数据并将其写入cvs文件。问题是我只能让它做其中一个。
from("direct:select")
.setBody(constant("select * from animal")).to("jdbc:dataSource").marshal().csv()
.to("file:///tmp?fileName=MY_TEST_FILE.csv");
在当前版本中,它可以正确地写入文件,但是rest响应只是一堆数字。如果我改变函数的顺序,比如:
from("direct:select")
.setBody(constant("select * from animal"))
.to("file:///tmp?fileName=MY_TEST_FILE.csv").marshal().csv().to("jdbc:dataSource");
我得到了正确的rest响应,但在文件中我得到:
select * from applicant
有没有办法从一条 Camel 路线同时做到这两个方面?
1条答案
按热度按时间fnvucqvd1#
camel只是按照您定义的顺序执行路由/转换指令。
您的第一次尝试是有意义的:运行select查询,从jdbc调用中获取行列表,将其转换为csv,然后将其写入文件并作为路由的回复返回。最后一部分需要理解:来自路由的回复将是(同步)处理结束时exchange主体包含的任何内容。考虑到您对第一次尝试不满意,我将假设csv格式不是您想要返回的回复格式。
现在来看您的第二次尝试,您说它返回了预期的答复,但这让我感到惊讶:您试图将文本字符串“selectfrom animal”转换为csv,这在我这边引发了一个异常:
org.apache.camel.notypeconversionavailableexception:没有可用的类型转换器可用于从类型:java.lang.string转换为所需类型:java.util.list,值为selectfrom
现在如果你把
.marshal().csv()
,路由正在运行。它将“select*from animal”写入文件,正如您所观察到的(但这正是路由所指示的),并返回路由末尾的exchange body的内容作为reply,这意味着List
这是jdbc调用的结果。因此,我将做另一个假设,即这个列表实际上是您打算返回的(您可能希望返回json,所以List
确实符合无缝json转换的要求)。考虑到这些,让我们试着为你找到一条你想要的路线。然而,我们遇到了一点障碍,你的要求“从一个 Camel 路线都做”。希望您不是有意排除使用
direct:
端点(我看不出有什么好的理由可以避免这种情况)。下面是第一个同步执行所有操作的解决方案(jdbc调用+写入文件都由发起线程完成):
有关详细信息,请参见eip。
这里有一个异步写入文件(即在一个单独的线程中),这意味着rest调用的响应速度应该更快一些:
有关详细信息,请参见驼峰线抽头eip。