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

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();
    }
}

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

valeu

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

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

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

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?

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

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

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

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

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?


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

[code]jms.connectionfactory=java:comp/resource/ojmsdemo  [/code]

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

[code]jms.jndi.providerurl[/code]

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

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

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

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

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

Essa linha define uma connection factory, que é uma Queue (fila).
[/quote]

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?


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).

O que eu devo colocar nessa propriedade?

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?

A URL do seu servidor de aplicações.

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

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.

1099 eh uma porta padrao para obtencao de recursos?