Javax.naming.NoInitialContextException - Java

Вот мой код:

import javax.naming.InitialContext;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.QueueSender;
import javax.jms.DeliveryMode;
import javax.jms.QueueSession;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;

public class Sender
{
    public static void main(String[] args) throws Exception
    {
        // get the initial context
        InitialContext ctx = new InitialContext();

        // lookup the queue object
        Queue queue = (Queue) ctx.lookup("queue/queue0");

        // lookup the queue connection factory
        QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.
           lookup("queue/connectionFactory");

        // create a queue connection
        QueueConnection queueConn = connFactory.createQueueConnection();

        // create a queue session
        QueueSession queueSession = queueConn.createQueueSession(false,Session.DUPS_OK_ACKNOWLEDGE);

        // create a queue sender
        QueueSender queueSender = queueSession.createSender(queue);
        queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

        // create a simple message to say "Hello"
        TextMessage message = queueSession.createTextMessage("Hello");

        // send the message
        queueSender.send(message);

        // print what we did
        System.out.println("sent: " + message.getText());

        // close the queue connection
        queueConn.close();
    }
}

Eclipse не сообщает о каких-либо ошибках в приведенном выше коде - я могу успешно скомпилировать. Однако, когда я пытаюсь запустить его, я получаю следующее исключение:

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(Unknown Source)
  at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
  at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
  at javax.naming.InitialContext.lookup(Unknown Source)
  at Sender.main(Sender.java:21)

Может кто-нибудь помочь мне исправить ошибку? Я попытался исправить это несколько часов, но все еще не могу понять.

Ответ 1

Нам нужно указать INITIAL_CONTEXT_FACTORY, PROVIDER_URL, USERNAME, PASSWORD и т.д. JNDI для создания InitialContext.

В автономном приложении вы можете указать, что ниже

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, 
    "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://ldap.wiz.com:389");
env.put(Context.SECURITY_PRINCIPAL, "joeuser");
env.put(Context.SECURITY_CREDENTIALS, "joepassword");

Context ctx = new InitialContext(env);

Но если вы используете свой код в контейнере Java EE, эти значения будут извлекаться контейнером и используются для создания InitialContext, как показано ниже

System.getProperty(Context.PROVIDER_URL);

и

эти значения будут установлены при запуске контейнера в качестве аргументов JVM. Так что если вы используете код в контейнере, то будет работать

InitialContext ctx = new InitialContext();

Ответ 2

Если вы работаете в клиентской библиотеке EJB:

Вам нужно указать аргумент для получения начального контекста.

InitialContext ctx = new InitialContext();

Если вы этого не сделаете, он будет выглядеть в папке проекта для файла свойств. Также вы можете включить учетные данные или значения свойств в свой файл класса следующим образом:

Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
props.put(Context.PROVIDER_URL, "jnp://localhost:1099");

InitialContext ctx = new InitialContext(props);

URL_PKG_PREFIXES: Константа, которая содержит имя свойства среды для указания списка префиксов пакетов, которые будут использоваться при загрузке в контекстных фабриках URL.

Клиентская библиотека EJB является основной библиотекой для вызова удаленных компонентов EJB.
Эта библиотека может использоваться через InitialContext. Чтобы вызвать компоненты EJB, библиотека создает контекст клиента EJB через контекст URL factory. Единственная необходимая конфигурация - это проанализировать значение org.jboss.ejb.client.naming для свойства java.naming.factory.url.pkgs для создания экземпляра InitialContext.