Em meus sistemas trabalho muito com manipulação de documentos, gerar relatorios com jasper e gerar pdfs com itext, sanitizar e converter html em pdf, e rotinas até onde pego vários arquivos pdf de um servidor ftp e junto os arquivos e ao final de tudo isso o usuário ainda quer que o resultado final seja exibido na tela em um p:media.
O problema de tudo isso é que faço tudo isso em memória, utilizando InputStream e bytearrayInputStream. Tudo isso funciona mas não acho legal pois estou utilizando muito recurso do servidor. Na internet encontrei algumas "soluções" como por exemplo gerar os pdfs em algum diretorio no servidor, todo o processamento de arquivos ficaria no sistema de arquivos local do servidor e o pdf final teria uma especie de id que eu apenas faria referência através do p:media. Oque vocês me sugerem?
/**Exemplo de classe no sistema que retorna um array de bytes de um pdf que vai ser
utilizado pelo p:media **/
@Named
@ApplicationScoped
public class MediaManager {
@Inject
private MediaService service;
public StreamedContent getStream() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
// So, we're rendering the HTML. Return a stub StreamedContent so that it will generate right URL.
return new DefaultStreamedContent();
} else {
//...faz alguma papagaiada aqui
return new DefaultStreamedContent(new ByteArrayInputStream(media.getBytes()));
}
}
}