[ 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.