2017-08-21 8 views
1

ファイルを受信して​​Camelルートに送信するサービスがあります。そのルートでは、BeanIOを使ってそのファイルを非整列化したいが、それはInputStream型の入力を認識しない。BeanIOとApache Camelを使用したUnmarshal 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でInputStream型の入力でBeanIOを使用するにはどうすればよいですか? InputStreamをBeanIOコンポーネントと互換性のあるものに変換できるコンポーネントはありますか?

+0

例外はありますか? 'log(" $ {body} ")'で出力メッセージを受け取ったのですか? – mgyongyosi

+0

例外はありません。 '.log(" $ {body} ")'私にファイルの内容を渡します。その問題はまさにその行であることが判明しました。私は '.log(" $ {body} ")'は本文の内容を次のルートに返しますが、何も返しません。私はこの行を削除すると、それは働いた。 –

+1

これは、InputStreamで '.log(" $ {body} ")'を呼び出すとストリームを読み込んだ後、その位置がストリームの最後にあることを示しています。 – mgyongyosi

答えて

1

その他の解決策は、.streamCaching()をルートに追加することができます。その後、同じストリームを複数回読み取ることができます。 Official documentation

+0

はい、うまくいきました!ありがとう! –

3

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}")を削除する:これを解決するために、我々はそれを読んだ後InputStreamの位置をリセットすることができます。

関連する問題