Configurar Host de uma fila JMS no Glassfish?

Configurar Host de uma fila JMS no Glassfish?

Pessoal, estou começando a olhar JMS agora e estou utilizando o servidor que já com o Glassfish 3, embutido no NetBeans 6.9

Consegui configurar uma fila localmente, enviar/receber mensagens dessa fila.

A minha dúvida é como faço para acessar uma fila que esteja em outro servidor, em outro HOST.

PS: Eu encontrei dentro da pagina web de configuração do Glassfish o item Configuração -> Java Message Sevice -> Hosts JMS como criar um novo HOST JMS. E tb encontrei onde modificar o HOST DEFAULT do Glassfish. Mas eu queria saber onde posso setar esse host pra cada fila configurada. :?

Obrigado.

Isso não seria feito no código?

Pelo que sei de JMS no servidor vc cria a fila, mas a aplicação que vai enviar ou ler alguma coisa da fila deve ter o IP da máquina que possui o servidor, no seu caso o GlassFish.

Posta o seu código, o que faz o acesso a fila, vamos ver como vc está configurando.

Segui um tutorial de uma revista Java pra fazer essas classes, mas no tutorial a fila é local.
Gostaria de saber onde mudaria se essa fila estivesse em outro servidor, separado do envio/recepção.

Obrigado pela ajuda.

classe de envio de mensagem JMS (Managed Bean JSF)

@Named(value="JMSBean")
@Dependent
public class JMSBean {

    @Resource(name="jms/CF")
    ConnectionFactory qcf;
    
    @Resource(name="jms/Quotes")
    Destination dest;

    static int counter;

  public void send () throws JMSException {
    Connection conn = null;
    try {
      conn = qcf.createConnection();
      Session session = conn.createSession(true,
      Session.AUTO_ACKNOWLEDGE);
      MessageProducer  prod = session.createProducer(dest);
      TextMessage msg = session.createTextMessage
      ("^BVSP = $" + (counter++));
      prod.send(msg);
    }
    finally {
      if (conn != null) conn.close();
    }
  }
}

classe de recepção de mensagens JMS (Message-Driven Bean)

@MessageDriven(mappedName = "jms/Quotes", activationConfig =  {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
    })
public class QuotesConsumerBean implements MessageListener {

    private static BlockingQueue<String> msgsRecebidas = new LinkedBlockingQueue<String>();

    
    public QuotesConsumerBean() {
    }

    public void onMessage(Message message) {
        try {
          TextMessage msg = (TextMessage)message;
          msgsRecebidas.offer(msg.getText());
          System.out.println(msg.getText());
        } catch (final JMSException e) {
          System.out.println("Deu pau! - " + e);
        }
    }

    @Named(value="QuotesConsumerBean")
    @Dependent
    public static class Reader {
        public static String next () throws
        InterruptedException {
          return msgsRecebidas.poll();
        }
    }
}

Nunca usei JMS com GlassFish e nem com anotações, costuma utilizar com JBoss 4.2.3-GA.

Mas pelo que entendi, vc está fazendo uma aplicação que já está rodando dentro do GlassFlish, por isso não foi preciso setar IP e Porta de acesso no código.

Eu costumo fazer assim:

InitialContext initialContext = null; Properties properties = new Properties(); properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); //teria que ver qual URL_PKG_PREFIXES usar para o glassfish properties.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); properties.put(Context.PROVIDER_URL, "jnp://" + "172. 16.1.8" + ":" + "1099"); initialContext = new InitialContext(properties);

Tenta inserir esse código no seu código, mas dai tem que saber qual é a porta do GlassFish que está reservada para as filas.

Mas seria só um teste, não posso garantir que vai funcionar no GlassFish.

Ou talvez tenha alguma anotação para isso, ou mesmo alguma propriedade na anotação @Resource para setar o Ip.

Alguém aí que já tenha feito isso com Glassfish?
Realmente não sei como fazer isso.

Se eu tiver um servidor de fila em um IP 127.0.0.5, onde configuro esse ip. Acredito que seja dentro do glassfish, só não sei onde.

Pra deixar mais claro a minha dúvida.

Gostaria de saber como fazer se a minha fila JMS estiver em um outro servidor.
O que eu preciso configurar e onde?
Seria no GlassFish ou na classe utilizando alguma annotation?

Agradeço muito a quem puder me ajudar.

Obrigado.

Consegui enviar a mensagem para um topico Glassfish que está um servidor diferente da aplicação que está enviando a JMS.

Agora só falta descobrir como configurar o Message-Driven Bean para consumir esse topico.

Alguem tem alguma sugestão? :lol:

PS: O MSB está em um outro servidor, diferente de onde está o Topico.

Utilizando o código abaixo eu consegui enviar para a fila local(usando o “localhost”), mas qdo altero “localhost” para o número do ip, a aplicação fica parada tentando conectar, e depois dá uma exceção, tb postei a excessão abaixo do codigo.

Uma duvida, eu preciso configurar alguma coisa na Escuta do IIOP no servidor glassfish 10.73.3.152???

