15

これが私のコードです:

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)

誰でもバグを修正するのを手伝ってもらえますか? 数時間修正してみましたが、まだわかりません。

4

2 に答える 2

22

を作成するには、JNDI の INITIAL_CONTEXT_FACTORY、PROVIDER_URL、USERNAME、PASSWORD などを指定する必要があります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();
于 2013-04-03T05:34:15.417 に答える
0

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 コンポーネントを呼び出すために、ライブラリは URL コンテキスト ファクトリを介して EJB クライアント コンテキストを作成します。唯一必要な構成は、java.naming.factory.url.pkgs プロパティの値 org.jboss.ejb.client.naming を解析して、InitialContext をインスタンス化することです。

于 2015-09-04T09:24:12.900 に答える