私は、リモート/ネットワーク リソースを JTA に準拠させるための基本原則を理解しようとしていますが、この件に関するドキュメント/ブログ/記事がほとんどないことに驚いています。
私が独自の特別なタイプのサーバー、「IAmYourFaja」サーバー、または「IAYF」を作成したとします。IAYFCP (IAYF Comms Protocol) と呼ばれる、このサーバーと対話するための独自の TCP ベースのネットワーク プロトコルを作成/実装したとします。最後に、IAYFCP を介してリモート IAYF サーバーにアクセスしてメッセージを送信するための Java クライアント ライブラリを作成しました。まだ私と一緒に?
現在、次の分散トランザクションを実行する必要があるユース ケースがあります。
- リレーショナル/JDBC データベースにレコードを挿入します。それから
- IAYF サーバーにメッセージを送信します。それから
- メッセージを JMS ブローカーにプッシュする
いずれかのコンポーネントで障害が発生した場合に、すべてをロールバックして、これらのネットワーク リソースの状態が変更されないように、これらをすべて処理する必要があります。
最終的な目標は、次のコードを実行できるようにすることです (ここでは疑似コード)。
// "JTA Example"
DistributedTransaction dTrans = getTransaction();
DataSource jdbcDataSource = getDataSource();
IayfClient iayfClient = getIayfClient();
JmsClient jmsClient = getJmsClient();
try {
dTrans.begin();
// 1. Insert a record in a relational/JDBC database
insertRecord(jdbcDataSource, "INSERT INTO widgets ( fizz, buzz ) VALUES ( 35, true )");
// 2. Fire a message to my IAYF server
iayfClient.fireMessage(IayfMessages.LukeIamYourFaja, 12);
// 3. Push a message to a JMS broker
jmsClient.publishMessage("Noooooooooo! (then jumps off ledge and Vader goes off to the bar)");
// If we get here then all 3 networked resources are ready/capable of committing, so do it, do it now!
dTrans.commit();
} catch(Throwable t) {
// Something went wrong, roll back all 3.
dTrans.rollback();
}
したがって、私が使用している JDBC ドライバーと JMS ライブラリーは、すでに JTA に準拠しています。つまり、このコードを可能にするには、IAYF クライアント ライブラリも JTA 互換にする必要があります。問題は、どの JTA インターフェイスを実装する必要があるのか わかりません。
いくつか質問があります:
- 実装する必要があるインターフェイス (およびその理由):
XAResource
、UserTransaction
、またはその両方? - JTA に準拠し、IAYF クライアント/サービスをトランザクション対応にするために必要なことはこれだけですか? 上記の「JTA の例」コードを期待どおりに動作させるために他に必要なことはありますか?
- 正誤問題: Java EE コンテナーには独自のトランザクション マネージャーがあり、ほぼゼロの構成で利用できますが、Java EE/JTA に準拠していないコンテナーでアプリを実行する場合は、独自のトランザクション マネージャーを提供する必要があります。これを達成するためにBitronixやAtomikosのようなものを使用できますか?