Pergunta

Temos um ouvinte Java que lê mensagens de texto de uma fila no JBossMQ.Se tivermos que reiniciar o JBoss, o listener não se reconectará e começará a ler as mensagens novamente.Acabamos de receber mensagens no arquivo de log do ouvinte a cada 2 minutos informando que não é possível conectar.Existe algo que não estamos configurando em nosso código ou no JBossMQ?Sou novo no JMS, então qualquer ajuda será muito apreciada.Obrigado.

Foi útil?

Solução

Você deve implementar em seu código cliente javax.jms.ExceptionListener.Você precisará de um método chamado onException.Quando a conexão do cliente for perdida, você deverá obter uma JMSException e este método será chamado automaticamente.A única coisa que você deve observar é se você está se desconectando intencionalmente do JBossMQ - isso também gerará uma exceção.

Algum código pode ser parecido com este:

    public void onException (JMSException jsme)
    {
        if (!closeRequested)
        {
            this.disconnect();
            this.establishConnection(connectionProps, queueName, uname, pword, clientID, messageSelector);
        }        
        else
        {
            //Client requested close so do not try to reconnect
        }
    }

No seu código "establishConnection", você implementaria um while(!initialized) construção que contém um try/catch dentro dela.Até ter certeza de que se conectou e se inscreveu corretamente, permaneça dentro do loop while capturando todos os JMS/Naming/etc.exceções.

Usamos esse método há anos com o JBossMQ e ele funciona muito bem.Nunca tivemos problemas com nossos clientes JMS que não se reconectavam após saltar o JBossMQ ou perder nossa conexão de rede.

Outras dicas

Eu recomendo fortemente que você use o Abstrações Spring para JMS, como MessageListenerContainer para lidar com reconexão, transações e pooling para você.Você só precisa fornecer um MessageListener e configurar o MessageListenerContainer com o ConnectionFactory e o contêiner fará o resto.

Se você é puramente um ouvinte e faz não outras chamadas JMS diferentes da configuração da conexão, a resposta "manipulador onException()" está correta.

Se você fizer alguma chamada JMS em seu código, apenas usar o retorno de chamada onException() não será suficiente.Os problemas são retransmitidos do provedor JMS para o aplicativo qualquer por meio de uma exceção em uma chamada de método JMS ou através do retorno de chamada onException().Não ambos.

Portanto, se você chamar qualquer método JMS do seu código, também desejará invocar essa lógica de reconexão se obtiver alguma exceção nessas chamadas.

Um conselho de experiência pessoal. Atualize para Mensagens JBoss. Já o vi em produção há 4 meses sem problemas.Possui failover totalmente transparente - entre muitos outros recursos.

Além disso, se você for com o Spring, seja muito cuidadoso com o JmsTemplate.

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