Qual a melhor maneira de exibir o status de processamento?

Pessoal, procurei muito e não achei uma boa solução, portanto vou abrir um tópico para ver se alguém pode me ajudar.

Estou desenvolvendo uma aplicação com SWING que se conecta a um banco remoto. Agora estou incluindo um controle que mostra o status da conexão (Online/Offline)… ocorre que em caso de queda da conexão (problemas na rede) a aplicação não pode parar e deve funcionar localmente. Como estou utilizando JPA, é uma EntityManagerFactory para cada conexão (local e remota), ou seja, tenho 2 persistence-unit, uma para cada conexão.

Para exibir na tela se a aplicação está online ou offline eu criei 2 icones que indicam o status da rede e coloquei um timer que fica sempre checando a conexão remota… dessa forma eu mostro 1 icone quando está onlie e quando ocorre falha (ou seja cai a rede) troca o icone offline.

O problema é que no caso de queda da rede, demora um certo tempo (em torno de 10 a 15 segundos) e neste tempo a aplicação fica travada, acho q isso ocorre pois o JPA está tentando utilizar uma EntityManagerFactory que perdeu a conexão, pois este é o tempo que demora para a exception ser disparada.

Enfim, gostaria de mostrar ao usuario um dialago do status de processamento quando isso acontecer… na hora q cair a conexão teria q mostrar uma mensagem para o usuario entender q o sistema não travou. E talvez tambem em outros momentos onde o sistema fique processando alguma coisa, como por exemplo na sincronização… etc.

Já tenho um splash que está funcionando legal quando a aplicação é iniciada, porém o splash não é executado automaticamente, para ele aparecer eu preciso chamar:


SplashScreen.getInstance().setVisible(true);

Acontece que nessa hora da queda da conexão, eu só sei disso quando dispara o exception, e o exception só dispara depois dos 15 segundos, portanto, mesmo colocando a chamada do splash no catch do tratamento deste exception não da certo.

Gostaria de saber qual a melhor maneira de controlar esses “status de processamento”.

Desde já fico muito grato se alguem puder me ajudar.

Bom cara,

Uma das fraquezas do java é o baixo suporte nativo à “Listeners”, que pelo que entendi é a sua necessidade.

Infelizmente não vejo nenhuma saída “elegante” ao menos uma:

  • deixar uma thread rodando e a mesma fica testando a conexão,e ai voce atualiza de acordo com os valores desse carinha;

Fora isso, não vejo como.

Abraços

Se o processamento estiver sendo feito na Thread da AWT isso irá mesmo acontecer.

O certo é delegar o processamento à outra Thread (ou se preciso, usar SwingWorker). Fazendo assim, caso a Thread de processamento trave enquanto tenta se conectar ao banco, a Thread da GUI continua disponível para atender os eventos do usuário.

Nada como os Design Patterns:

http://www.guj.com.br/article.show.logic?id=47

Worker Thread. Dê uma olhada no link:

http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html