Duvida JMS...javax.naming.NoInitialContextException: Need to specify class name in environment or sy

26 respostas
P

Caros,

estou tentando entender como funciona jms
e peguei um exemplo mas não estou conseguindo fazer
funcionar.

Está me dando o erro abaixo :

Exception in thread "main" javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
	at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
	at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
	at javax.naming.InitialContext.lookup(InitialContext.java:392)
	at EnviaFila.main(EnviaFila.java:11)

O que fiz até agora :

  • inicializei o Jboss
  • e do Eclipse estou tentado enviar e receber mensagens através de classes

O que estou fazendo de errado se alguém puder me ajudar …

agradeço…

abs

--jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost
--Assina

public class Assina {

    public static void main(String[] args) throws NamingException, JMSException {
                
        // obtém referências ao TopicConnectionFactory e à fila via JNDI        
        Context jndiContext = new InitialContext();
        TopicConnectionFactory connectionFactory = 
            (TopicConnectionFactory)jndiContext.lookup("ConnectionFactory"); 
        Topic topic = (Topic)jndiContext.lookup("topic/testTopic");

        // conecta à fila e inicia uma sessão
        TopicConnection connection = 
            connectionFactory.createTopicConnection();
        TopicSession session = connection.createTopicSession(false, 
            Session.AUTO_ACKNOWLEDGE);
        
        // recebe mensagens
        TopicSubscriber subscriber = session.createSubscriber(topic);
        connection.start();
        while (true) {
            TextMessage message = (TextMessage)subscriber.receive(1);
            if (message != null)
                System.out.println("Recebi: " + message.getText());
            }

        // libera recursos
        //subscriber.close();
        //session.close();        
        //connection.close();
    }
}

--
public class AssinaAssincrono {

    private class RecebeUmaMensagem implements MessageListener {
        public void onMessage(Message msg) {
           try {
               TextMessage message = (TextMessage)msg;
               if (message != null)
                   System.out.println("Recebi: " + message.getText());
           }
           catch (JMSException e) {
               System.out.println("Erro ao receber mensagem:" + e);
               e.printStackTrace();
           }
        }
    };

    public AssinaAssincrono() throws NamingException, JMSException {
                
        // obtém referências ao QueueConnectionFactory e à fila via JNDI        
        Context jndiContext = new InitialContext();
        TopicConnectionFactory connectionFactory = 
            (TopicConnectionFactory)jndiContext.lookup("ConnectionFactory"); 
        Topic topic = (Topic)jndiContext.lookup("topic/testTopic");

        // conecta à fila e inicia uma sessão
        TopicConnection connection = 
            connectionFactory.createTopicConnection();
        TopicSession session = connection.createTopicSession(false, 
            Session.AUTO_ACKNOWLEDGE);
        
        // recebe mensagens
        TopicSubscriber subscriber = session.createSubscriber(topic);
        subscriber.setMessageListener(new RecebeUmaMensagem());
        connection.start();

        // libera recursos
        //subscriber.close();
        //session.close();        
        //connection.close();
    }

    public static void main(String[] args) throws
            NamingException, JMSException, InterruptedException {
            
        new AssinaAssincrono();
        while (true)
            Thread.sleep(10000);
    }
}
--

public class Publica {

    public static void main(String[] args) throws NamingException, JMSException {

        // obtém referências ao QueueConnectionFactory e à fila via JNDI        
        Context jndiContext = new InitialContext();
        TopicConnectionFactory connectionFactory =
            (TopicConnectionFactory)jndiContext.lookup("ConnectionFactory");
        Topic topic = (Topic)jndiContext.lookup("topic/testTopic");

        // conecta ao tópico e inicia uma sessão
        TopicConnection connection =
            connectionFactory.createTopicConnection();
        TopicSession session = connection.createTopicSession(false, 
            Session.AUTO_ACKNOWLEDGE);
            
        // publica uma única mensagem
        TopicPublisher publisher = session.createPublisher(topic);
        TextMessage message = session.createTextMessage();
        message.setText("Oi via JMS");
        publisher.send(message);
        //publisher.publish(message);

        // libera recursos
        publisher.close();
        session.close();        
        connection.close();
    }
}
--

public class RecebeFila {

    public static void main(String[] args) throws NamingException, JMSException {
        // obtém referências ao QueueConnectionFactory e à fila via JNDI        
        Context jndiContext = new InitialContext();
        QueueConnectionFactory connectionFactory = 
            (QueueConnectionFactory)jndiContext.lookup("ConnectionFactory"); 
        Queue queue = (Queue)jndiContext.lookup("queue/testQueue");
        // conecta à fila e inicia uma sessão
        QueueConnection connection = 
            connectionFactory.createQueueConnection();
        QueueSession session = connection.createQueueSession(false, 
            Session.AUTO_ACKNOWLEDGE);
        // recebe mensagens
        QueueReceiver receiver = session.createReceiver(queue);
        connection.start();
        while (true) {
            TextMessage message = (TextMessage)receiver.receive(1);
            if (message != null)
                System.out.println("Recebi: " + message.getText());
            }
        // libera recursos
        //sender.close();
        //session.close();        
        //connection.close();
    }
}

26 Respostas

J

estou com o mesmo problema. Se vc conseguir resolver, podia postar a resposta ne?

valeu

Rafael_Carneiro

O contexto JNDI não está sendo encontrado. Onde está o seu arquivo jndi.properties?

J

independente do container, sempre precisa existir esse jndi.properties ?

Rafael_Carneiro

Não, apenas quando não existir um contexto.

J

Tem como vc explicar como eu defino esse contexto? No caso eu nao defini ele ainda…to usando o JDeveloper com o oc4j. O que eu preciso fazer pra definir o contexto?

Rafael_Carneiro

