Processos paralelos, async e em fila

Amigos,

Venho aqui trocar uma bola para saber qual seria o melhor caminho a adotar em um projeto que estou desenvolvendo.
Tenho a necessidade de desenvolver um servidor para receber tarefas de impressão e receber requisições de periféricos;.

Explico.
O sevidor irá estar conectado em mais de uma impressora, cada impressora poderá excutar um trabalho por vez, esse trabalho deve de qualquer maneira ser impresso, ou seja, se caso ele falhe em sua impressora original, deve ser direcionado a outra impressora, e se essa falhar, procurar uma disponivel, se todas falharem, avisar o administrador e retomar os trabalhos assim que uma da impressora estiver disponível.
Esse mesmo servidor irá receber requisições de palm e microterminais para serem salvas no banco de dados e depois impressas;

Estava pensando em criar um POOL de THREAD para gerenciar cada impressora, pesquisando pela NET desconbri o pacote java.util.concurrent. Depois de ler muito, percebi que ele atende tudo que eu preciso, porem, tenho duvidas em como implementar.

O que pensei:

  1. Para gerenciar os trabalhos em cada impressora, irei usar a interface BlockingQueue;
  2. Para gerenciar todas as impressoras vou usar a Interface ExecutorService;
  3. Para a interface do usuário, usarei um JTABLE informando a fila de impressao e um outro informando as impressoras com status em cada uma.
  4. Terei uma classe principal que irá monitorar as impressoras; Instalar impressoras, desintalar impressoras; Receber conexoes para novos serviços;
  5. Terei classes para impressoras que é uma interface com os metodos que deverei chamar para realizar a impressao, verificar o estado, carregar o driver, etc.
  6. Terei uma classe que é o trabalho a ser impresso.

Estou no caminho certo?

No geral parece ok.

Alguns pontos:

  1. Evite implementar seu servidor como um único processo que “assovia e chupa cana”. Vc fala em algum momento de um painel de controle para monitorar o status: este é um cara para ficar fora do serviço. Alguns motivos justificam tal separação:
  • O servidor em si pode ser rodar como um serviço (no windows) ou um daemon (unix/linux)
  • Vc. pode querer ter acesso remoto ao status da impressão.
  • O acesso ao dispositivo físico pode requerer privilégios adicionais, que não são necessários para o resto das funcionalidades.
  1. Lembre-se que impressoras são seres temperamentais: Podem estar desligadas, sem toner, mal-contato no cabo, surtarem com o PostScript gerado por alguns aplicativos etc. Em vários destes cenários será necessário ter que interromper o job de impressão e descartá-lo ou reiniciá-lo, preferencialmente de onde parou. Vc. está considerando estes cenários ?

  2. Sua estrutura de fila não prevê prioridade entre jobs. Acho que é um “feature” importante a considerar

  3. Sendo o processo de envio de dados e impressão totalmente i/o bound, é um desperdício usar um Thread para cada impressora. Use apenas um thread e NIO. Independente disto, lembre-se de incluir mecanismos para interrupção de um job no meio do caminho.

Obrigado por responder

Entao o servidor socket deve tambem permitir verificar status das impressoras, saquei! Bem lembrado.

Todo JOB será armazenado em arquivo e poderá ser reimpresso.

Certo, Agora fiquei na duvida qual Interface java.util.concurrency usar.

Isso nao ficou muito claro, entao, terei apenas uma THREAD gerenciando todas as impressoras, fazendo chamadas ciclicas, verificando stado da impressora, situação da conexão, job em andamento, etc!

Resumindo:

  • Uma thread para gerenciar o serversocket e processsar as conexoes dos clientes e dos microterminais;
  • Uma thread para gerenciar as impressoras;

Olá

Vai escrever um servidor?

Não faça isto pois não precisa se preocupar com os sockets concorrentes. Aprenda a usar o Grizzly ou o Apache Mina (ainda há outros) e concentre-se na lógica da sua aplicação.

[]s
Luca

Uma forma de implementar a “priority queue” é usar um array de filas. No índice 0 está a fila de jobs de prioridade 0, no índice 1 os de prioridade 1, etc.

[quote=Luca]Olá

Vai escrever um servidor?

Não faça isto pois não precisa se preocupar com os sockets concorrentes. Aprenda a usar o Grizzly ou o Apache Mina (ainda há outros) e concentre-se na lógica da sua aplicação.

[]s
Luca[/quote]

Pois é…
Pesquisei muito.
Vou precisar de carregar divers de dll, acessar diratamente dispositivos na COM, LPT1 e IP, enfim!
Pensei em uisar o JBOSS, pois, o projeto já possui um JBOSS.

Vc sabe me dizer se o apace mina ou o Grizzly suporte isso que precisso? ou seja, nào tem nehuma restrição a acesso as portas com e lpt1 da maquina?

Olá

[quote=gustavo.moda]Vc sabe me dizer se o apace mina ou o Grizzly suporte isso que precisso? ou seja, nào tem nehuma restrição a acesso as portas com e lpt1 da maquina?
[/quote]

Isto quem vai fazer é você.Tanto o grizzly quanto o Mina são servidores e muito bons.

[]s
Luca

[quote=Luca]Olá

[quote=gustavo.moda]Vc sabe me dizer se o apace mina ou o Grizzly suporte isso que precisso? ou seja, nào tem nehuma restrição a acesso as portas com e lpt1 da maquina?
[/quote]

Isto quem vai fazer é você.Tanto o grizzly quanto o Mina são servidores e muito bons.

[]s
Luca[/quote]

Legal!Vou pesquisar sobre isso.

Mais uma coisinha.
Tenho o JBOSS instalado e configurado e o projeto utiliza.
No jboss não rola? Já conheco bem ele! o que vc acha?

Ola

Ou eu não entendi absolutamente nada do que você quer ou se eu entendi pelo menos um tiquinho a resposta é não rola.

[]s
Luca