Usar ou não JMS?

Pessoal, estou com o seguinte problema:

Um sistema deve realizar operações (cálculos e relatórios contábeis) para empresas. A ordem de execução deve ser a ordem de chegada (fila FIFO – First In First Out)

Imaginei que poderia resolver este problema usando JMS. Consumir uma mensagem por vez parece ser simples, no entanto a intenção é, enquanto uma operação para a empresa A é realizada, outra thread realize para a empresa B.

Não posso iniciar uma thread para cada mensagem, pois se estiver realizando uma operação para a empresa A, não posso realizar outra operação para a empresa A concorrentemente. Porem, eu poderia realizar uma operação para uma empresa B. Ou seja, eu gostaria que as operações sobre empresas diferentes fossem executadas concorrentemente, mas para uma mesma empresa as operações precisam ser realizadas pela ordem de chegada (fila FIFO).

Uma solução seria um consumidor de mensagens para cada empresa, mas parece inviável, pois o número de empresas pode crescer.

Alguém tem uma idéia diferente para permitir a concorrência entre empresas, mas garantir a unicidade de operações para uma empresa? Será que JMS não ajuda mesmo a resolver este problema? Alguma Sugestão?

Toda ajuda é bem vinda

precisar uasr JMS? Não pode ser algo mais simples assim:

pensei em algo assim:


List empresas = pegaListaDeEmpresas();
for (Iterator it = empresas.iterator(); it.hasNext(); ) {
  Empresa e = it.next();
  new FazOperacaoComEmpresaThread(e).start();

}

e na thread vc sincroniza a empresa “e”.

Por ser um problema de produtor/consumidor, JMS parecia ser uma solucao boa (sem reinventar a roda).

Como vou ter muitos produtores e (eu gostaria de ter) muitos consumidores (1 para cada empresa), essa solucao que vc descreveu (aparentemente) me forca a realizar o controle de concorrencia entre o produtor e consumidor, neh? Ou seja, vou ter que utilizar os mecanismos da API para inserir e retirar “operacoes” da minha lista de operacoes a serem realizadas.

E, se nao existisse operacao a ser realizada, eu gostaria de nao ter que iterar sobre laco algum. Fazer isso “na unha” é possivel (usando thread, sleep, notify…), mas eu queria evitar :slight_smile:

Obrigado pela sugestao. Ela realmente funciona, mas será que existe algo mais simples, provido pela propria API ou algum framework, que garanta a integridade da minha lista de operacoes e, ao mesmo tempo, me permita executar operacoes concorrentes que sejam de empresas distintas?

Essa nao é uma aplicacao que necessite do uso de filas.

geralmente em integrecoes de legado, sistema distribuidos multiplataforma, e outras coisas um pouco maiores o uso de filas pode ser justificavel.

s

Ok scottys0, talvez eu nao compreenda o que significa “outras coisas um pouco maiores”, mas tudo bem! Opinioes sao sempre bem vindas.

Já que o uso de JMS aparentemente nao se aplica, entao devo controlar os produtores/consumidores “na unha”? Terei que fazer todo o controle de qual “empresa” já possui uma “operacao” executando “na unha” também?

Tudo bem, se for necessario, nem vejo problema em fazer. Nada que uma instancia da classe Vector (que é synchronized) nao possa ajudar a resolver este problema. Certo? ou errado? :slight_smile:

Obrigado pelas sugestoes… outras continuam sendo bem vindas!