[ 
https://issues.apache.org/activemq/browse/CAMEL-2551?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=58266#action_58266
 ] 

Sergey Zolotaryov commented on CAMEL-2551:
------------------------------------------

Hi Claus

We use Camel for a downstream distribution product and one of the requirements 
is streaming of large amounts of data. The use case is bulk output of data - I 
put a db cursor into an Iterable, forward to a home made velocity component 
(out of the box velocity component writes to a String, which is not acceptable 
for us) - and it puts PipedInputStream as message body. A separate thread feeds 
the PipedOutputStream to velocity engine. Then when this stream is passed on to 
file component we get InputStream closed exception, because of the bug 
mentioned. For now I have to wrap PipedInputStream with a buffering stream, but 
if you include the fix, we will remove the workaround.

> File component does not correctly handle PipedInputStream in message body.
> --------------------------------------------------------------------------
>
>                 Key: CAMEL-2551
>                 URL: https://issues.apache.org/activemq/browse/CAMEL-2551
>             Project: Apache Camel
>          Issue Type: Bug
>          Components: camel-core
>    Affects Versions: 2.2.0
>         Environment: does not matter
>            Reporter: Sergey Zolotaryov
>            Assignee: Willem Jiang
>         Attachments: patch.txt
>
>
> Streams that do not have their contents length at immediate disposal, like 
> PipedInputStream, are not processed correctly by the file component.
> \\
> {code}
>     private void writeFileByStream(InputStream in, File target) throws 
> IOException {
>         FileChannel out = null;
>         try {
>             out = prepareOutputFileChannel(target, out);
>             if (LOG.isTraceEnabled()) {
>                 LOG.trace("Using InputStream to transfer from: " + in + " to: 
> " + out);
>             }
>             int size = endpoint.getBufferSize();
>             byte[] buffer = new byte[size];
>             ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
>             while (true) {
>                 int count = in.read(buffer);
>                 if (count <= 0) {
>                     break;
>                 } else if (count < size) {
>                     byteBuffer = ByteBuffer.wrap(buffer, 0, count);
>                     out.write(byteBuffer);
>                     break;
>                 } else {
>                     out.write(byteBuffer);
>                     byteBuffer.clear();
>                 }
>             }
>         } finally {
>             ObjectHelper.close(in, target.getName(), LOG);
>             ObjectHelper.close(out, target.getName(), LOG);
>         }
>     }
> {code}
> The code 
> {code}
>                 } else if (count < size) {
>                     byteBuffer = ByteBuffer.wrap(buffer, 0, count);
>                     out.write(byteBuffer);
>                     break;
>                 } else {
> {code}
> does not take into account that bytes read can be less than the size of the 
> buffer passed into the InputStream.read method and stream can still have more 
> content. The only indication that EOF was reached is -1 returned from the 
> read method according to Java API.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to