SpringBoot—如何使用ApacheCamel返回数据并将数据写入文件?

c9qzyr3d  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(425)

在rest调用之后,我尝试设置camel route以返回数据并将其写入cvs文件。问题是我只能让它做其中一个。

  1. from("direct:select")
  2. .setBody(constant("select * from animal")).to("jdbc:dataSource").marshal().csv()
  3. .to("file:///tmp?fileName=MY_TEST_FILE.csv");

在当前版本中,它可以正确地写入文件,但是rest响应只是一堆数字。如果我改变函数的顺序,比如:

  1. from("direct:select")
  2. .setBody(constant("select * from animal"))
  3. .to("file:///tmp?fileName=MY_TEST_FILE.csv").marshal().csv().to("jdbc:dataSource");

我得到了正确的rest响应,但在文件中我得到:

  1. select * from applicant

有没有办法从一条 Camel 路线同时做到这两个方面?

fnvucqvd

fnvucqvd1#

camel只是按照您定义的顺序执行路由/转换指令。
您的第一次尝试是有意义的:运行select查询,从jdbc调用中获取行列表,将其转换为csv,然后将其写入文件并作为路由的回复返回。最后一部分需要理解:来自路由的回复将是(同步)处理结束时exchange主体包含的任何内容。考虑到您对第一次尝试不满意,我将假设csv格式不是您想要返回的回复格式。
现在来看您的第二次尝试,您说它返回了预期的答复,但这让我感到惊讶:您试图将文本字符串“selectfrom animal”转换为csv,这在我这边引发了一个异常:
org.apache.camel.notypeconversionavailableexception:没有可用的类型转换器可用于从类型:java.lang.string转换为所需类型:java.util.list,值为select
from
现在如果你把 .marshal().csv() ,路由正在运行。它将“select*from animal”写入文件,正如您所观察到的(但这正是路由所指示的),并返回路由末尾的exchange body的内容作为reply,这意味着 List 这是jdbc调用的结果。因此,我将做另一个假设,即这个列表实际上是您打算返回的(您可能希望返回json,所以 List 确实符合无缝json转换的要求)。
考虑到这些,让我们试着为你找到一条你想要的路线。然而,我们遇到了一点障碍,你的要求“从一个 Camel 路线都做”。希望您不是有意排除使用 direct: 端点(我看不出有什么好的理由可以避免这种情况)。
下面是第一个同步执行所有操作的解决方案(jdbc调用+写入文件都由发起线程完成):

  1. from("direct:select")
  2. .setBody(constant("select * from animal"))
  3. .to("jdbc:dataSource")
  4. .enrich("direct:file", new UseOriginalAggregationStrategy());
  5. from("direct:file")
  6. .marshal().csv()
  7. .to("file:///tmp?fileName=MY_TEST_FILE.csv");

有关详细信息,请参见eip。
这里有一个异步写入文件(即在一个单独的线程中),这意味着rest调用的响应速度应该更快一些:

  1. from("direct:select")
  2. .setBody(constant("select * from animal"))
  3. .to("jdbc:dataSource")
  4. .wireTap("direct:file");
  5. from("direct:file")
  6. .marshal().csv()
  7. .to("file:///tmp?fileName=MY_TEST_FILE.csv");

有关详细信息,请参见驼峰线抽头eip。

展开查看全部

相关问题