Dúvida sobre java.util.concurrent e servlet

Olá,

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=mwada]Olá,

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.