2

グローバルDBと呼ぶDBにデータを保存するEJBアプリケーションをサーバー上で実行しています。を使用してアクセスするスタンドアロンアプリケーションである2つの正確なリモートSwingアプリケーションがあります。接続が失われた場合に備えて、独自のローカルDBがあります。GlassfishMySQLEJB'sRMI

私の目的は、2フェーズコミットプロトコルを実装することです。つまり、1人の参加者をコーディネーターとし、他の参加者を参加者にします。

私が考えることができた1つの方法は、JMSキューを介してメッセージを送信し、リモートクライアントにこれらのメッセージをリッスンさせて適切なアクションを実行させることを使用して実装することでした。これは、Swingアプリケーションの1つのButtonclickでメッセージを送信することで行います。問題は、私が実装したのが難しい場合でもMessageListeneronMessage()メソッドが他のクライアントへのメッセージを受信しないことです。

各リモートクライアントには、次のプロパティが設定されています。

 props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
 props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
 props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
 props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
 props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

これは、Glassfishサーバーに接続connectionFactoryQueueて、既に構成したにアクセスするためのものです。

サーバー上で実行されているアプリケーションのみがメッセージの受信を許可され、リモートアプリケーションは許可されていないためですか?

2台のPCのトポロジーに関する提案は大歓迎です。

4

2 に答える 2

1

このために、これらのシステム間でメッセージを交換するためにJMSを使用しました。つまり、1つはコーディネーターとして機能し、キューにメッセージを送信してプロセスを開始し、他のシステムはそれに応じてキューにメッセージを送り返します。

于 2013-03-19T09:31:32.317 に答える
0

EJB を使用しているため、JTA を使用してトランザクションを管理できます。これは、2 フェーズ コミット プロトコルの標準実装であり、JMS も JTA をサポートします。私の手順は次のとおりです。

  1. 必要に応じて、トランス属性を Required/Mandatory /Supports に設定します。
  2. クライアントで、EJB サーバーから jndi をルックアップして UserTransaction を取得します。
  3. クライアントからトランザクションを開始します。
  4. クライアント側でトランザクションをコミット/ロールバックする

これがいわゆる「顧客所有者トランザクション設計パターン」です。本javatransactionsbookを読むことをお勧めします

于 2013-03-15T09:02:48.687 に答える