使用 BeanIO 和 Apache Camel 的 Unmarshal InputStream



我有一个服务,可以接收文件并将其发送到骆驼路由。在这条路线上,我想使用 BeanIO 取消封送该文件,但它无法识别 InputStream 类型的输入。

@RestController
@RequestMapping(value = "/file")
public class FileController {
@Autowired
private CamelContext camelContext;
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public void upload(@RequestParam("file") MultipartFile multipartFile) throws IOException {
ProducerTemplate template = camelContext.createProducerTemplate();
template.sendBody("direct:routeTest", new ByteArrayInputStream(multipartFile.getBytes()));
}
}
@Component
public class SampleRouter extends RouteBuilder {
@Override
public void configure() throws Exception {
from("direct:routeTest")
.log("${body}")
.to("dataformat:beanio:unmarshal?mapping=mapping.xml&streamName=testFile")
.process(msg -> msg.getIn()
.getBody(List.class)
.forEach(o -> {...}))
.end();
}
}

我已经测试了一条使用文件组件读取文件的路由,并将结果发送到 BeanIO 组件。在这种情况下,它可以工作。

如何在 Apache Camel 上将 BeanIO 与 InputStream 类型的输入一起使用?是否有任何组件可以将我的输入流转换为与 BeanIO 组件兼容的内容?

正如 mgyongyosi 所说,当.log("${body}")读取流时,位置会走到流的末尾。为了解决这个问题,我们可以在读取输入流后重置它的位置:

from("direct:routeTest")
.log("${body}")
.process(exchange -> ((InputStream) exchange.getIn().getBody()).reset())
.to("dataformat:beanio:unmarshal?mapping=mapping.xml&streamName=testFile")

或删除行.log("${body}")

其他解决方案可以是将.streamCaching()添加到路由中。然后,您可以多次读取同一流。官方文档

相关内容

  • 没有找到相关文章

最新更新