Obrigado. :slight_smile:

        Properties props = new Properties();        
        props.setProperty("org.omg.CORBA.ORBInitialHost", "iiop://10.73.3.152");
        //props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
        props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

        try {
            System.out.println("INICIA CONTEXTO");
            jndiContext = new InitialContext(props);

            System.out.println("CONEXAO");
            connectionFactory = (ConnectionFactory)jndiContext.lookup("jms/FabricaConexoes");
            
            System.out.println("FILA");
            queue = (Queue)jndiContext.lookup("jms/FilaServidor");

            connection = connectionFactory.createConnection();
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            // ---- Same sample with a queue ----
            messageProducer = session.createProducer(queue);
            //messageProducer = session.createProducer(topic);
            Quotes quote = new Quotes("^BVSP", new Date(), counter++, 0, 0, 0, (int)(Math.random() * 100));
            msg = session.createObjectMessage(quote);
            msg.setStringProperty("symbol", quote.symbol);
            msg.setFloatProperty("volume", quote.volume);

            messageProducer.send(msg);
            System.out.println("MENSAGEM ENVIADA PARA A QUEUE: " + quote);

            connection.close();

        } catch (NamingException e) {
            Logger.getLogger(JMSEnvio.class.getName()).log(Level.SEVERE, null, e);
        }
        catch (JMSException e) {
            Logger.getLogger(JMSEnvio.class.getName()).log(Level.SEVERE, null, e);
        }
        finally {
            System.out.println("ENDED.");
            //System.out.println("PROVIDER_URL: " + properties.get(Context.PROVIDER_URL));
            if (connection != null) connection.close();
        }


INFO: INICIA CONTEXTO
INFO: CONEXAO
GRAVE: org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No
at com.sun.corba.ee.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:3431)
at com.sun.corba.ee.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:3452)
at com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.(SocketOrChannelConnectionImpl.java:256)
at com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.(SocketOrChannelConnectionImpl.java:269)
at com.sun.corba.ee.impl.transport.SocketOrChannelContactInfoImpl.createConnection(SocketOrChannelContactInfoImpl.java:125)
at com.sun.corba.ee.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(CorbaClientRequestDispatcherImpl.java:188)
at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.request(CorbaClientDelegateImpl.java:186)
at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.is_a(CorbaClientDelegateImpl.java:352)
at org.omg.CORBA.portable.ObjectImpl._is_a(ObjectImpl.java:112)
at org.omg.CosNaming.NamingContextHelper.narrow(NamingContextHelper.java:69)
at com.sun.enterprise.naming.impl.SerialContext.narrowProvider(SerialContext.java:355)
at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:327)
at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:271)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at JMSEnvio.enviarMensagem(JMSEnvio.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:737)
at javax.el.BeanELResolver.invoke(BeanELResolver.java:467)
at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:246)
at com.sun.el.parser.AstValue.getValue(AstValue.java:111)
at com.sun.el.parser.AstValue.getValue(AstValue.java:163)
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:219)
at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:71)
at com.sun.faces.facelets.el.ELText$ELTextVariable.toString(ELText.java:207)
at com.sun.faces.facelets.compiler.AttributeInstruction.write(AttributeInstruction.java:82)
at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:75)
at com.sun.faces.facelets.compiler.UILeaf.encodeAll(UILeaf.java:176)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:273)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.RuntimeException: java.net.ConnectException: Connection refused: connect
at org.glassfish.enterprise.iiop.impl.IIOPSSLSocketFactory.createSocket(IIOPSSLSocketFactory.java:340)
at com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.(SocketOrChannelConnectionImpl.java:239)
… 62 more
Caused by: java.net.ConnectException: Connection refused: connect
at sun.nio.ch.Net.connect(Native Method)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:507)
at com.sun.corba.ee.impl.orbutil.ORBUtility.openSocketChannel(ORBUtility.java:106)
at org.glassfish.enterprise.iiop.impl.IIOPSSLSocketFactory.createSocket(IIOPSSLSocketFactory.java:325)
… 63 more

props.setProperty("org.omg.CORBA.ORBInitialHost", "iiop://10.73.3.152"); //props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");

Quando usa localhost, vc não colocou o ‘iiop://’, tentou o ip sem esse ‘iiop://’?

Outra coisa, e pelo nome da maquina, ao invés do Ip, chegou a tentar?

[quote=romarcio]props.setProperty("org.omg.CORBA.ORBInitialHost", "iiop://10.73.3.152"); //props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");

Quando usa localhost, vc não colocou o ‘iiop://’, tentou o ip sem esse ‘iiop://’?

Outra coisa, e pelo nome da maquina, ao invés do Ip, chegou a tentar?[/quote]

Tirei o ‘iiop://’ e tentei com IP e com o nome da maquina.
Nesses dois cenários o aplicativo envia a mensagem, mas a mensagem não chegou na maquina de destino.

O que eu percebi é que o glassfish LOCAL está recebendo essas mensagens e criando um DESTINO FÍSICO com o nome dessa Fila destino(FilaServidor).

PS: Se eu colocar um IP de uma maquina que nao possua servidor de fila, o aplicativo dá erro. Com isso, eu cheguei a conclusão que ele está reconhecendo o servidor que está nessa maquina 10.73.3.152. Só não entendi porque a mensagem que foi enviada, ficou armazenada neste DESTINO FISICO localmente.