1

現在、HornetQ の学習に苦労しています。理論的には非常に簡単に見えますが、最も基本的な例でさえ実行するのに苦労しています。

これまでのところ、HornetQ をスタンドアロン サーバーとして起動し、メッセージを送信してから受信する単純なクライアントに接続しようとしました。

私が従った手順は次のとおり です

-HornetQ の最新バージョン (2.2.5) をダウンロードして解凍しました。- INSTALL_DIRECTORY\config\stand-alone\non-clustered\hornetq-jms.xml ファイルを変更して、必要なオブジェクトを作成しました。内容は次のとおりです。

<configuration xmlns="urn:hornetq"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="urn:hornetq ../schemas/hornetq-jms.xsd ">
        <connection-factory name="ConnectionFactory">
            <connectors>
                <connector-ref connector-name="netty"/>
            </connectors>
            <entries>
                <entry name="ConnectionFactory"/>
            </entries>
        </connection-factory>

        <queue name="OrderQueue">
            <entry name="queues/OrderQueue"/>
        </queue>
</configuration>

- ファイル INSTALL_DIRECTORY\config\stand-alone\non-clustered\hornetq-beans.xml には、JNDI サービスを開始するために必要な Bean が含まれています。

・INSTALL_DIRECTORY\config\stand-alone\non-clustered\フォルダにもjndi.propertiesというファイルがあります

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

クライアントコードは次のとおりです。

public void test()
    {
        try
        {
            ic = new InitialContext();

            cf = (ConnectionFactory)ic.lookup("/ConnectionFactory");

            orderQueue = (Queue)ic.lookup("/queues/OrderQueue");

            connection = cf.createConnection();

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

            producer = session.createProducer(orderQueue);
            consumer = session.createConsumer(orderQueue);

            connection.start();

            TextMessage message = session.createTextMessage("This is an order");
            producer.send(message);

            TextMessage receivedMessage = (TextMessage)consumer.receive();
            System.out.println("Got order: " + receivedMessage.getText());
        }
        catch (Exception e)
        {
           e.printStackTrace();
        }
    }

それでも、実行するたびに、次の例外でクラッシュします:

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:662)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:344)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)

実行するためにあらゆることを試したと思いますが、それでも私が間違っていることはわかりません。この問題に関する提案は大歓迎です!

4

3 に答える 3

1

まず、使用している HornetQ バージョンに直接関連するドキュメントから始めます。

クライアント コードにライブラリが不足している可能性があると思います。$HORNETQ_HOME/libクライアントの依存関係にコンテンツを追加して、それが機能するかどうかを確認してください。それ以外の場合は、質問を更新して、もう一度助けようとします:)

于 2011-12-09T20:00:54.657 に答える
0

jndi.propertiesファイルはクラスパスにありますか?サーバーの構成パスにあるように聞こえますが、クライアントコードがそれを見つけることができません。

于 2011-12-12T02:48:34.450 に答える
0

また、PROVIDER_URL、INITIAL_CONTEXT_FACTORY、および URL_PKG_PREFIXES の値を使用してハッシュテーブルを定義して、プログラムで情報をコンテキストに入れることもできます。それを InitialContext コンストラクターに渡します

Context ctxt = InitalContext(hashtable_w_values);

私にとってはうまくいきました。

于 2012-05-30T07:25:00.290 に答える