1
resposta

Erro no console do JMS

Exception in thread "main" javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or in an application resource file: java.naming.factory.initial at java.naming/javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:685) at java.naming/javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:305) at java.naming/javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:342) at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409) at br.com.caelum.jms.TesteConsumidor.main(TesteConsumidor.java:19)

Estou com esse erro na saida do activemq, alguém poderia me ajudar com esse erro ?

Vou mandar meu código:

package br.com.caelum.jms;

import java.util.Scanner;

import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.Session; import javax.naming.InitialContext;

public class TesteConsumidor {

@SuppressWarnings("resource")
public static void main(String[] args) throws Exception {

    InitialContext context = new InitialContext();
    ConnectionFactory factory = (ConnectionFactory) context.lookup("ConnectionFactory");
    Connection connection = factory.createConnection();
    connection.start();

    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

    Destination fila = (Destination) context.lookup("financeiro");
    MessageConsumer consumer = session.createConsumer(fila );

    Message message = consumer.receive();
    System.out.println("Recebendo msg: " + message);

    new Scanner(System.in).nextLine();

    session.close();
    connection.close();
    context.close();


}

}

1 resposta

Olá Miguel, tudo bem?

O erro javax.naming.NoInitialContextException geralmente ocorre quando o contexto inicial do JNDI não pode ser criado. JNDI (Java Naming and Directory Interface) é uma API que permite aos clientes descobrir e olhar para dados e objetos através de um nome.

No seu caso, parece que o problema está na criação do InitialContext. O InitialContext está tentando encontrar a ConnectionFactory através do JNDI, mas não consegue encontrar as configurações do JNDI.

Você precisa ter um arquivo jndi.properties no seu classpath com as configurações corretas. Para o ActiveMQ, o arquivo jndi.properties deve ser algo parecido com isso:

java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = tcp://localhost:61616
queue.financeiro = financeiro

Este arquivo define a fábrica inicial do JNDI como org.apache.activemq.jndi.ActiveMQInitialContextFactory e o URL do provedor como tcp://localhost:61616. Ele também mapeia o nome financeiro para uma fila JMS.

O arquivo precisa estar no seu classpath quando você executa o seu programa. Se você estiver usando Maven, você pode colocar o arquivo jndi.properties no diretório src/main/resources, que é incluído no classpath por padrão.

Se você ainda estiver enfrentando problemas, verifique se o servidor ActiveMQ está rodando e ouvindo na porta 61616. Você também pode tentar usar o endereço IP 127.0.0.1 em vez de localhost no URL do provedor.