glassfish
  1. glassfish
  2. GLASSFISH-18498

Failing to get JMS Queue using explicit remote JNDI lookup

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Duplicate
    • Affects Version/s: 3.1.2
    • Fix Version/s: None
    • Component/s: jms
    • Labels:
      None
    • Environment:

      Glassfish 3.1.1 Glassfish 3.1.2

      Description

      I've used to create to domains: domain1, domain2.
      Some applications inside domain2 used to get a JMS queue resource using explicit remote JNDI lookup to the domain1 JNDI server.

      It used to work using Glassfish 3.1.1 to deploy app1 on domain1 and app2 to domain2.

      Now, I've started to migrate from Glassfish 3.1.1 to Glassfish 3.1.2.

      The app2 inside domains2 using glassfish 3.1.1 cannot get a remote Queue anymore from domain1 using glassfish 3.1.2.

      Stack trace attached.

      1. EtlCvmRad.etlCvm-enet-extracao-escalonador-EscalonadorDeDespachantesEmpresasNet.geral.debug.log
        24 kB
        orair

        Activity

        Hide
        orair added a comment -

        Hi Zhao,
        I just construct the Context using InitialContext(Properties):
        if (remoteJNDIServerProperties.size() > 0)

        { return new InitialContext(remoteJNDIServerProperties); }

        else

        { return new InitialContext(); }

        After I get the queue calling ctx.lookup(String queueName):
        return (Queue) ctx.lookup(nomeJNDI_DestinatarioDeMensagens);

        Our relevant code are:
        1 - function to load configuration (Properties) from a .properties file called carregaArquivoDeConfiguracoesDeConexaoRemotaDaFabricaDeConexoes (may be translated to loadRemoteConnectionConfiguration)
        2 - function to create the context based on the Properties found inside .properties file called inicializaContexto (may be translated to initializeContext)
        3 - function to get the queue using explicit JNDI lookup called obtemFilaDeMensagens (may be translated to getMessageQueue)

        Source Code:
        (...)
        public void init() throws ErroDeInicializacaoDeSenderException {
        (...)
        Context contextoDaFilaDeMensagens;

        // Carrega o arquivo com as configurações a um servidor JNDI remoto para obtenção da fila de mensagens
        Properties propriedadesParaAcessoRemotoAFilaDeMensagens = carregaArquivoDeConfiguracoesDeConexaoRemotaDaFilaDeMensagens();

        // Inicializa o contexto para obter a fábrica de conexões
        contextoDaFilaDeMensagens = inicializaContexto(propriedadesParaAcessoRemotoAFilaDeMensagens);

        // Obtém a fila de mensagens do servidor JNDI
        this.filaDeMensagens = obtemFilaDeMensagens(contextoDaFilaDeMensagens, senderProperties);

        // Marca o Sender como inicializado
        this.senderInicializado = true;
        (...)

        /**

        • Obtém a fila de mensagens do servidor JNDI.
        • @param ctx
        • o contexto a ser acessado para a busca do recurso
        • @param senderProperties
        • as configurações do recurso
        • @return a fila de mensagens
        • @throws ErroDeInicializacaoDeSenderException
        • the erro de inicializacao de sender exception
          */
          private Queue obtemFilaDeMensagens(Context ctx, Properties senderProperties) throws ErroDeInicializacaoDeSenderException
          Unknown macro: { String nomeJNDI_DestinatarioDeMensagens = senderProperties.getProperty(PROPRIEDADE_NOME_JNDI_DESTINATARIO_DE_MENSAGENS); try { logger.debug("Buscando a fila JMS no servidor JNDI pelo nome <" + nomeJNDI_DestinatarioDeMensagens + ">"); return (Queue) ctx.lookup(nomeJNDI_DestinatarioDeMensagens); } catch (NamingException e) { throw new ErroDeInicializacaoDeSenderException("Erro ao inicializar Sender <" + this.getClass().getCanonicalName() + ">: problema na busca pelo nome JNDI da fila de mensagens <" + nomeJNDI_DestinatarioDeMensagens + ">.", e); } }

        /**

        • Inicializa contexto.
        • @param remoteJNDIServerProperties
        • o(a) remote jndi server properties
        • @return o(a) initial context
        • @throws ErroDeInicializacaoDeSenderException
        • the erro de inicializacao de sender exception
          */
          private InitialContext inicializaContexto(Properties remoteJNDIServerProperties) throws ErroDeInicializacaoDeSenderException {
          try
          Unknown macro: { // Caso tenha sido obtida alguma propriedade do arquivo de configurações de conexão remota, // iniciaremos o contexto com estas configurações if (remoteJNDIServerProperties.size() > 0) { return new InitialContext(remoteJNDIServerProperties); } else { return new InitialContext(); } }

          catch (NamingException e)

          { throw new ErroDeInicializacaoDeSenderException("Erro ao inicializar Sender <" + this.getClass().getCanonicalName() + ">: Falha ao obter o contexto inicial para a resolução de nomes JNDI. Configurações de conexão remota: <" + remoteJNDIServerProperties + ">", e); }

          }

        /**

        • Carrega arquivo de configurações de conexão remota da fábrica de conexões.
        • <p>
        • Este arquivo é opcional.<br>
        • Note que este arquivo define as propriedades para a conexão remota para a obtenção da fábrica de conexões.<br>
        • Recomenda-se que este arquivo só seja utilizado caso se queira que um cliente J2SE se conecte a um servidor JMS remoto.<br>
        • No caso de clientes J2EE, recomenda-se que a fábrica de conexões seja criada no próprio servidor de aplicações, porém acessando um servidor JMS
        • remoto.
        • </p>
        • @return as propriedades de configurações da conexão remota para obtenção da fábrica de conexões
        • @throws ErroDeInicializacaoDeSenderException
        • the erro de inicializacao de sender exception
          */
          private Properties carregaArquivoDeConfiguracoesDeConexaoRemotaDaFabricaDeConexoes() throws ErroDeInicializacaoDeSenderException {
          Properties remoteJNDIServerProperties = new Properties();
          InputStream remoteServerResourceStream = null;
          try {
          remoteServerResourceStream = Loader.getResourceAsStream(getNomeArquivoPropriedadesFabricaDeConexoesDoSenderRemoteServer());

        if (remoteServerResourceStream != null) {
        logger.debug("Encontrou configurações para o acesso remoto à fábrica de conexões no arquivo <"
        + getNomeArquivoPropriedadesFabricaDeConexoesDoSenderRemoteServer() + ">.");
        remoteJNDIServerProperties.load(remoteServerResourceStream);
        if (remoteJNDIServerProperties.size() > 0)

        { logger.debug("Iniciando o contexto para a obtenção do nome JNDI da fábrica de conexões com as configurações: " + remoteJNDIServerProperties); }

        else

        { logger.debug("Não encontrou propriedades com configurações para o acesso remoto à fábrica de conexões no arquivo <" + getNomeArquivoPropriedadesFabricaDeConexoesDoSenderRemoteServer() + ">. Será realizado o acesso com as configurações padrão."); }

        } else

        { logger.debug("Não encontrou configurações para o acesso remoto à fábrica de conexões no arquivo <" + getNomeArquivoPropriedadesFabricaDeConexoesDoSenderRemoteServer() + ">. Será realizado o acesso com as configurações padrão."); }

        } catch (FileNotFoundException e)

        { logger.warn("Arquivo de configurações para o acesso remoto à fábrica de conexões não encontrado. Arquivo procurado <" + getNomeArquivoPropriedadesFabricaDeConexoesDoSenderRemoteServer() + ">. As configurações de conexão remota serão ignoradas...", e); }

        catch (IOException e)

        { logger.warn("Problemas de leitura no arquivo de configurações de conexão remota à fábrica de conexões. Arquivo procurado <" + getNomeArquivoPropriedadesFabricaDeConexoesDoSenderRemoteServer() + ">. As configurações de conexão remota serão ignoradas...", e); }

        finally

        { IOUtils.closeQuietly(remoteServerResourceStream); }

        return remoteJNDIServerProperties;
        }

        BR,

        Orair.

        Show
        orair added a comment - Hi Zhao, I just construct the Context using InitialContext(Properties): if (remoteJNDIServerProperties.size() > 0) { return new InitialContext(remoteJNDIServerProperties); } else { return new InitialContext(); } After I get the queue calling ctx.lookup(String queueName): return (Queue) ctx.lookup(nomeJNDI_DestinatarioDeMensagens); Our relevant code are: 1 - function to load configuration (Properties) from a .properties file called carregaArquivoDeConfiguracoesDeConexaoRemotaDaFabricaDeConexoes (may be translated to loadRemoteConnectionConfiguration) 2 - function to create the context based on the Properties found inside .properties file called inicializaContexto (may be translated to initializeContext) 3 - function to get the queue using explicit JNDI lookup called obtemFilaDeMensagens (may be translated to getMessageQueue) Source Code: (...) public void init() throws ErroDeInicializacaoDeSenderException { (...) Context contextoDaFilaDeMensagens; // Carrega o arquivo com as configurações a um servidor JNDI remoto para obtenção da fila de mensagens Properties propriedadesParaAcessoRemotoAFilaDeMensagens = carregaArquivoDeConfiguracoesDeConexaoRemotaDaFilaDeMensagens(); // Inicializa o contexto para obter a fábrica de conexões contextoDaFilaDeMensagens = inicializaContexto(propriedadesParaAcessoRemotoAFilaDeMensagens); // Obtém a fila de mensagens do servidor JNDI this.filaDeMensagens = obtemFilaDeMensagens(contextoDaFilaDeMensagens, senderProperties); // Marca o Sender como inicializado this.senderInicializado = true; (...) /** Obtém a fila de mensagens do servidor JNDI. @param ctx o contexto a ser acessado para a busca do recurso @param senderProperties as configurações do recurso @return a fila de mensagens @throws ErroDeInicializacaoDeSenderException the erro de inicializacao de sender exception */ private Queue obtemFilaDeMensagens(Context ctx, Properties senderProperties) throws ErroDeInicializacaoDeSenderException Unknown macro: { String nomeJNDI_DestinatarioDeMensagens = senderProperties.getProperty(PROPRIEDADE_NOME_JNDI_DESTINATARIO_DE_MENSAGENS); try { logger.debug("Buscando a fila JMS no servidor JNDI pelo nome <" + nomeJNDI_DestinatarioDeMensagens + ">"); return (Queue) ctx.lookup(nomeJNDI_DestinatarioDeMensagens); } catch (NamingException e) { throw new ErroDeInicializacaoDeSenderException("Erro ao inicializar Sender <" + this.getClass().getCanonicalName() + ">: problema na busca pelo nome JNDI da fila de mensagens <" + nomeJNDI_DestinatarioDeMensagens + ">.", e); } } /** Inicializa contexto. @param remoteJNDIServerProperties o(a) remote jndi server properties @return o(a) initial context @throws ErroDeInicializacaoDeSenderException the erro de inicializacao de sender exception */ private InitialContext inicializaContexto(Properties remoteJNDIServerProperties) throws ErroDeInicializacaoDeSenderException { try Unknown macro: { // Caso tenha sido obtida alguma propriedade do arquivo de configurações de conexão remota, // iniciaremos o contexto com estas configurações if (remoteJNDIServerProperties.size() > 0) { return new InitialContext(remoteJNDIServerProperties); } else { return new InitialContext(); } } catch (NamingException e) { throw new ErroDeInicializacaoDeSenderException("Erro ao inicializar Sender <" + this.getClass().getCanonicalName() + ">: Falha ao obter o contexto inicial para a resolução de nomes JNDI. Configurações de conexão remota: <" + remoteJNDIServerProperties + ">", e); } } /** Carrega arquivo de configurações de conexão remota da fábrica de conexões. <p> Este arquivo é opcional.<br> Note que este arquivo define as propriedades para a conexão remota para a obtenção da fábrica de conexões.<br> Recomenda-se que este arquivo só seja utilizado caso se queira que um cliente J2SE se conecte a um servidor JMS remoto.<br> No caso de clientes J2EE, recomenda-se que a fábrica de conexões seja criada no próprio servidor de aplicações, porém acessando um servidor JMS remoto. </p> @return as propriedades de configurações da conexão remota para obtenção da fábrica de conexões @throws ErroDeInicializacaoDeSenderException the erro de inicializacao de sender exception */ private Properties carregaArquivoDeConfiguracoesDeConexaoRemotaDaFabricaDeConexoes() throws ErroDeInicializacaoDeSenderException { Properties remoteJNDIServerProperties = new Properties(); InputStream remoteServerResourceStream = null; try { remoteServerResourceStream = Loader.getResourceAsStream(getNomeArquivoPropriedadesFabricaDeConexoesDoSenderRemoteServer()); if (remoteServerResourceStream != null) { logger.debug("Encontrou configurações para o acesso remoto à fábrica de conexões no arquivo <" + getNomeArquivoPropriedadesFabricaDeConexoesDoSenderRemoteServer() + ">."); remoteJNDIServerProperties.load(remoteServerResourceStream); if (remoteJNDIServerProperties.size() > 0) { logger.debug("Iniciando o contexto para a obtenção do nome JNDI da fábrica de conexões com as configurações: " + remoteJNDIServerProperties); } else { logger.debug("Não encontrou propriedades com configurações para o acesso remoto à fábrica de conexões no arquivo <" + getNomeArquivoPropriedadesFabricaDeConexoesDoSenderRemoteServer() + ">. Será realizado o acesso com as configurações padrão."); } } else { logger.debug("Não encontrou configurações para o acesso remoto à fábrica de conexões no arquivo <" + getNomeArquivoPropriedadesFabricaDeConexoesDoSenderRemoteServer() + ">. Será realizado o acesso com as configurações padrão."); } } catch (FileNotFoundException e) { logger.warn("Arquivo de configurações para o acesso remoto à fábrica de conexões não encontrado. Arquivo procurado <" + getNomeArquivoPropriedadesFabricaDeConexoesDoSenderRemoteServer() + ">. As configurações de conexão remota serão ignoradas...", e); } catch (IOException e) { logger.warn("Problemas de leitura no arquivo de configurações de conexão remota à fábrica de conexões. Arquivo procurado <" + getNomeArquivoPropriedadesFabricaDeConexoesDoSenderRemoteServer() + ">. As configurações de conexão remota serão ignoradas...", e); } finally { IOUtils.closeQuietly(remoteServerResourceStream); } return remoteJNDIServerProperties; } BR, Orair.
        Hide
        David Zhao added a comment -

        Hi orair,

        I don't know why you failed in looking up remote queue at your side. But it works for me in my test. I would like sharing my test case with you:

        1. Suppose the default domain1 with all default configurations was already there after GlassFish installation.
        2. Create a new domain jms-sender.
        asadmin create-domain --user=admin --portbase 6000 jms-sender
        Then you will get the following ports:
        Using port 6048 for Admin.
        Using port 6080 for HTTP Instance.
        Using port 6076 for JMS.
        Using port 6037 for IIOP.
        Using port 6081 for HTTP_SSL.
        Using port 6038 for IIOP_SSL.
        Using port 6039 for IIOP_MUTUALAUTH.
        Using port 6086 for JMX_ADMIN.
        Using port 6066 for OSGI_SHELL.
        Using port 6009 for JAVA_DEBUGGER.
        3. Start domains.
        asadmin start-domain domain1
        asadmin start-domain jms-sender
        4. Create jms resources on different domains.
        asadmin create-jms-resource --user admin --port 4848 --target server --restype javax.jms.Queue --property imqDestinationName=isef_cvm jms/isef_cvm
        asadmin create-jms-resource --user admin --port 6048 --restype javax.jms.ConnectionFactory --property "AddressList=localhost\:7676" jms/SenderFactory
        5. Unzip the attached file NetBeansProjects.zip.
        6. Deploy "NetBeansProjects\receiver-mdb\dist\receiver-mdb.jar" to domain1.
        7. Deploy "NetBeansProjects\jms-sender\dist\jms-sender.ear" to jms-sender.
        8. Open browser, input url "http://localhost:6080/jms-sender-war/jmsServlet" and press Enter button.
        9. Check the server.log files of both domain1 and jms-sender.
        a) In server.log of jms-sender, it shows both queue and ConnectionFactory are got.
        [#|2012-03-14T15:09:13.473+0800|INFO|glassfish3.1.2|test.sender.SenderEjb|_ThreadID=27;_ThreadName=Thread-2;|Queue: Oracle GlassFish(tm) Server MQ Destination
        getName(): isef_cvm
        Class: com.sun.messaging.Queue
        getVERSION(): 3.0
        isReadonly(): false
        getProperties():

        {imqDestinationName=isef_cvm, imqDestinationDescription=A Description for the Destination Object}

        |#]

        [#|2012-03-14T15:09:13.474+0800|INFO|glassfish3.1.2|test.sender.SenderEjb|_ThreadID=27;_ThreadName=Thread-2;|CF: com.sun.messaging.jms.ra.ConnectionFactoryAdapter@2ff9fa|#]

        b) In server.log of domain1, it shows the jms message sent to the queue is received by MDB,
        [#|2012-03-14T15:09:13.485+0800|INFO|glassfish3.1.2|test.receiver.NewMessageBean|_ThreadID=22;_ThreadName=Thread-2;|Received message: Hello World!!! Wed Mar 14 15:09:13 CST 2012|#]

        Note: If your domain1 is security enabled, please uncomment the username/password setting lines in SenderEJB.java for that.

        Please check the source codes of SenderEjb.java for the details on how it looks up the remote queue and local ConnectionFactory via JNDI, let me know if you have further questions.

        Show
        David Zhao added a comment - Hi orair, I don't know why you failed in looking up remote queue at your side. But it works for me in my test. I would like sharing my test case with you: 1. Suppose the default domain1 with all default configurations was already there after GlassFish installation. 2. Create a new domain jms-sender. asadmin create-domain --user=admin --portbase 6000 jms-sender Then you will get the following ports: Using port 6048 for Admin. Using port 6080 for HTTP Instance. Using port 6076 for JMS. Using port 6037 for IIOP. Using port 6081 for HTTP_SSL. Using port 6038 for IIOP_SSL. Using port 6039 for IIOP_MUTUALAUTH. Using port 6086 for JMX_ADMIN. Using port 6066 for OSGI_SHELL. Using port 6009 for JAVA_DEBUGGER. 3. Start domains. asadmin start-domain domain1 asadmin start-domain jms-sender 4. Create jms resources on different domains. asadmin create-jms-resource --user admin --port 4848 --target server --restype javax.jms.Queue --property imqDestinationName=isef_cvm jms/isef_cvm asadmin create-jms-resource --user admin --port 6048 --restype javax.jms.ConnectionFactory --property "AddressList=localhost\:7676" jms/SenderFactory 5. Unzip the attached file NetBeansProjects.zip. 6. Deploy "NetBeansProjects\receiver-mdb\dist\receiver-mdb.jar" to domain1. 7. Deploy "NetBeansProjects\jms-sender\dist\jms-sender.ear" to jms-sender. 8. Open browser, input url "http://localhost:6080/jms-sender-war/jmsServlet" and press Enter button. 9. Check the server.log files of both domain1 and jms-sender. a) In server.log of jms-sender, it shows both queue and ConnectionFactory are got. [#|2012-03-14T15:09:13.473+0800|INFO|glassfish3.1.2|test.sender.SenderEjb|_ThreadID=27;_ThreadName=Thread-2;|Queue: Oracle GlassFish(tm) Server MQ Destination getName(): isef_cvm Class: com.sun.messaging.Queue getVERSION(): 3.0 isReadonly(): false getProperties(): {imqDestinationName=isef_cvm, imqDestinationDescription=A Description for the Destination Object} |#] [#|2012-03-14T15:09:13.474+0800|INFO|glassfish3.1.2|test.sender.SenderEjb|_ThreadID=27;_ThreadName=Thread-2;|CF: com.sun.messaging.jms.ra.ConnectionFactoryAdapter@2ff9fa|#] b) In server.log of domain1, it shows the jms message sent to the queue is received by MDB, [#|2012-03-14T15:09:13.485+0800|INFO|glassfish3.1.2|test.receiver.NewMessageBean|_ThreadID=22;_ThreadName=Thread-2;|Received message: Hello World!!! Wed Mar 14 15:09:13 CST 2012|#] Note: If your domain1 is security enabled, please uncomment the username/password setting lines in SenderEJB.java for that. Please check the source codes of SenderEjb.java for the details on how it looks up the remote queue and local ConnectionFactory via JNDI, let me know if you have further questions.
        Hide
        David Zhao added a comment -

        Hi orair,

        Could you confirm if you had a chance to try my demo projects? Does it work for you?

        Show
        David Zhao added a comment - Hi orair, Could you confirm if you had a chance to try my demo projects? Does it work for you?
        Hide
        orair added a comment -

        Unfortunatelly I couldn't test it yet, because a lot of deadlines.
        Sorry.

        I will test it as soon as possible.

        Br,
        Orair.

        Show
        orair added a comment - Unfortunatelly I couldn't test it yet, because a lot of deadlines. Sorry. I will test it as soon as possible. Br, Orair.
        Hide
        David Zhao added a comment -

        This defect is duplicate to GLASSFISH-6885. It will be followed up with 6885.

        Show
        David Zhao added a comment - This defect is duplicate to GLASSFISH-6885 . It will be followed up with 6885.

          People

          • Assignee:
            David Zhao
            Reporter:
            orair
          • Votes:
            1 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Time Tracking

              Estimated:
              Original Estimate - 2 days
              2d
              Remaining:
              Remaining Estimate - 2 days
              2d
              Logged:
              Time Spent - Not Specified
              Not Specified