Processamento simultâneo de um único InputStream com consumidores independentes
Eu preciso gerar N threads de consumo, que processam o mesmo InputStream simultaneamente, por exemplo - transformá-lo de alguma forma, calcular checksum ou assinatura digital, etc. Esses consumidores não dependem uns dos outros e todos eles estão usando bibliotecas de terceiros, que aceitam InputStream como Fonte de dados.
Então o que eu posso fazer é - criar alguma implementação do InputStream, que
ler pedaços de dados do fluxo "pai"desbloquear os consumidoresespere até que cada consumidor leia o pedaço inteiroleia o próximo pedaçoembora pareça simples, pode surgir vários problemas como o livelock quando determinado consumidor morre, implementar todos os métodos InputStream, controlar o fork / join dos próprios consumidores usando barreiras / travas, etc.
Um amigo me disse que é meia hora para implementar, fez minha noite.
Eu preferiria usar alguma coisa madura o suficiente (googling não veio com resultados assim, meu google-fu não é bom o suficiente?) Ou não se incomodar e copiar todo o fluxo de "fonte" em um arquivo temporário e usá-lo como Fonte de dados. A última solução parece ser mais confiável, mas pode acabar criando arquivos gigabytes (ao processar streaming de áudio, por exemplo).