JMS conectando em host distintos [RESOLVIDO]

1 resposta
romarcio

Tenho a seguinte situação. Estou utilizando JMS com JBoss.
Tenho uma aplicação que ira consumir uma fila de mensagens que está em um JBoss.
Então tenho esse código abaixo, parte da classe que faz a conexão com a maquina que contém a fila.

Porém, existem 2 máquinas, o Host A e o Host B, no caso o A seria o principal, o B só entra em ação se a conexão com o A estiver morta.
O que fiz foi testar a conexão com o A e se não estiver operacional, me conecto ao B. Beleza, funciona quando eu starto a aplicação.
Mas, se no por exemplo o eu startar a aplicação e o A estiver operacional, a aplicação se conecta a ele, porém se ele fica não-operacional depois de um tempo, eu deveria tentar me conectar ao B, porém não consigo fazer isso.

Alguém tem alguma idéia :?:

public void connect() throws NamingException, JMSException {
        InitialContext initialContext;

        Properties properties = new Properties();
        properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        properties.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
        properties.put(Context.PROVIDER_URL, "jnp://" + hostA + ":" + portA); //HOST:PORT JBOSS

        initialContext = new InitialContext(properties);
        QueueConnectionFactory queueConnectionFactory = null;
        try
        {   //testa a conexao com o Host A, se falhar, cai na excecao e conecta ao Host B
            queueConnectionFactory = (QueueConnectionFactory) initialContext.lookup("ConnectionFactory");
        }
        catch(NamingException e)
        {
            e.printStackTrace();
            System.out.println("Sem Conexão com Host: "+ hostA + ":" + portA);
            try
            {
              properties.put(Context.PROVIDER_URL, "jnp://" + hostB + ":" + portB); //HOST:PORT JBOSS
              initialContext = new InitialContext(properties);
              queueConnectionFactory = (QueueConnectionFactory) initialContext.lookup("ConnectionFactory");
            }
            catch(NamingException f)
            {
                f.printStackTrace();
                System.out.println("Sem Conexão com Host: "+ hostB + ":" + portB );
            }
        }

        queueConnection = queueConnectionFactory.createQueueConnection();
        queue = (Queue) initialContext.lookup(destinationJndi); //Nome da fila
        queueSession = queueConnection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
        QueueReceiver queueReceiver = queueSession.createReceiver(queue);
        queueReceiver.setMessageListener(this);
        queueConnection.start();
    }

1 Resposta

romarcio

Acabei resolvendo esse problema com Socket. Utilizo o Socket para testar se a maquina esta on ou off. Fiz essa classe:

public void testaConexao() throws IOException, JMSException, NamingException {

        try {
            socket = new Socket(hostA, Integer.parseInt(portA));
            System.out.println("*** Conectado ao Host: "+hostA+":"+portA+" ***");
            connect(1);
        } catch (IOException ex) {
          //  ex.printStackTrace();
            System.out.println("*** Nao foi Possivel Conectar ao Host: "+hostA+":"+portA+" ***");
            try {
                socket = new Socket(hostB, Integer.parseInt(portB));
                System.out.println("*** Conectado ao Host: "+hostB+":"+portB+" ***");
                connect(2);
            } catch(IOException e) {
            //    e.printStackTrace();
                System.out.println("*** Nao foi Possivel Conectar ao Host: "+hostB+":"+portB+" ***");
            }
         } finally{
            if (socket != null) {
              socket.close();
            } 
        }
    }

Dai passo por parâmetro para o metodo connect 1 ou 2, e ele faço a conexão JMS para consumo da fila no jboss. Claro, dive que dar uma boa mudada no metodo connect que tinha posta.

Criado 5 de agosto de 2009
Ultima resposta 11 de ago. de 2009
Respostas 1
Participantes 1