Hi,

Wrote this component to satisfy a local issue, and would contribute to 
commons.io <http://commons.io/> if the community feels it would be generally 
useful.

Initial JavaDoc description is pasted below.

Let me know if you feel that this would be a useful component, not useful to a 
broad enough group of developers, or some other opinion.

Best,

John Crowley
Charlotte, NC
203-856-2396


/** Reads a single InputStream and broadcasts it to 1..N BroadcastConsumers. 
Each BroadcastConsumer will
 *  receive a copy of the entire original InputStream. Note that mark() and 
reset() are not supported.
 *
 *  An efficient alternative to setting up multiple 
PipeOutputStream/PipedInputStream connections, even if
 *  only broadcasting to 1 consumer. Internal buffer space is shared among all 
consumers, and full synchronization
 *  is required only when buffers are switched - instead of synchronizing the 
read and write of each byte.
 *
 *  Normally each of the BroadcastConsumers will execute in a separate thread 
in order to allow parallel
 *  processing of the data. Fast BroadcastConsumers (for example, in memory 
processing) may be throttled
 *  until slower consumers (for example, writing to an external device) catch 
up.
 *
 *  This also implies that if any BroadcastConsumer terminates abnormally, 
without closing itself,
 *  then all other consumers may enter an indefinite wait since the shared 
buffers are never released.
 *
 *  Once instantiated, the run() method of the BroadcastInputStream starts 
reading the original input and
 *  broadcasting to all of the consumers. The BroadcastInputStream may also be 
executed in a separate thread.
 *
 *  Example: Reading a large XML document generated by a sub-process, where the 
XML must be parsed, written to an
 *           output file, and also used to compute a word-frequency table.
 *
 *           A BroadcastInputstream with 3 BroadcastConsumers allows parallel 
processes - one to parse the XML,
 *           another to write it to a file, and a third to compute the 
word-frequencies - for minimal overall
 *           elapsed time and buffer space.
 *
 * Alternate constructors may specify the size and number of internal buffers.
 *
 * The overall structure is thread-safe, but the read() methods of the 
BroadcastConsumer instances are NOT
 * thread-safe. If processed in parallel, each BroadcastConsumer should be 
processed within a single thread.
 *
 * Note: run() cannot be listed as throwing an exception, so check hadError() 
to determine if any exception
 *       was thrown during processing. If true, use getError to retrieve. These 
methods also exist on each
 *       of the BroadcastConsumer instances to pick up any such Exception 
(except IOException on read()).
 *
 * @Author John Crowley Jan 2020
 */


Reply via email to