如何使用 apache camel return 并将数据写入文件?
How to return and write data into a file using apache camel?
休息电话后,我试图将骆驼路线设置为 return 数据并将其写入 cvs 文件。问题是我只能让它做两者之一。
from("direct:select")
.setBody(constant("select * from animal")).to("jdbc:dataSource").marshal().csv()
.to("file:///tmp?fileName=MY_TEST_FILE.csv");
在当前版本中,它可以正确写入文件,但其余响应只是一堆数字。虽然如果我改变函数的顺序,比如:
from("direct:select")
.setBody(constant("select * from animal"))
.to("file:///tmp?fileName=MY_TEST_FILE.csv").marshal().csv().to("jdbc:dataSource");
我得到正确的休息响应,但在文件中我得到:
select * from applicant
有没有办法在一条骆驼路线上同时完成这两项工作?
Camel 只是按照您定义的顺序执行 routing/transformation 指令。
您的第一次尝试是有道理的:您 运行 select 查询,从 JDBC 调用中获取行列表,将其转换为 CSV,然后将其写入文件和 return 它作为你的路线的答复。
最后一部分很重要:你的路由的回复将是你的交换主体在(同步)处理结束时包含的任何内容。
鉴于您对第一次尝试不满意,我会假设 CSV 格式不是您想要 return 作为答复的格式。
现在看看你的第二次尝试,你说它 return 是预期的答复,但这让我感到惊讶:你正在尝试将文字字符串 "select * 从动物" 到 CSV,这在我这边引发了异常:
org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: java.lang.String to the required type: java.util.List with value select * from animal
现在,如果您删除 .marshal().csv()
,路由将正常运行。正如您所观察到的那样,它会将“select * from animal”写入文件(但这正是路线指示要做的)并且它 returns 作为回复交换主体的内容路由的,意思是 List
来自 JDBC 调用。因此,我将做出另一个假设,即这个列表实际上是您想要 return(您可能想要 return JSON,所以 List
确实符合要求无缝 JSON 转换)。
考虑到所有这些,让我们尝试为您找到一条符合您要求的路线。但是,我们遇到了一些问题,因为您要求“从一条骆驼路线完成这两项工作”。希望您并不是要排除使用 direct:
端点链接的子路由(我看不出您想要避免这种情况的任何充分理由)。
这是同步执行所有操作的第一个解决方案(JDBC 调用 + 写入文件均由原始线程完成):
from("direct:select")
.setBody(constant("select * from animal"))
.to("jdbc:dataSource")
.enrich("direct:file", new UseOriginalAggregationStrategy());
from("direct:file")
.marshal().csv()
.to("file:///tmp?fileName=MY_TEST_FILE.csv");
有关详细信息,请参阅 Camel Enrich EIP。
这是一个异步写入文件的方法(即 在一个单独的线程中),这意味着您的 REST 调用响应速度应该更快一些:
from("direct:select")
.setBody(constant("select * from animal"))
.to("jdbc:dataSource")
.wireTap("direct:file");
from("direct:file")
.marshal().csv()
.to("file:///tmp?fileName=MY_TEST_FILE.csv");
有关详细信息,请参阅 Camel Wire Tap EIP。
休息电话后,我试图将骆驼路线设置为 return 数据并将其写入 cvs 文件。问题是我只能让它做两者之一。
from("direct:select")
.setBody(constant("select * from animal")).to("jdbc:dataSource").marshal().csv()
.to("file:///tmp?fileName=MY_TEST_FILE.csv");
在当前版本中,它可以正确写入文件,但其余响应只是一堆数字。虽然如果我改变函数的顺序,比如:
from("direct:select")
.setBody(constant("select * from animal"))
.to("file:///tmp?fileName=MY_TEST_FILE.csv").marshal().csv().to("jdbc:dataSource");
我得到正确的休息响应,但在文件中我得到:
select * from applicant
有没有办法在一条骆驼路线上同时完成这两项工作?
Camel 只是按照您定义的顺序执行 routing/transformation 指令。
您的第一次尝试是有道理的:您 运行 select 查询,从 JDBC 调用中获取行列表,将其转换为 CSV,然后将其写入文件和 return 它作为你的路线的答复。 最后一部分很重要:你的路由的回复将是你的交换主体在(同步)处理结束时包含的任何内容。 鉴于您对第一次尝试不满意,我会假设 CSV 格式不是您想要 return 作为答复的格式。
现在看看你的第二次尝试,你说它 return 是预期的答复,但这让我感到惊讶:你正在尝试将文字字符串 "select * 从动物" 到 CSV,这在我这边引发了异常:
org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: java.lang.String to the required type: java.util.List with value select * from animal
现在,如果您删除 .marshal().csv()
,路由将正常运行。正如您所观察到的那样,它会将“select * from animal”写入文件(但这正是路线指示要做的)并且它 returns 作为回复交换主体的内容路由的,意思是 List
来自 JDBC 调用。因此,我将做出另一个假设,即这个列表实际上是您想要 return(您可能想要 return JSON,所以 List
确实符合要求无缝 JSON 转换)。
考虑到所有这些,让我们尝试为您找到一条符合您要求的路线。但是,我们遇到了一些问题,因为您要求“从一条骆驼路线完成这两项工作”。希望您并不是要排除使用 direct:
端点链接的子路由(我看不出您想要避免这种情况的任何充分理由)。
这是同步执行所有操作的第一个解决方案(JDBC 调用 + 写入文件均由原始线程完成):
from("direct:select")
.setBody(constant("select * from animal"))
.to("jdbc:dataSource")
.enrich("direct:file", new UseOriginalAggregationStrategy());
from("direct:file")
.marshal().csv()
.to("file:///tmp?fileName=MY_TEST_FILE.csv");
有关详细信息,请参阅 Camel Enrich EIP。
这是一个异步写入文件的方法(即 在一个单独的线程中),这意味着您的 REST 调用响应速度应该更快一些:
from("direct:select")
.setBody(constant("select * from animal"))
.to("jdbc:dataSource")
.wireTap("direct:file");
from("direct:file")
.marshal().csv()
.to("file:///tmp?fileName=MY_TEST_FILE.csv");
有关详细信息,请参阅 Camel Wire Tap EIP。