Pergunta

Nós temos uma aplicação web que permite que os usuários desencadear um pedido para um recurso externo. O recurso externo gasta uma quantidade indeterminada de tempo para reunir os resultados, então temos que pesquisar para obter atualizações, e para recolher os resultados finais quando eles são feitos.

Queremos fazê-lo de modo que quando o usuário aciona o pedido, ele é adicionado a uma fila e, em seguida, um número de segmentos de trabalho vai pegar cada pedido e fazer o voto, enquanto o usuário faz outras coisas.

Uma vez que o número de pedidos variam muito durante o dia, nós figuramos seria um desperdício de recursos para ter muitos trabalhadores que não fazem nada quando é lento, mas ao mesmo tempo precisamos ter trabalhadores suficientes para lidar com o pico carga no sistema.

Nós gostaríamos algo que poderia acrescentar mais trabalhadores quando há uma grande quantidade de pedidos em espera, mas matar trabalhadores quando há pouco a fazer.

É / era possível fazer isso com EJB, mas nós não queremos usar isso. Nós também não quer usar JMS ou outras estruturas de grande escala para lidar com isso, a menos que seja uma que já está usando (Spring, Quartz, um monte de coisas Apache).

Como EJB tem suporte para isso, e é uma das características mais úteis encontrados lá, nós imaginamos que alguém já tenha resolvido este problema para nós. Sugestões?

Foi útil?

Solução

Use a ThreadPoolExecutor com valores apropriados para núcleo e tamanho máximo de piscina.

Tenha em mente que não há um custo enorme em ter várias centenas de segmentos ociosos para que você poderia considerar apenas usando Executors.newFixedThreadPool() .

Outras dicas

A partir da java.util.concurrent.ThreadPoolExecutor documentação :

Se a piscina tem atualmente mais de tópicos corePoolSize, tópicos excesso será encerrada se tiverem sido inativo por mais do que o KeepAliveTime (veja getKeepAliveTime (java.util.concurrent.TimeUnit)). Isto fornece um meio de reduzir o consumo de recursos quando a piscina não está sendo usado ativamente. Se a piscina se torna mais ativo depois, novos tópicos será construído.

então, gostaria de sugerir, você tenta a biblioteca padrão Java em primeiro lugar. Você terá que ajustar os parâmetros de um pouco, mas as piscinas de rosca é altamente configurável como ela é.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top