Dúvida com threads
15/07/2012 04:36
0
Olá pessoal,

Preciso fazer uma requisição a um servidor externo, de modo que esta requisição seja assíncrona.
Para esta requisição vou criar uma nova thread, porém esta thread terá um tempo X, 10 segundos por exemplo, para terminar sua execução. Caso não termine no tempo X a thread deverá ser 'morta'. Isto porque muitas requisições serão feitas e não quero que uma thread fique gastando recursos por tempo demais desnecessariamente.

De modo geral, pensei na seguinte solução:

ExecutorService executor = Executors.newCachedThreadPool()

// o método call() da ClasseQueImplementaCallable() faz a requisição ao servidor e
// retorna um boolean de acordo com o resultado da requisição
Future<Boolean> future = executor.submit(new ClasseQueImplementaCallable())

try {
//pelo que entendi serão aguardados 10 segundos para que a thread termine sua tarefa
//caso a thread não termine em 10 segundos será lançado um TimeoutException
Boolean resultado_da_requisicao = future.get(10, TimeUnit.SECONDS)

} catch (TimeoutException e) {
//cancela a execução da thread
future.cancel(true)
}
//...


Esta seria a melhor forma de tratar este cenário? Alguem saberia me dizer a forma mais eficiente para tratá-lo?

[ ]'s
Tags: concorrencia thread


1
Oi vrcarvalho,

te dar uma sugestão mais interessante: armazene todos os parâmetros da requisição que vai ser feita em algum local (uma tabela, uma fila jms, arquivo txt, qualquer coisa) e, em seguida, crie um job que leia esta fonte de dados e faça o processamento pra você.

Foi o que fiz no Grails Brasil. É uma estratégia bastante interessante porque evita a necessidade de criarmos threads que nem sempre são fáceis de gerenciar e podem ser bastante caras. Se seu objetivo for obter throughput máximo, você pode pensar em mesclar as duas estratégias: incluindo um pool de threads inicializado pelo seu job que de tempos em tempos leia as requisições que precisam ser executadas.

Como o job executa em segundo plano em uma thread separada, você não terá problemas também relacionados ao feedback dos usuários conforme trabalhem no seu site.


0
Realmente faz mais sentido utilizar jobs para o que eu preciso.
Já dei uma lida na documentação do Quartz e creio que utilizarei ele mesmo.

Valeu pela ajuda!

[ ]'s
15/07/2012 17:24


0
Precisando, to ai!



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto