necessito criar uma aplicação no qual uma servlet realiza diversas buscas paralelamente e retorna a que veio mais rápido. Para isso, cogitei em utilizar ExecutorService e FutureTask do java.util.concurrent.
Alguém já utilizou essa API em Servlets? Essa abordagem pode gerar problemas por estar lidando com uma servlet gerenciando threads? Existe uma solução mais viável?
necessito criar uma aplicação no qual uma servlet realiza diversas buscas paralelamente e retorna a que veio mais rápido. Para isso, cogitei em utilizar ExecutorService e FutureTask do java.util.concurrent.
Alguém já utilizou essa API em Servlets? Essa abordagem pode gerar problemas por estar lidando com uma servlet gerenciando threads? Existe uma solução mais viável?
Abraços.
[/quote]
Com servlets nunca utilizei (aliás a especificação de servlet proibe de fazer isso … mas… ) e realmente pode dar problemas se vc não fizer um join da thred corrente com as threads executoras. E não sei se tem como fazer isso no ExecutorService . Em opção vc pode implementar threads que façam o serviço e sincronizá-las manualmente com a thread executora do servlet.
Você pode criar sim threads utilizando servlets, só tome cuidado que o ambiente de produção pode usar um java policy que proiba, então tenha isso em mente.
Quanto a melhor forma de implementar buscas paralelas, use sim um executor que faça caching das threads e utilize Futures para controlar o término, ou então utilize um framework de fork/join que resolve tb teu problema.
Eu consegui fazer um exemplo de uma servlet que chama o método invokeAny do ExecutorService passando uma lista de Callable que contém as ações que eu desejo realizar paralelamente. Esse método me retorna o resultado da Thread que conseguiu realizar a ação mais rápida.
A aplicação funcionou a princípio, mas tenho dúvida se utilizando essa API em servlet não possa ter problemas quando tiver várias requisições ao mesmo tempo.
Outra dúvida que tenho é se o método invokeAny do ExecutorService, ao retornar a resposta de uma Thread, cancela as outras Threads que foram disparadas. O javadoc diz que sim, mas nos testes que fiz, mesmo com o retorno da Thread mais rápida, as outras Threads disparadas continuam debugando até o fim das suas execuções.
Em relação à dúvida invokeAny do ExecutorService, acredito ter descoberto a resposta para o comportamento observado. Com a chamada desse método, ao retornar a resposta de uma thread, as outras threads não são canceladas. O que ocorre é a chamada do método interrupt() nessas threads . Caso elas estejam ativas, só é mudado o status da flag “interrupted” para true e vc pode tratar o comportamento das threads utilizando essa flag.
Acredito que seja esse o comportamento que observei, corrijam-me se estiver errado.