3

私は JMS を初めて使用し、スタンドアロン クライアントからリモート JMS キューに接続する際に問題があります。この問題を解決するためのヒントをいただければ幸いです。

現在、複数のクライアントで実行される JavaFX スタンドアロン アプリケーションと、リモートの Unix マシンで実行されている Glassfish サーバー 3.1.2.2 があります。スタンドアロン アプリからサーバー上にあるキューにメッセージをプッシュするのに苦労しています。

クライアント Mc: Windows PC (サーバーがインストールされていない) リモート Mc: Unix (GlassFish 3.1.2.2 がインストールされている)

サーバー上の JMS リソース:

JMS 宛先リソース

JNDI 名: jms/ReferralQueue
物理送信先名: ReferralQueue
リソース タイプ: javax.jms.Queue

JMS 接続ファクトリー

プール名: jms/ReferralConnectionFactory
JNDI 名: jms/ReferralConnectionFactory
リソース タイプ: javax.jms.QueueConnectionFactory

JMS サービス タイプ:組み込み
JMS メッセージ ストア タイプ:ファイル

サーバーに接続するためのクライアント側コード:

jms.プロパティ:

org.omg.CORBA.ORBInitialHost= UNIX MC URL
org.omg.CORBA.ORBInitialPort= 7676

リソース キャッシングを実装する Service Locator の設計

public class JMSServiceLocator {

    private static JMSServiceLocator singletonService = null;
    private static QueueConnectionFactory qFactory;
    private static Queue queue;
    private InitialContext context;
    private static Properties properties = new Properties();
    private Map cache;

    static {
        try {
            singletonService = new JMSServiceLocator();
        } catch (Exception e) {
            //error handling
        }
    }

    private JMSServiceLocator() {
        try {
            loadProperties();
            context = new InitialContext(properties);
            cache = Collections.synchronizedMap(new HashMap());
        } catch (Exception e) {
            //error handling
        }
    }

    public static JMSServiceLocator getInstance() {
        return singletonService;
    }


    public QueueConnectionFactory getQueueConnectionFactory() {

        String qConnFactoryName = "jms/ReferralConnectionFactory";
        qFactory = null;
        try {

            System.out.println("/********************Comment after Testing*****************************/");
            Hashtable env = context.getEnvironment();
            System.out.println("**env.size::" + env.size());
            Enumeration names = env.keys();
            while (names.hasMoreElements()) {
                String str = (String) names.nextElement();
                System.out.println("**" + str + "=" + env.get(str));
            }
            System.out.println("/**********************************************************************/");

            if (cache.containsKey(qConnFactoryName)) {
                qFactory = (QueueConnectionFactory) cache.get(qConnFactoryName);
            } else {
                qFactory = (QueueConnectionFactory) context.lookup(qConnFactoryName);
                cache.put(qConnFactoryName, qFactory);
            }
        } catch (Exception e) {
            //error handling
        }
        return qFactory;
    }

    public Queue getQueue() {
        String queueName = "jms/ReferralQueue";
        queue = null;
        try {
            if (cache.containsKey(queueName)) {
                queue = (Queue) cache.get(queueName);
            } else {
                queue = (Queue) context.lookup(queueName);
                cache.put(queueName, queue);
            }
        } catch (Exception e) {
          //error handling
        }        
    return queue;
    }

    private static void loadProperties() {
        //Load jms properties
    }
}

最終的にサーバーにメッセージを送信します:

JMSServiceLocator jmsLocator = JMSServiceLocator.getInstance();

QueueConnectionFactory qConnFactory = jmsLocator.getQueueConnectionFactory();
qConnection = qConnFactory.createQueueConnection();
session = qConnection.createSession(false, ession.AUTO_ACKNOWLEDGE);
queue = jmsLocator.getQueue();


// Push and publish the message
messageProducer = session.createProducer(queue);
textMessage = session.createTextMessage();
textMessage.setText(message);
messageProducer.send(textMessage);

うーん...今、私は奇妙な行動を観察しています...

クライアント マシン上に新しい GlassFish 3.1.2.2 サーバー インスタンスを作成しました。jndi、接続ファクトリ、jms キューはまったくありません。

このサーバー インスタンスを開始し、スタンドアロン クライアント アプリケーションを実行しました。奇妙なことに、すべてが正常に機能し、メッセージはリモート キューに直接プッシュされます。

この種の問題に遭遇した人はいますか?おそらく、アプリケーションが依存する GlassFish jar をクラスパスにロードしているのは、サーバー インスタンス (ランダムなインスタンスで、まったく関係のないもの) が開始されたときだけだと思います。

スタンドアロン アプリケーションのクラスパスに次の jar があります。

*C:\Program Files\glassfish-3.1.2.2\glassfish\lib\gf-client.jar *C:\Program Files\glassfish-3.1.2.2\glassfish\lib\appserv-rt.jar *C:\Program Files \glassfish-3.1.2.2\glassfish\lib\install\applications\jmsra\imqbroker.jar *C:\Program Files\glassfish-3.1.2.2\glassfish\lib\install\applications\jmsra\imqjmsra.jar

これをOracle JMSおよびGlassFishフォーラムにも投稿しましたが、解決策がありません。この問題に関するヘルプをいただければ幸いです。

ありがとう。

4

1 に答える 1

1

何が問題だったのか、もうお分かりだと思います。

JMS クライアント jar がクライアントにありませんでした (クライアント Mc: Windows PC (サーバーがインストールされていません))。

クライアントに Glassfish を完全にインストールする必要はありませんが、JMS クライアント jar (gf-client.jar) と gf-client.jar によって参照される他のすべての jar のみが必要です。

于 2013-01-07T19:28:43.037 に答える