Você precisa saber as definições do seu container para configurar um contexto JNDI. Por exemplo, veja a configuração do JBoss: http://www.devx.com/assets/sourcecode/6451.zip

J

blz…já tenho o meu jndi.properties

# Configuracoes da API de fila jms.connectionfactory=java:comp/resource/ojmsdemo/QueueConnectionFactories/myQCF jms.connectionfactory=java:comp/resource/ojmsdemo jms.contextfactory= jms.initialcontextfactory=com.evermind.server.rmi.RMIInitialContextFactory jms.resource.queue=FILA1 #jms.jndi.providerurl= jms.jndi.providerurl=ormi://localhost:8080/servlet/AxisServlet security.principal=oc4jadmin security.credentials=123 #jms.jndi.adminurl= #jms.jndi.providerurl=

mas não ta funcionando

J

Reparei que no link que vc mandou do jboss, ele ta fazendo isso:

da onde ele tira o test, que eu nao vi em lugar nenhum

Rafael_Carneiro

Eu não saco muito do oc4j, acho que seria melhor você procurar alguma fonte no site dele.

J

Rafael, vc pode me explicar para que serve essas opções?

jms.connectionfactory=java:comp/resource/ojmsdemo/QueueConnectionFactories/myQCF jms.connectionfactory=java:comp/resource/ojmsdemo jms.jndi.providerurl

que URL é essa q devo informar? E essas classes, quer dizer que está no diretorio Java né? Mas procurei la e não encontrei, vc sabe me explicar?

Rafael_Carneiro
jms.connectionfactory=java:comp/resource/ojmsdemo/QueueConnectionFactories/myQCF

Essa linha define uma connection factory, que é uma Queue (fila).

jms.connectionfactory=java:comp/resource/ojmsdemo

Não entendi essa linha, pois o nome da propriedade (jms.connectionfactory) é o mesmo da propriedade anterior, então não faz sentido.

jms.jndi.providerurl

Aqui deve ficar a URL do seu servidor. Exemplo: http://localhost:1099

J

jms.connectionfactory=java:comp/resource/ojmsdemo/QueueConnectionFactories/myQCF

Essa linha define uma connection factory, que é uma Queue (fila).

Não entendi essa parte… onde fica isso? dentro da pasta java ne? Mas quando vc se refere a fila, vc esta querendo dizer que QueueConnectionFactories/myQCF é a classe da fila?

Rafael_Carneiro
Esse caminho é onde você irá buscar esse recurso na árvore JNDI na sua aplicação. Não sei qual é a classe dessa Queue (pode ser QueueConnectionFactories).

Esse caminho é onde você irá buscar esse recurso na árvore JNDI na sua aplicação. Não sei qual é a classe dessa Queue (pode ser QueueConnectionFactories).

J

O que eu devo colocar nessa propriedade?

J

Rafael,

estou tendo esse problema

09/01/12 11:21:57 Caused by: java.net.ConnectException: Connection refused: connect 09/01/12 11:21:57 at java.net.PlainSocketImpl.socketConnect(Native Method) 09/01/12 11:21:57 at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) 09/01/12 11:21:57 at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) 09/01/12 11:21:57 at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) 09/01/12 11:21:57 at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) 09/01/12 11:21:57 at java.net.Socket.connect(Socket.java:507) 09/01/12 11:21:57 at java.net.Socket.connect(Socket.java:457) 09/01/12 11:21:57 at java.net.Socket.<init>(Socket.java:365)

esse erro acontece quando eu tento obter a fila:

sendo que no meu arquivo jndi.properties está assim:

sabe me ajudar?

Rafael_Carneiro

A URL do seu servidor de aplicações.

J

Rafael,

ai é que ta a duvida…porque eu preciso apontar para o meu servidor de aplicações?

e o que eu preciso informar? somente o http://IP_SERVIDOR ou tambem a porta?

eu estou startando o container na minha maquina e coloquei http://localhost e não funcionou

Rafael_Carneiro

Porque o contexto JNDI precisa saber onde está o servidor de aplicações para obter os recursos.

Por exemplo, se você estiver com um AS local, tente configurar com http://localhost:1099.

J

1099 eh uma porta padrao para obtencao de recursos?

Rafael_Carneiro

Essa é a porta padrão do JBoss. Para o seu AS, você terá que ver qual é a porta que ele está configurado para rodar.

J

vou fazer o teste e já posto aqui o resultado

Rafael_Carneiro

Ok.

J

já existe uma aplicação usando fila e pelo que vi, ela ta apontando para essa url

tentei fazer isso na minha aplicação e não funcionou. COntinua dando o erro de ConexaoException: Connect refused

tentei fazer do jeito que vc falou também, usando a porta 1099 e ainda ta dando o mesmo erro

J

Se existir uma URL assim:

o que significa isso? Que o servidor vai acessar o diretorio “algumacoisa”, pela porta 23791?

é assim?

Rafael_Carneiro

javaCBA:
já existe uma aplicação usando fila e pelo que vi, ela ta apontando para essa url

tentei fazer isso na minha aplicação e não funcionou. COntinua dando o erro de ConexaoException: Connect refused

tentei fazer do jeito que vc falou também, usando a porta 1099 e ainda ta dando o mesmo erro

Você tem que ver na documentação do seu AS qual porta ele roda.

Rafael_Carneiro

javaCBA:
Se existir uma URL assim:

o que significa isso? Que o servidor vai acessar o diretorio “algumacoisa”, pela porta 23791?

é assim?

Significa que o servidor vai acessar a aplicação “algumacoisa” (que consequentemente estará em algum diretório ou dentro do AS) pela porta 23791.

Criado 19 de setembro de 2008
Ultima resposta 12 de jan. de 2009
Respostas 26
Participantes 3