使用BeanIO和Apache Camel解组InputStream

时间:2017-08-21 21:55:13

标签: java apache-camel bean-io

我有一个接收文件并将其发送到Camel路由的服务。在那条路上,我想使用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();
    }

}

我已经测试了使用File组件读取文件的路由,并将结果发送到BeanIO组件。在这种情况下,它有效。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

其他解决方案可以是将.streamCaching()添加到路线中。然后,您可以多次读取相同的流。 Official documentation