Oracle® Fusion Middleware

Oracle WebLogic Server Tuxedo Connectorプログラマーズ・ガイド

11g リリース1 (10.3.6)

B61627-04(原本部品番号:E13723-06)

2015年4月

このドキュメントは、Oracle WebLogic Tuxedo Connectorアプリケーション開発環境について紹介します。Oracle WebLogic ServerをOracle Tuxedoオブジェクトと相互運用できるようにするEJBの開発方法について説明します。

Oracle Fusion Middleware Oracle WebLogic Server WebLogic Tuxedo Connectorプログラマーズ・ガイド, 11g リリース1 (10.3.5)

B61627-04

Copyright © 2007, 2015, Oracle and/or its affiliates.All rights reserved.

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

タイトルおよび著作権情報

はじめに

- ドキュメントのアクセシビリティについて

- 表記規則

1 Oracle WebLogic Tuxedo Connectorプログラミングの概要

- このドキュメントの手引き

- Oracle WebLogic Tuxedo Connectorアプリケーションの開発

- Oracle WebLogic Tuxedo Connectorクライアントの開発

- Oracle WebLogic Tuxedo Connectorサーバーの開発

- Oracle WebLogic Tuxedo ConnectorとOracle Tuxedo CORBAオブジェクトの相互運用性

- Oracle WebLogic Tuxedo Connector JATMIプリミティブ

- Oracle WebLogic Tuxedo Connector TypedBuffers

2 Oracle WebLogic Tuxedo ConnectorクライアントEJBの開発

- アプリケーションとの接続および切断

- アプリケーションへの接続

- アプリケーションからの切断

- クライアントの基本操作

- Oracle Tuxedoオブジェクトの取得

- メッセージ・バッファリングの実行

- メッセージの送信および受信

- リクエスト/レスポンス通信

- 会話型通信

- メッセージのエンキューとデキュー

- Oracle Tuxedoオブジェクトへの接続の終了

- サンプル・クライアントEJB

3 Oracle WebLogic Tuxedo ConnectorサービスEJBの開発

- サービスEJBの基本操作

- サービス情報へのアクセス

- バッファ・メッセージ

- リクエストされたサービスの実行

- リクエスト/レスポンス通信でクライアント・メッセージを返す

- 会話型通信でtpsendおよびtprecvの使用

- サンプル・サービスEJB

4 RMI/IIOPおよびCORBAを相互に運用するOracle WebLogic Tuxedo Connectorの使用

- CORBA Java APIを用いてOracle WebLogic Tuxedo ConnectorクライアントBeanを開発する方法

- CosNamingサービスの使用

- サンプルToupperCorbaBean.javaコード

- FactoryFinderの使用

- WLECからOracle WebLogic Tuxedo Connectorへの移行

- サンプル・コード

- Oracle WebLogic Tuxedo Connector用のRMI/IIOPアプリケーションを開発する方法

- Oracle WebLogic Tuxedo Connectorを使用するために着信RMI/IIOPアプリケーションを変更する方法

- Oracle WebLogic Tuxedo Connectorを使用するために発信RMI/IIOPアプリケーションを開発する方法

- FederationURLをEJBに渡すためにejb-jar.xmlファイルを修正する方法

- オブジェクトにアクセスするためのFederationURLを使用するためにEJBを変更する方法

- FederationURLフォーマットの使用方法

- corbaloc URLフォーマットの使用

- corbaloc:tgiopの例

- -ORBInitRefの使用例

- -ORBDefaultInitRefの使用例

- corbaname URLフォーマットの使用

- -ORBInitRefの使用例

- Oracle Tuxedo CORBAアプリケーションに対するトランザクションを管理する方法

5 Oracle WebLogic Tuxedo Connector JATMIトランザクション

- グローバル・トランザクション

- JTA Transaction API

- JTAインタフェースのタイプ

- Transaction

- TransactionManager

- UserTransaction

- JTAトランザクション・プリミティブ

- トランザクションの定義

- トランザクションの開始

- TPNOTRANの使用

- トランザクションの終了

- Oracle WebLogic Tuxedo Connectorトランザクションのルール

- サンプル・トランザクション・コード

6 Oracle WebLogic Tuxedo Connector JATMI会話

- Oracle WebLogic Tuxedo Connectorの会話型通信の概要

- Oracle WebLogic Tuxedo Connectorの会話の特性

- Oracle WebLogic Tuxedo Connector JATMI会話プリミティブ

- Oracle WebLogic Tuxedo Connectorの会話型クライアントおよび会話型サーバーの作成

- 会話型クライアントの作成

- Oracle Tuxedo会話型サービスとの接続の確立

- サンプルTuxedoConversationBean.javaコード

- Oracle WebLogic Tuxedo Connectorの会話型サーバーの作成

- メッセージの送受信

- メッセージの送信

- メッセージの受信

- 会話の終了

- Oracle Tuxedoアプリケーションが開始した会話

- Oracle WebLogic Tuxedo Connectorアプリケーションが開始した会話

- 階層的な会話の終了

- 無秩序な切断の実行

- 会話型通信のイベントについて

- Oracle WebLogic Tuxedo Connectorの会話ガイドライン

7 Oracle WebLogic Tuxedo ConnectorでのFMLの使用

- FMLの概要

- Oracle WebLogic Tuxedo Connector FML API

- FMLフィールド表の管理

- mkfldclass32クラスに対するDynRdHdrプロパティの使用

- TypedFML32コンストラクタの使用

- TypedFML32でパフォーマンスの向上の実現

- tBridge XML/FML32変換

- FLAT

- NO

- FML32の考慮事項

- XmlFmlCnvクラスを使用したXMLとFML/FML32間の変換

- XmlFmlCnvクラスの制限事項

- MBSTRINGの使い方

- MBSTRINGデータのOracle Tuxedoドメインへの送信

- MBSTRINGデータのOracle Tuxedoドメインからの受信

- Oracle WebLogic Tuxedo ConnectorでのFMLの使用

8 Oracle WebLogic Tuxedo Connector JATMI VIEW

- Oracle WebLogic Tuxedo Connector VIEWバッファの概要

- VIEW記述ファイルの作成方法

- サンプルVIEW記述ファイル

- viewjコンパイラの使用方法

- VIEWバッファとの情報の受け渡し方法

- JATMIアプリケーションでのVIEWバッファの使用方法

- FML32バッファに対してVIEW32データを追加および取得する方法

- XmlViewCnvクラスを使用したXMLとView/View(32)間の変換

9 カスタムAppKeyプラグインの作成方法

- カスタム・プラグインの作成方法

- サンプル・カスタム・プラグイン

10 アプリケーション・エラーの管理

- アプリケーション・エラーのテスト

- 例外クラス

- 致命的なトランザクション・エラー

- Oracle WebLogic Tuxedo Connectorのタイムアウト条件

- ブロッキング・タイムアウトとトランザクション・タイムアウト

- commit()の影響

- TPNOTRANの影響

- アプリケーション・イベントのトラッキングのガイドライン

はじめに

ここでは、『WebLogic Tuxedo Connectorプログラマーズ・ガイド』で使用するドキュメント・アクセシビリティ機能と表記規則について説明します。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

Oracleサポートへのアクセス

サポートをご購入のOracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細情報はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoか、聴覚に障害があるお客様はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trsを参照してください。

表記規則

このドキュメントでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

斜体

イタリックは、ユーザーが特定の値を指定するプレースホルダー変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

1 Oracle WebLogic Tuxedo Connectorプログラミングの概要

以下の節では、Oracle WebLogic ServerとOracle Tuxedoの間で相互運用するアプリケーションのコードを記述するために使用する開発環境について説明します。

- このドキュメントの手引き

- Oracle WebLogic Tuxedo Connectorアプリケーションの開発

- Oracle WebLogic Tuxedo Connector JATMIプリミティブ

- Oracle WebLogic Tuxedo Connector TypedBuffers

注意:
Oracle WebLogic Server Enterprise JavaBeans (EJB)の開発方法については、『Oracle WebLogic Server Enterprise JavaBeansのプログラミング』を参照してください。

このドキュメントの手引き

このドキュメントは、Oracle WebLogic Tuxedo Connectorアプリケーション開発環境について紹介します。Oracle WebLogic ServerをOracle Tuxedoオブジェクトと相互運用できるようにするEJBの開発方法について説明します。

このドキュメントの構成は次のとおりです。

- 第1章「Oracle WebLogic Tuxedo Connectorプログラミングの概要」では、Oracle WebLogic ServerとOracle Tuxedoの間で相互運用するアプリケーションのコードを記述するために使用する開発環境について説明します。

- 第2章「Oracle WebLogic Tuxedo ConnectorクライアントEJBの開発」では、クライアントEJBの作成方法について説明します。

- 第3章「Oracle WebLogic Tuxedo ConnectorサービスEJBの開発」では、サービスEJBの作成方法について説明します。

- 第4章「RMI/IIOPおよびCORBAを相互に運用するOracle WebLogic Tuxedo Connectorの使用」では、Oracle Weblogic Tuxedo Connector用のCORBAアプリケーションを開発する方法について説明します。

- 第5章「Oracle WebLogic Tuxedo Connector JATMIトランザクション」では、グローバル・トランザクションの概要とそれらをアプリケーションで定義および管理する方法について説明します。

- 第6章「Oracle WebLogic Tuxedo Connector JATMI会話」では、会話の概要とそれらをアプリケーションで定義および管理する方法について説明します。

- 第7章「Oracle WebLogic Tuxedo ConnectorでのFMLの使用」では、フィールド操作言語(FML)の概要とOracle WebLogic Tuxedo ConnectorにおけるFMLの使用方法について説明します。

- 第8章「Oracle WebLogic Tuxedo Connector JATMI VIEW」では、Viewバッファの概要とそれらをアプリケーションで定義および管理する方法について説明します。

- 第9章「カスタムAppkeyプラグインの作成方法」では、カスタムAppKeyプラグインの開発方法について説明します。

- 第10章「アプリケーション・エラーの管理」では、エラー条件を管理し解釈するメカニズムについて説明します。

Oracle WebLogic Tuxedo Connectorアプリケーションの開発

注意:
Oracle WebLogic Tuxedo Connector JATMIの詳細は、「WebLogicクラスのJavadoc」を参照してください。Oracle WebLogic Tuxedo Connectorクラスは、weblogic.wtc.jatmiパッケージおよびweblogic.wtc.gwtパッケージに含まれています。

アプリケーションのロジックを表現するJavaコードに加えて、Oracle WebLogic ServerとOracle Tuxedoの間のインタフェースを提供するJava Application-to-Transaction Monitor Interface (JATMI)を使用します。

Oracle WebLogic Tuxedo Connectorクライアントの開発

注意:
詳細については、第2章「Oracle WebLogic Tuxedo ConnectorクライアントEJBの開発」を参照してください。

クライアント・プロセスはユーザーの入力を受け取り、リクエストされたサービスを提供するサーバー・プロセスにサービス・リクエストを送信します。Oracle Weblogic Tuxedo Connector JATMIクライアント・クラスは、Oracle Tuxedoで検出されたサービスにアクセスするクライアントを作成するために使用します。これらのクライアント・クラスは、Oracle WebLogic Tuxedo Connector WTCServer MBeanを介して提供される任意のサービスに使用できます。

Oracle WebLogic Tuxedo Connectorサーバーの開発

注意:
詳細については、第3章「Oracle WebLogic Tuxedo ConnectorサービスEJBの開発」を参照してください。

サーバーは、任意の数のサービスを提供するプロセスです。サーバーは頻繁にサービス・リクエストのメッセージ・キューをチェックし、それらを適切なサービス・サブルーチンにディスパッチします。Oracle WebLogic Tuxedo Connectorは、EJBを使用してOracle Tuxedoクライアントが呼び出すサービスを実装します。

Oracle WebLogic Tuxedo ConnectorとOracle Tuxedo CORBAオブジェクトの相互運用性

注意:
詳細については、第4章「RMI/IIOPおよびCORBAを相互に運用するOracle WebLogic Tuxedo Connectorの使用」を参照してください。

Oracle WebLogic Tuxedo Connectorは、Oracle WebLogic ServerとOracle Tuxedo CORBAオブジェクトの間に双方向の相互運用性を提供します。Oracle WebLogic Tuxedo Connectorは次のことを可能にします。

- Oracle Tuxedo CORBAオブジェクトが、RMI/IIOP API (着信)を使用してOracle WebLogic ServerにデプロイされたEJBを呼び出すことができます。

- オブジェクト(EJBまたはRMIオブジェクトなど)が、RMI/IIOP API (発信)を使用してOracle TuxedoにデプロイされたCORBAオブジェクトを呼び出すことができます。

- オブジェクト(EJBまたはRMIオブジェクトなど)が、CORBA Java API (発信)を使用してOracle TuxedoにデプロイされたCORBAオブジェクトを呼び出すことができます。

Oracle WebLogic Tuxedo Connector JATMIプリミティブ

JATMIは、トランザクションの開始と終了、バッファの割当てと解放、およびクライアントとサーバー間の通信の提供に使用するプリミティブのセットです。

表1-1 JATMIプリミティブ

名前

操作

tpacall

リクエスト/レスポンス通信でOracle Tuxedoサービスの非同期呼出しに使用します。tpacallには以下の2つの形式があります。

- 遅延同期

- 非同期

tpcall

リクエスト/レスポンス通信でOracle Tuxedoサービスの同期呼出しに使用します。

tpconnect

Oracle Tuxedo会話型サービスとの接続を確立するために使用します。

tpdiscon

会話を管理するプロセスによって実行された場合に会話型接続を中止し、TPEV_DISCONIMMイベントを生成するために使用します。

tpdequeue

リクエスト/レスポンス通信でOracle Tuxedo /Qからメッセージを受信するために使用します。

tpenqueue

リクエスト/レスポンス通信でOracle Tuxedo /Qにメッセージを配置するために使用します。

tpgetrply

リクエスト/レスポンス通信でOracle Tuxedoサービスから応答を取得するために使用します。

tprecv

対話通信でOracle Tuxedoアプリケーションからオープンな接続を介してデータを受信するために使用します。

tpsend

会話型通信でOracle Tuxedoアプリケーションにオープンな接続を介してデータを送信するために使用します。

tpterm

Oracle Tuxedoオブジェクトへの接続を終了するために使用します。

Oracle WebLogic Tuxedo Connector TypedBuffers

Oracle WebLogic Tuxedo Connectorは、Oracle Tuxedoの型付きバッファに対応するTypedBuffersというインタフェースを提供します。メッセージは、サーバーの型付きバッファに渡されます。Oracle WebLogic Tuxedo Connectorは、次のバッファ・タイプを提供します。

表1-2 TypedBuffers

バッファ・タイプ

説明

TypedString

データがNULL文字で終了する文字の配列である場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: STRING。

TypedCArray

データが、NULL可能な文字の未定義配列(バイト配列)である場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: CARRAY。

TypedFML

データが自己定義である場合に使用されるバッファ・タイプ。各データ・フィールドは独自の識別子、オカレンス番号、および可能であれば長さインジケータを保持します。Oracle Tuxedoでは次に相当: FML。

TypedFML32

TypeFMLに似たバッファ・タイプですが、より大きい文字フィールド、より多くのフィールド、およびより大きいバッファ全体に対して使用可能です。Oracle Tuxedoでは次に相当: FML32。

TypedXML

データがXMLベースのメッセージである場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: XML (Tuxedoリリース7.1以降)。

TypedVIEW

VIEW記述ファイルを用いてバッファ構造を定義するためにアプリケーションがJava構造体を使用するとき、使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: VIEW。

TypedVIEW32

VIEWに似たバッファ・タイプですが、より大きい文字フィールド、より多くのフィールド、およびより大きいバッファ全体に対して使用可能です。Oracle Tuxedoでは次に相当: VIEW32。

TypedMBString

データがマルチバイト文字をサポートする多様な文字列である場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: MBSTRING。

2 Oracle Weblogic Tuxedo ConnectorクライアントEJBの開発

以下の節では、ユーザーの入力を受け取り、サーバー・プロセスまたはリクエストされたサービスを提供する発信オブジェクトにサービス・リクエストを送信するクライアントEJBの作成方法について説明します。

- アプリケーションとの接続および切断

- クライアントの基本操作

- サンプル・クライアントEJB

Oracle Weblogic Tuxedo Connector JATMIクライアント・クラスは、Oracle Tuxedoで検出されたサービスにアクセスするクライアントを作成するために使用します。

注意:
Oracle WebLogic Tuxedo Connector JATMIの詳細は、「WebLogicクラスのJavadoc」を参照してください。Oracle WebLogic Tuxedo Connectorクラスは、weblogic.wtc.jatmiパッケージおよびweblogic.wtc.gwtパッケージに含まれています。

アプリケーションとの接続および切断

Oracle TuxedoおよびOracle WebLogic Tuxedo Connectorは、それぞれ異なった方法でサービスに接続します。

アプリケーションへの接続

次の節では、Oracle TuxedoおよびOracle WebLogic Tuxedo Connectorがアプリケーションに接続する方法を比較します。

- Oracle Tuxedoは、アプリケーションに接続するためにtpinit()を使用します。

- Oracle WebLogic Tuxedo Connectorは、Oracle Tuxedoサービスへのパスを作成するために必要とされる情報を提供するためにWTCServer MBeanを使用します。セキュリティおよびクライアント認証は、WTCServer MBeanのRemote TDMコンポーネントおよびImported Services MBeanコンポーネントを構成することで提供されます。この経路は、Oracle WebLogic Server起動時に、WTCServer MBeanがconfig.xmlファイル内に存在していて、サーバーにターゲットとして割り当てられている場合に、作成されます。

- Oracle WebLogic Tuxedo ConnectorはTuxedoConnectionFactoryを使用してTuxedoConnectionオブジェクトを取得した後、getTuxedoConnection()を使用してOracle Tuxedoオブジェクトへの接続を作成します。次の例は、Oracle WebLogic ServerアプリケーションがOracle WebLogic Tuxedo Connectorを使用してどのようにOracle Tuxedoアプリケーションに接続するのかを示しています。

例2-1 Oracle Tuxedoアプリケーションに接続するためのサンプル・クライアント・コード

.
.
.
try {
ctx = new InitialContext();
tcf =
(TuxedoConnectionFactory)
ctx.lookup("tuxedo.services.TuxedoConnection");
} catch (NamingException ne) {

// Could not get the tuxedo object, throw TPENOENT
throw new TPException(TPException.TPENOENT,
"Could not get TuxedoConnectionFactory : " + ne);
}

myTux = tcf.getTuxedoConnection();
.
.
.

アプリケーションからの切断

次の節では、Oracle TuxedoおよびOracle WebLogic Tuxedo Connectorがアプリケーションとの接続を切断する方法を比較します。

- Oracle Tuxedoは、アプリケーションとの接続を切断するためにtpterm()を使用します。

- Oracle WebLogic Tuxedo Connectorは、JATMIプリミティブtpterm()を使用してOracle Tuxedoオブジェクトへの接続を終了します。

- Oracle WebLogic Tuxedo Connectorは、WTCServer MBeanが新しいターゲット・サーバーに割り当てられるとき、またはサーバーの停止時にOracle Tuxedoサービスへの経路を閉じます。

クライアントの基本操作

クライアント・プロセスは、JavaおよびJATMIプリミティブを使用して、次の基本アプリケーション・タスクを提供します。

- Oracle Tuxedoオブジェクトの取得

- メッセージ・バッファリングの実行

- メッセージの送信および受信

- Oracle Tuxedoオブジェクトへの接続の終了

クライアントは、アプリケーションとの接続を切断する前に、いくつでもサービス・リクエストを送信および受信できます。

Oracle Tuxedoオブジェクトの取得

TuxedoConnectionFactoryを使用してJNDIツリーで「tuxedo.services.TuxedoConnection」をルックアップすることによって、リモート・ドメインへの接続を確立し、TuxedoConnectionオブジェクトを取得します。

メッセージ・バッファリングの実行

アプリケーションとOracle Tuxedoの間でメッセージの送信および受信を行う場合は、次のTypedBuffersを使用します。

表2-1 TypedBuffers

バッファ・タイプ

説明

TypedString

データがNULL文字で終了する文字の配列である場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: STRING。

TypedCArray

データが、NULL可能な文字の未定義配列(バイト配列)である場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: CARRAY。

TypedFML

データが自己定義である場合に使用されるバッファ・タイプ。各データ・フィールドは独自の識別子、オカレンス番号、および可能であれば長さインジケータを保持します。Oracle Tuxedoでは次に相当: FML。

TypedFML32

TypeFMLに似たバッファ・タイプですが、より大きい文字フィールド、より多くのフィールド、およびより大きいバッファ全体に対して使用可能です。Oracle Tuxedoでは次に相当: FML32。

TypedXML

データがXMLベースのメッセージである場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: XML (Tuxedoリリース7.1以降)。

TypedVIEW

VIEW記述ファイルを用いてバッファ構造を定義するためにアプリケーションがJava構造体を使用するとき、使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: VIEW。

TypedVIEW32

VIEWに似たバッファ・タイプですが、より大きい文字フィールド、より多くのフィールド、およびより大きいバッファ全体に対して使用可能です。Oracle Tuxedoでは次に相当: VIEW32。

TypedMBString

データがマルチバイト文字をサポートする多様な文字列である場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: MBSTRING。

メッセージの送信および受信

Oracle WebLogic Tuxedo Connectorクライアントは、Oracle Tuxedoサービス・アプリケーションとの間で以下の3タイプの通信をサポートしています。

- リクエスト/レスポンス通信

- 会話型通信

- メッセージのエンキューとデキュー

リクエスト/レスポンス通信

注意:
Oracle WebLogic Tuxedo Connectorでは、メッセージ・リクエストの優先度を設定するためのJATMIプリミティブを提供していません。Oracle WebLogic Tuxedo Connectorクライアントから発信されるすべてのメッセージは、メッセージ優先度が50です。

Oracle WebLogic Tuxedo Connectorクライアント・アプリケーションとOracle Tuxedo間でリクエストを行い、レスポンス・メッセージを受信するには、次のJATMIプリミティブを使用します。

表2-2 JATMIプリミティブ

名前

操作

tpacall

Oracle Tuxedoサービスの非同期呼出しに使用します。このJATMIプリミティブには以下の2つの形式があります。

- 遅延同期

- 非同期

tpcall

Oracle Tuxedoサービスの同期呼出しに使用します。

tpgetrply

Oracle Tuxedoサービスへの遅延同期呼出しからの応答を取り出すために使用します。

tpcancel

tpacallによって返され、呼出し記述子に対応する未処理のメッセージ応答を取り消すために使用します。

注意: tpcancelを使用して、トランザクションに関連付けられている呼出し記述子を取り消すことはできません。

同期サービス呼出しの使用

tpcallは、サービスにリクエストを送信し、同期して応答を待つ場合に使用します。指定したサービスには、Oracle Tuxedoアプリケーションによって通知する必要があります。論理的には、tpcall()の機能は、tpacall()に次いで直ちにtpgetreply()を呼び出した場合と同じです。

遅延同期サービス呼出しの使用

遅延同期tpacallを使用すると、Oracle Tuxedoサービスにリクエストを送信し、応答の待機を遅らせることができます。これにより、リクエストを送信し、別の作業を行ってから、応答を取り出すことができます。

遅延tpacall()サービス呼出しは、Oracle Tuxedoサービスにリクエストを送信し、直ちに呼出しから復帰します。指定したサービスには、Oracle Tuxedoアプリケーションによって通知する必要があります。呼出しが正常に終了すると、tpacall()は記述子として機能するオブジェクトを返します。これで呼出しスレッドでは、他のタスクを実行できるようになります。呼出し記述子を使用すると、以下のことを行えます。

- tpgetreply()を使用して送信したリクエストに対応した応答を取得します。

- tpcancel()を使用して未処理のメッセージ応答を取り消します。

応答を取り出す場合は、tpgetreply()を使用して、tpacall()によって返される呼出し記述子を指定して応答をデキューします。応答がすぐに取り出せない場合、呼出しスレッドは応答をポーリングします。

tpacall()がトランザクションに関与している場合、tpgetreply()を使用して応答を受け取ってからでないと、トランザクションがコミットされません。tpcancelを使用して、トランザクションに関連付けられている呼出し記述子を取り消すことはできません。たとえば、1つのトランザクションで3つのtpacall()リクエストを発行する場合、トランザクションをコミットするには、3つのtpgetreply()呼出しを行い、各リクエストの応答のデキューに成功する必要があります。

非同期呼出しの使用

非同期のtpacallを使用すると、Oracle Tuxedoサービスにリクエストを送信してから、スレッド・プールへの呼出しを実行したスレッド・リソースを解放できます。これにより、大量の未処理リクエストを少数のスレッドで処理することができます。

非同期のtpacall()サービス呼出しは、リクエストをOracle Tuxedoサービスに送信します。指定したサービスには、Oracle Tuxedoアプリケーションによって通知する必要があります。呼出しが正常に終了すると、非同期のtpacall()は記述子として機能するオブジェクトを返します。これで呼出しスレッドでは、他のタスクを実行できるようになります。呼出し記述子を使用すると、送信したメッセージ・リクエストに対応したTpacallAsynchReplyからのメッセージ応答を識別したり、tpcancel()を使用して未処理のメッセージ応答を取り消ししたりできます。

注意:
呼出し記述子を使用して、tpgetreply()を呼び出すことはできません。

サービスの応答が用意されたら、別のスレッドでcallbackオブジェクトが呼び出されます。元のリクエストが成功した場合、TpacallAsynchReply.sucessメソッドがサービスからの応答を返します。元のリクエストが失敗した場合、TpacallAsynchReply.failureメソッドがエラー・コードを返します。

以下のガイドラインに従って、callbackオブジェクトを実装する必要があります。

- 応答スレッドは、スレッド・プールから取得します。非同期のtpacall()を実行するスレッドは、応答メッセージを待ちません。

- 応答スレッドのユーザー・コンテキストは、非同期tpacall()の元の呼出し側のコンテキストに戻ります。

- コンテキストを復元し、非同期のtpacall()が発行されたときに中断された処理を再開するのは、コールバック・オブジェクトの役割となります。

- 開発者は、マルチスレッド環境で処理を同期させる必要があります。たとえば、非同期のtpacall()リクエストを発行し、応答が直ちに返される場合は、呼出しスレッドが終了する前に、応答スレッドによってコールバック・オブジェクトを変更することができます。

- 応答スレッドは、呼出しスレッドのトランザクション・コンテキストを保持しません。

- 非同期のtpacall()がトランザクションに関与している場合、TpacallAsynchReplyを使用して応答を受け取ってからでないと、トランザクションがコミットされません。tpcancelを使用して、トランザクションに関連付けられている呼出し記述子を取り消すことはできません。

会話型通信

注意:
会話型通信の詳細は、第6章「Oracle Weblogic Tuxedo Connector JATMI会話」を参照してください。

以下の会話プリミティブは、Oracle Tuxedoサービスと通信する会話型クライアントを作成する際に使用します。

表2-3 Oracle WebLogic Tuxedo Connectorの会話型クライアントのプリミティブ

名前

操作

tpconnect

Oracle Tuxedo会話型サービスとの接続を確立するために使用します。

tpdiscon

会話を管理するプロセスによって実行された場合に接続を中止し、TPEV_DISCONIMMイベントを生成するために使用します。

tprecv

Oracle Tuxedoアプリケーションからオープンな接続を介してデータを受信するために使用します。

tpsend

Oracle Tuxedoアプリケーションにオープンな接続を介してデータを送信するために使用します。

メッセージのエンキューとデキュー

Oracle WebLogic Tuxedo Connectorクライアント・アプリケーションとOracle Tuxedoの間のメッセージをエンキューおよびデキューするには、次のJATMIプリミティブを使用します。

表2-4 JATMIプリミティブ

名前

操作

tpdequeue

Oracle Tuxedo /Qからのメッセージ受信に使用します。

tpenqueue

Oracle Tuxedo /Qにメッセージを配置するために使用します。

Oracle Tuxedoオブジェクトへの接続の終了

オブジェクトへの接続を終了し、その後このオブジェクトで操作を行わないようにするには、tpterm()を使用します。

サンプル・クライアントEJB

次のJavaコードは、サーバーに文字列引数を送信し、サーバーから応答文字列を受信するToupperBean.javaクライアントEJBの例です。

例2-2 サンプル・クライアント・アプリケーション

.
.
.
public String Toupper(String toConvert)
throws TPException, TPReplyException
{
Context ctx;
TuxedoConnectionFactory tcf;
TuxedoConnection myTux;
TypedString myData;
Reply myRtn;
int status;

log("toupper called, converting " + toConvert);

try {
ctx = new InitialContext();
tcf = (TuxedoConnectionFactory) ctx.lookup(
"tuxedo.services.TuxedoConnection");
}
catch (NamingException ne) {
// Could not get the tuxedo object, throw TPENOENT
throw new TPException(TPException.TPENOENT, "Could not get
TuxedoConnectionFactory : " + ne);
}

myTux = tcf.getTuxedoConnection();

myData = new TypedString(toConvert);

log("About to call tpcall");
try {
myRtn = myTux.tpcall("TOUPPER", myData, 0);
}
catch (TPReplyException tre) {
log("tpcall threw TPReplyExcption " + tre);
throw tre;
}
catch (TPException te) {
log("tpcall threw TPException " + te);
throw te;
}
catch (Exception ee) {
log("tpcall threw exception: " + ee);
throw new TPException(TPException.TPESYSTEM, "Exception: " + ee);
}
log("tpcall successfull!");

myData = (TypedString) myRtn.getReplyBuffer();

myTux.tpterm();// Closing the association with Tuxedo

return (myData.toString());
}
.
.
.

3 Oracle WebLogic Tuxedo ConnectorサービスEJBの開発

以下の節では、Oracle WebLogic Tuxedo ConnectorサービスEJBの作成方法について説明します。

- サービスEJBの基本操作

- サンプル・サービスEJB

サービスEJBの基本操作

サービス・アプリケーションは、JavaおよびJATMIプリミティブを使用して、次のタスクを提供します。

- サービス情報へのアクセス

- バッファ・メッセージ

- リクエストされたサービスの実行

サービス情報へのアクセス

TPServiceInformationクラスを使用すると、サービスを実行するためにOracle Tuxedoクライアントによって送信されるサービス情報にアクセスできます。

表3-1 JATMI TPServiceInformationプリミティブ

バッファ・タイプ

説明

getServiceData()

Oracle Tuxedoクライアントから送信されるサービス・データを返すために使用します。

getServiceFlags()

Oracle Tuxedoクライアントから送信されるサービス・フラグを返すために使用します。

getServiceName()

呼び出されたサービス名を返すために使用します。

バッファ・メッセージ

アプリケーションとOracle Tuxedoの間でメッセージの送信および受信を行う場合は、次のTypedBuffersを使用します。

表3-2 TypedBuffers

バッファ・タイプ

説明

TypedString

データがNULL文字で終了する文字の配列である場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: STRING。

TypedCArray

データが、NULL可能な文字の未定義配列(バイト配列)である場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: CARRAY。

TypedFML

データが自己定義である場合に使用されるバッファ・タイプ。各データ・フィールドは独自の識別子、オカレンス番号、および可能であれば長さインジケータを保持します。Oracle Tuxedoでは次に相当: FML。

TypedFML32

TypeFMLに似たバッファ・タイプですが、より大きい文字フィールド、より多くのフィールド、およびより大きいバッファ全体に対して使用可能です。Oracle Tuxedoでは次に相当: FML32。

TypedXML

データがXMLベースのメッセージである場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: XML (Tuxedoリリース7.1以降)。

TypedVIEW

VIEW記述ファイルを用いてバッファ構造を定義するためにアプリケーションがJava構造体を使用するとき、使用されるバッファ・タイプ。Tuxedoの等価タイプ: VIEW。

TypedVIEW32

VIEWに似たバッファ・タイプですが、より大きい文字フィールド、より多くのフィールド、およびより大きいバッファ全体に対して使用可能です。Oracle Tuxedoでは次に相当: VIEW32。

TypedXOctet

データが、NULL可能な文字の未定義配列(バイト配列)である場合に使用されるバッファ・タイプ。X_OCTETのセマンティクスはCARRAYと同じです。Oracle Tuxedoでは次に相当: X_OCTET。

TypedXCommon

VIEWのセマンティクスと同じバッファ・タイプ。Oracle Tuxedoでは次に相当: VIEW。

TypedXCType

VIEWのセマンティクスと同じバッファ・タイプ。Oracle Tuxedoでは次に相当: VIEW。

TypedMBString

データがマルチバイト文字をサポートする多様な文字列である場合に使用されるバッファ・タイプ。Oracle Tuxedoでは次に相当: MBSTRING。

リクエストされたサービスの実行

サービスを提供するために必要なロジックを表現するには、Javaコードを使用します。

リクエスト/レスポンス通信でクライアント・メッセージを返す

クライアント・リクエストに応答するには、TuxedoReplyクラスのsetReplyBuffer()メソッドを使用します。

会話型通信でtpsendおよびtprecvを使用する

注意:
会話型通信の詳細は、第6章「Oracle Weblogic Tuxedo Connector JATMI会話」を参照してください。

以下のJATMIプリミティブは、Oracle Tuxedoクライアントと通信する会話型サーバーを作成する際に使用します。

表3-3 Oracle WebLogic Tuxedo Connectorの会話型クライアントのプリミティブ

名前

操作

tpconnect

Oracle Tuxedo会話型サービスとの接続を確立するために使用します。

tpdiscon

会話を管理するプロセスによって実行された場合に接続を中止し、TPEV_DISCONIMMイベントを生成するために使用します。

tprecv

Oracle Tuxedoアプリケーションからオープンな接続を介してデータを受信するために使用します。

tpsend

Oracle Tuxedoアプリケーションにオープンな接続を介してデータを送信するために使用します。

サンプル・サービスEJB

文字列引数を受信し、その文字列をすべて小文字に変換して、変換された文字列をクライアントに返すTolowerBean.javaサービスEJBの例を次に示します。

例3-1 サンプル・サービスEJB

.
.
.

public Reply service(TPServiceInformation mydata) throws TPException {
TypedString data;
String lowered;
TypedString return_data;

log("service tolower called");

data = (TypedString) mydata.getServiceData();
lowered = data.toString().toLowerCase();
return_data = new TypedString(lowered);

mydata.setReplyBuffer(return_data);
return (mydata);
}
.
.
.

4 RMI/IIOPおよびCORBAを相互に運用するOracle WebLogic Tuxedo Connectorの使用

以下の節では、Oracle WebLogic ServerとOracle Tuxedo CORBAオブジェクトの間の相互運用性をサポートするOracle WebLogic Tuxedo Connectorを使用するために、アプリケーションを変更する方法について説明します。

- CORBA Java APIを用いてOracle WebLogic Tuxedo ConnectorクライアントBeanを開発する方法

- Oracle WebLogic Tuxedo Connector用のRMI/IIOPアプリケーションを開発する方法

- FederationURLフォーマットの使用方法

- Oracle Tuxedo CORBAアプリケーションに対するトランザクションを管理する方法

注意:
CORBAを相互運用するOracle WebLogic Tuxedo Connectorを構成するには、いくつかの管理タスクを実行する必要があります。CORBAを相互運用するOracle WebLogic Tuxedo Connectorを管理する方法については、Oracle WebLogic Server WebLogic Tuxedo Connector管理ガイドのCorbaアプリケーションの管理に関する項を参照してください。
Oracle Tuxedo CORBAアプリケーションを開発する方法については、http://download.oracle.com/docs/cd/E13203_01/tuxedo/tux100/interm/corbaprog.htmlの「CORBAプログラミング」を参照してください。

CORBA Java APIを用いてOracle WebLogic Tuxedo ConnectorクライアントBeanを開発する方法

Oracle WebLogic Tuxedo Connectorを使うと、オブジェクト(たとえばEJBやRMIオブジェクト)は、CORBA Java API (発信)を用いて、Oracle TuxedoにデプロイされたCORBAオブジェクトを呼び出すことができます。Oracle WebLogic Tuxedo Connectorでは、Oracle WebLogic Server RMI-IIOP実行時環境を使用してCORBAをサポートするWTC ORBを実装しています。この拡張では次のような機能が提供されます。

- 出力および入力パラメータのサポート

- トランザクションおよびセキュリティを使用したOracle WebLogic ServerからCORBAサービスへの呼出しのサポート

- 旧リリースで使用されていたJDK ORBのインスタンスではなく、JNDIでホストされるORBのサポート

- 既存のアプリケーションを変更せずに、レガシー・アプリケーションのユーザーが新しいORBを使用できるようにするためのラッパー。以下を実行するかわりに、ORBをJNDIでルックアップする新しい方法に移行することをお薦めします。

ORB orb = ORB.init(args, Prop);

CORBA Java APIを使用するには、WTC ORBを使用する必要があります。以下のいずれかのメソッドを使用して、BeanでORBを取得します。

Properties Prop;
Prop = new Properties();
Prop.put("org.omg.CORBA.ORBClass","weblogic.wtc.corba.ORB");
ORB orb = ORB.init(new String[0], Prop);

または

ORB orb = (ORB)(new InitialContext().lookup("java:comp/ORB"));

または

ORB orb = ORB.init();

Oracle Tuxedoにデプロイされているオブジェクトを参照するには、以下のいずれかの方法を使用できます。

- CosNamingサービスの使用

- FactoryFinderの使用

CosNamingサービスの使用

注意:
オブジェクト参照の詳細は、「FederationURLフォーマットの使用方法」を参照してください。

1. Oracle WebLogic Tuxedo Connectorは、リモートOracle Tuxedo CORBAドメインにあるオブジェクトへの参照を取得するために、CosNamingサービスを使用します。これは、corbaloc:tgiopまたはcorbaname:tgiopオブジェクト参照を使用して行います。次の文は、CosNamingサービスを使用してOracle Tuxedo CORBAオブジェクトへの参照を取得します。

// Get the simple factory.
org.omg.CORBA.Object simple_fact_oref =
orb.string_to_object("corbaname:tgiop:simpapp#simple_factory");

説明:

- simpappは、Oracle Tuxedo UBBに指定されたOracle TuxedoドメインのドメインID。

- simple_factoryは、Oracle Tuxedo CORBA CosNamingサーバーにおいてオブジェクト参照がバインドされていた名前。

サンプルToupperCorbaBean.javaコード

注意:
発信Oracle Tuxedo CORBAオブジェクト用のクライアントBeanを開発する方法の例については、Oracle WebLogic Server配布キットのサンプルのSAMPLES_HOME\server\examples\src\examples\wtc\corba\simpappcnsパッケージを参照してください。
次のToupperCorbaBean.javaコードは、WTC ORBを呼び出し、COSNamingサービスを使用してオブジェクト参照を取得する方法の例です。

例4-1 サンプル・サービス・アプリケーション

.
.
.
public String Toupper(String toConvert)
throws RemoteException
{
log("toupper called, converting " + toConvert);

try {
// Initialize the ORB.
String args[] = null;
Properties Prop;
Prop = new Properties();
Prop.put("org.omg.CORBA.ORBClass",
"weblogic.wtc.corba.ORB");

ORB orb = (ORB) new InitialContext().lookup("java:comp/ORB");

// Get the simple factory.
org.omg.CORBA.Object simple_fact_oref =
orb.string_to_object("corbaname:tgiop:simpapp#simple_factory");

//Narrow the simple factory.
SimpleFactory simple_factory_ref =
SimpleFactoryHelper.narrow(simple_fact_oref);

// Find the simple object.
Simple simple = simple_factory_ref.find_simple();

// Convert the string to upper case.
org.omg.CORBA.StringHolder buf =
new org.omg.CORBA.StringHolder(toConvert);
simple.to_upper(buf);
return buf.value;
}
catch (Exception e) {
throw new RemoteException("Can't call TUXEDO CORBA server: " +e);
}
}
.
.
.

FactoryFinderの使用

注意:
オブジェクト参照の詳細は、「FederationURLフォーマットの使用方法」を参照してください。

Oracle WebLogic Tuxedo Connectorでは、find_one_factory_by_idメソッドを使用してFactoryFinderオブジェクトをサポートしています。これは、corbaloc:tgiopまたはcorbaname:tgiopオブジェクト参照を使用して行います。次のメソッドで、ORBを使用してFactoryFinderオブジェクトを取得します。

// String to Object.
org.omg.CORBA.Object fact_finder_oref =
orb.string_to_object("corbaloc:tgiop:simpapp/FactoryFinder");

// Narrow the factory finder.
FactoryFinder fact_finder_ref =
FactoryFinderHelper.narrow(fact_finder_oref);

// Use the factory finder to find the simple factory.
org.omg.CORBA.Object simple_fact_oref =
fact_finder_ref.find_one_factory_by_id(SimpleFactoryHelper.id());

説明:

- simpappは、Oracle Tuxedo UBBに指定されたOracle TuxedoドメインのドメインID。

- FactoryFinderは、Oracle Tuxedo CORBAサーバーにおいてオブジェクト参照がバインドされていた名前。

WLECからOracle WebLogic Tuxedo Connectorへの移行

WLECは、Oracle WebLogic Serverでは使用できなくなり、サポートされなくなりました。WLECユーザーはアプリケーションをOracle WebLogic Tuxedo Connectorに移行することをお薦めします。詳細は、『Oracle WebLogic Server WLECのためのWebLogic Tuxedo Connector移行ガイド』を参照してください。

サンプル・コード

次のコードは、WTC ORBを呼び出し、FactoryFinderを使用してオブジェクト参照を取得する方法の例です。

例4-2 サンプルFactoryFinderコード

.
.
.
public ConverterResult convert (String changeCase, String mixed)
throws ProcessingErrorException
{
String result;
try {
// Initialize the ORB.
String args[] = null;
Properties Prop;
Prop = new Properties();
Prop.put("org.omg.CORBA.ORBClass","weblogic.wtc.corba.ORB");
ORB orb = (ORB)new InitialContext().lookup("java:comp/ORB");

org.omg.CORBA.Object fact_finder_oref =
orb.string_to_object("corbaloc:tgiop:simpapp/FactoryFinder");

// Narrow the factory finder.
FactoryFinder fact_finder_ref =
FactoryFinderHelper.narrow(fact_finder_oref);

// find_one_factory_by_id
org.omg.CORBA.Object simple_fact_oref =
fact_finder_ref.find_one_factory_by_id(FactoryFinderHelper.id());

// Narrow the simple factory.
SimpleFactory simple_factory_ref =
SimpleFactoryHelper.narrow(simple_fact_oref);

// Find the simple object.
Simple simple = simple_factory_ref.find_simple();

if (changeCase.equals("UPPER")) {
// Invoke the to_upper opeation on M3 Simple object
org.omg.CORBA.StringHolder buf =
new org.omg.CORBA.StringHolder(mixed);
simple.to_upper(buf);
result = buf.value;
}
else
{
result = simple.to_lower(mixed);
}

}
catch (org.omg.CORBA.SystemException e) {e.printStackTrace();

throw new ProcessingErrorException("Converter error: Corba system exception: " + e);
}
catch (Exception e) {
e.printStackTrace();
throw new ProcessingErrorException("Converter error: " + e);
}
return new ConverterResult(result);
}
.
.
.

Oracle WebLogic Tuxedo Connector用のRMI/IIOPアプリケーションを開発する方法

注意:
RMI/IIOPアプリケーションを開発する方法については、『Oracle WebLogic Server RMIのプログラミング』を参照してください。

RMI over IIOP (Internet Inter-ORB Protocol)は、JavaプログラムがCORBA (Common Object Request Broker Architecture)クライアントと対話してCORBAオブジェクトを実行できるように、RMIを拡張しています。Oracle WebLogic Tuxedo Connectorは次のことを可能にします。

- Oracle Tuxedo CORBAオブジェクトが、Oracle WebLogic Server (着信)にデプロイされたEJBを呼び出すことができます。

- オブジェクト(EJBまたはRMIオブジェクトなど)が、Oracle Tuxedo (発信)にデプロイされたCORBAオブジェクトを呼び出すことができます。

次の節では、Oracle Tuxedo CORBAアプリケーションと対話するOracle WebLogic Tuxedo Connectorを使用するために、RMI/IIOPアプリケーションを修正する方法に関する情報を提供します。

- Oracle WebLogic Tuxedo Connectorを使用するために着信RMI/IIOPアプリケーションを変更する方法

- Oracle WebLogic Tuxedo Connectorを使用するために発信RMI/IIOPアプリケーションを開発する方法

Oracle WebLogic Tuxedo Connectorを使用するために着信RMI/IIOPアプリケーションを変更する方法

クライアントは、COSNaming ServiceにバインドされているOracle WebLogic Serverのネーム・サービスの正しいバインド名をCOSNaming Serviceに渡す必要があります。

次のコードは、ネーミング・コンテキストを取得する例です。「WLS」は、Oracle WebLogic Server WebLogic Tuxedo Connector管理ガイドのCorbaアプリケーションの管理に関する項で説明されているcnsbindコマンドで指定されたバインド名です。

例4-3 ネーミング・コンテキストを取得するサンプル・コード

.
.
.
// obtain a naming context
TP::userlog("Narrowing to a naming context");
CosNaming::NamingContext_var context =
CosNaming::NamingContext::_narrow(o);
CosNaming::Name name;
name.length(1);
name[0].id = CORBA::string_dup("WLS");
name[0].kind = CORBA::string_dup("");
.
.
.

Oracle WebLogic Tuxedo Connectorを使用するために発信RMI/IIOPアプリケーションを開発する方法

EJBは、リモートOracle Tuxedo CORBAオブジェクトにアクセスする目的で使用される初期コンテキストを取得するためにFederationURLを使用する必要があります。Oracle WebLogic Tuxedo Connectorを使用するために発信RMI/IIOPアプリケーションを修正する方法を次の節で説明します。

- FederationURLをEJBに渡すためにejb-jar.xmlファイルを修正する方法

- オブジェクトにアクセスするためのFederationURLを使用するためにEJBを変更する方法

FederationURLをEJBに渡すためにejb-jar.xmlファイルを修正する方法

次のコードは、実行時にFederationURLフォーマットをEJBに渡すためにejb-jar.xmlファイルを構成する方法の例です。

例4-4 FederationURLをEJBに渡すサンプルejb-jar.xmlファイル

<?xml version="1.0"?>

<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans
1.1//EN' 'http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd'>

<ejb-jar>
<small-icon>images/green-cube.gif</small-icon>
<enterprise-beans>
<session>
<small-icon>images/orange-cube.gif</small-icon>
<ejb-name>IIOPStatelessSession</ejb-name>
<home>examples.iiop.ejb.stateless.TraderHome</home>
<remote>examples.iiop.ejb.stateless.Trader</remote>
<ejb-class>examples.iiop.ejb.stateless.TraderBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<env-entry>
<env-entry-name>foreignOrb</env-entry-name>
<env-entry-type>java.lang.String </env-entry-type>
<env-entry-value>corbaloc:tgiop:simpapp</env-entry-value>
</env-entry>
<env-entry>
<env-entry-name>WEBL</env-entry-name>
<env-entry-type>java.lang.Double </env-entry-type>
<env-entry-value>10.0</env-entry-value>
</env-entry>
<env-entry>
<env-entry-name>INTL</env-entry-name>
<env-entry-type>java.lang.Double </env-entry-type>
<env-entry-value>15.0</env-entry-value>
</env-entry>
<env-entry>
<env-entry-name>tradeLimit</env-entry-name>
<env-entry-type>java.lang.Integer </env-entry-type>
<env-entry-value>500</env-entry-value>
</env-entry>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>IIOPStatelessSession</ejb-name>
<method-intf>Remote</method-intf>
<method-name>*</method-name>
</method>
<trans-attribute>NotSupported</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>

実行時にFederationURLをEJBに渡すには、アプリケーションのejb-jar.xmlファイルにそのEJB用のenv-entryを追加します。次のenv-entry下位要素を割り当てる必要があります。

- env-entry-nameの割当て

- env-entry-typeの割当て

- env-entry-valueの割当て

env-entry-nameの割当て

env-entry-name要素は、env-entry-value要素内の値をEJBに渡すために使われる変数の名前を指定するために使用されます。例4-4で示したコード例では、env-entry-nameをforeignOrbと指定しています。

env-entry-typeの割当て

env-entry-type要素は、EJBに渡されるenv-entry-value要素のデータ型(たとえばString、Integer、Double)を指定するために使用されます。例4-4に示したサンプル・コードでは、foreignOrb変数がStringデータをEJBに渡しています。

env-entry-valueの割当て

env-entry-value要素は、EJBに渡されるデータを指定するために使用されます。例4-4に示したサンプル・コードでは、foreignOrb変数が次のFederationURLフォーマットでEJBに渡すということを指定しています。

corbaloc:tgiop:simpapp

simpappとは、Oracle Tuxedo UBBで指定されているOracle Tuxedoリモート・サービスのDOMAINIDです。

オブジェクトにアクセスするためのFederationURLを使用するためにEJBを変更する方法

この節では、リモートOracle Tuxedo CORBAオブジェクトにアクセスするために使用されるInitialContextを取得するためのFederationURLを使用する方法に関する情報を提供します。

次のコードはInitialContextを取得するためのFederationURLの使い方の例です。

例4-5 InitialContextを取得するためのサンプルTraderBean.javaコード

.
.
.
public void createRemote() throws CreateException {
log("createRemote() called");

try {
InitialContext ic = new InitialContext();

// Lookup a EJB-like CORBA server in a remote CORBA domain
Hashtable env = new Hashtable();
env.put(Context.PROVIDER_URL, (String)
ic.lookup("java:/comp/env/foreignOrb")
+ "/NameService");

InitialContext cos = new InitialContext(env);
TraderHome thome =
(TraderHome)PortableRemoteObject.narrow(
cos.lookup("TraderHome_iiop"),TraderHome.class);
remoteTrader = thome.create();
}
catch (NamingException ne) {
throw new CreateException("Failed to find value "+ne);
}
catch (RemoteException re) {
throw new CreateException("Error creating remote ejb "+re);
}
}
.
.
.

リモートOracle Tuxedo CORBAオブジェクトのInitialContextを取得するFederationURLを使用するための手順を以下に示します。

1. ejb-jar.xmlファイルで定義されているFederationURLフォーマットを取り出します。
例:

"ic.lookup("java:/comp/env/foreignOrb")

例4-4に示したサンプル・コードでは、foreignOrb変数が次のFederationURLフォーマットでEJBに渡すということを指定しています。

corbaloc:tgiop:simpapp

2. 「/NameService」というFederationURLフォーマットを、先のFederationURLに連結します。
例

"ic.lookup("java:/comp/env/foreignOrb") + "/NameService"

連結結果のFederationURLは次のとおりです。

corbaloc:tgiop:simpapp/NameService

3. InitialContextを取得します。
例:

env.put(Context.PROVIDER_URL, (String)
ic.lookup("java:/comp/env/foreignOrb") + "/NameService");
InitialContext cos = new InitialContext(env);

実行結果はOracle Tuxedo CORBAオブジェクトのInitialContextです。

FederationURLフォーマットの使用方法

この節では、以下のFederationURLフォーマットの構文に関する情報を提供します。

- CORBA URL構文はCORBA仕様で記述されます。詳細については、(http://www.omg.org/)にあるOMGのWebサイトを参照してください。

- corbaloc:tgiopフォームは、Oracle tgiopプロトコル専用です。

corbaloc URLフォーマットの使用

この節では、corbaloc URLフォーマットの構文を示します。

<corbaloc> = "corbaloc:tgiop":[<version>] <domain>["/"<key_string>]
<version> = <major> "." <minor> "@" | empty_string
<domain> = TUXEDO CORBA domain name
<major> = number
<minor> = number
<key_string> = <string> | empty_string

corbaloc:tgiopの例

この節では、corbaloc:tgiopの使用例を示します。

orb.string_to_object("corbaloc:tgiop:simpapp/NameService");
orb.string_to_object("corbaloc:tgiop:simpapp/FactoryFinder");
orb.string_to_object("corbaloc:tgiop:simpapp/InterfaceRepository");
orb.string_to_object("corbaloc:tgiop:simpapp/Tobj_SimpleEventsService");
orb.string_to_object("corbaloc:tgiop:simpapp/NotificationService");
orb.string_to_object("corbaloc:tgiop:1.1@simpapp/NotificationService);

-ORBInitRefの使用例

orb.initおよびresolve_initial_referenceに-ORBInitRefオプションを使用することもできます。

次の-ORBInitRef定義を指定します。

-ORBInitRef FactoryFinder=corbaloc:tgiop:simp/FactoryFinder
-ORBInitRef InterfaceRepository=corbaloc:tgiop:simp/InterfaceRepository
-ORBInitRef Tobj_SimpleEventService=corbaloc:tgiop:simp/Tobj_SimpleEventsService
-ORBInitRef NotificationService=corbaloc:tgiop:simp/NotificationService

次に、

orb.resolve_initial_references("NameService");
orb.resolve_initial_references("FactoryFinder");
orb.resolve_initial_references("InterfaceRepository");
orb.resolve_initial_references("Tobj_SimpleEventService");
orb.resolve_initial_references("NotificationService");

-ORBDefaultInitRefの使用例

-ORBDefaultInitRefおよびresolve_initial_referenceを使用できます。

次の-ORBDefaultInitRef定義を指定します。

-ORBDefaultInitRef corbaloc:tgiop:simpapp

次に、

orb.resolve_initial_references("NameService");

corbaname URLフォーマットの使用

corbalocフォーマットのかわりにcorbanameフォーマットを使用することもできます。

-ORBInitRefの使用例

次の-ORBInitRef定義を指定します。

-ORBInitRef NameService=corbaloc:tgiop:simpapp/NameService

次に、

orb.string_to_object("corbaname:rir:#simple_factory");
orb.string_to_object("corbaname:tgiop:simpapp#simple_factory");
orb.string_to_object("corbaname:tgiop:1.1@simpapp#simple_factory");
orb.string_to_object("corbaname:tgiop:simpapp#simple/simple_factory");

Oracle Tuxedo CORBAアプリケーションに対するトランザクションを管理する方法

注意:
Oracle Tuxedo CORBAアプリケーションでトランザクションを管理する方法の詳細は、(http://download.oracle.com/docs/cd/E13203_01/tuxedo/tux100/trans/gstrx.html)にある『CORBAトランザクションの使用』の「トランザクションについて」を参照してください。

Oracle WebLogic Tuxedo Connectorは、Java Transaction API (JTA)を使って、Oracle Tuxedo CORBAアプリケーションでのトランザクションを管理します。詳細については、以下を参照してください。

- Oracle WebLogic Server JTAのプログラミング

- 『Oracle WebLogic Server Enterprise JavaBeansのプログラミング』の「トランザクションの設計と管理のオプション」

5 Oracle WebLogic Tuxedo Connector JATMIトランザクション

以下の節では、グローバル・トランザクションの概要とそれらをアプリケーションで定義および管理する方法について説明します。

- グローバル・トランザクション

- JTA Transaction API

- トランザクションの定義

- Oracle WebLogic Tuxedo Connectorトランザクションのルール

- サンプル・トランザクション・コード

グローバル・トランザクション

グローバル・トランザクションは、2つ以上のリソース・マネージャのある作業、および1つの論理単位として扱われる2つ以上の物理サイトにまたがる作業を実行するトランザクションです。グローバル・トランザクションは常に、次の4つのプロパティによって分類された特定のシーケンスの操作として扱われます。

- 原子性: すべての部分が正常に実行されるか、またはまったく影響しないかのいずれかです。

- 一貫性: 操作は、リソースを1つの一貫性のある状態から別の一貫性のある状態へと正確に変換するよう実行されます。

- 隔離性: 同じトランザクションの他のプロセスがそのデータにアクセス可能であっても、中間結果は他のトランザクションにアクセスできません。

- 持続性: 完了したシーケンスのすべての結果は、いかなる障害によっても変更されません。

JTA Transaction API

注意:
詳細は、http://www.oracle.com/technetwork/java/javaee/jta/index.htmlにあるJTA APIを参照してください。

Oracle WebLogic Tuxedo Connectorは、トランザクションの管理にJava Transaction API (JTA)を使用します。

JTAインタフェースのタイプ

JTAには、3つのタイプのトランザクション・インタフェースがあります。

- Transaction

- TransactionManager

- UserTransaction

Transaction

Transactionインタフェースは、ターゲットとなるTransactionオブジェクトのトランザクションに対して実行される操作を許可します。トランザクション・オブジェクトは、作成された各グローバル・トランザクションに対応して作成されます。Transactionインタフェースは、リソースの取得、登録の同期、およびトランザクション完了操作やステータス問合せ操作を実行するために使用します。

TransactionManager

TransactionManagerインタフェースによって、アプリケーション・サーバーはアプリケーションのかわりにトランザクション境界区分のトランザクション・マネージャと通信できるようになります。TransactionManagerインタフェースは、コンテナ管理のEJBコンポーネントのかわりにトランザクション・マネージャと通信するために使用します。

UserTransaction

UserTransactionインタフェースは、TransactionManagerインタフェースのサブセットです。UserTransactionインタフェースは、Transactionオブジェクトへのアクセスを制限する必要があるときに使用します。

JTAトランザクション・プリミティブ

Oracle Tuxedoトランザクション・プリミティブの機能を、等価のJTAトランザクション・プリミティブにマップした表を次に示します。

表5-1 Tuxedoトランザクション・プリミティブとJTAトランザクション・プリミティブのマッピング

Oracle Tuxedo

Oracle Tuxedo機能

JTAでは次に相当

tpabort

トランザクションの終了に使用します。

or rollback

tpcommit

トランザクションの完了に使用します。

commit

tpgetlev

サービス・ルーチンがトランザクション・モードであるかどうかの判断に使用します。

getStatus

tpbegin

トランザクションの開始に使用します。

setTransactionTimeout
begin

トランザクションの定義

トランザクションは、クライアントまたはサーバー・プロセスのいずれかで定義できます。トランザクションは、3つの部分で構成されます。3つの部分とは、開始ポイント、トランザクション・モードのプログラム文、および終了ポイントです。

トランザクションを明示的に定義するには、begin()メソッドを呼び出します。呼出しを行う同じプロセスであるイニシエータは、commit()、setRollbackOnly()またはrollback()を呼び出すことによって終了を行うプロセスにもなる必要があります。トランザクション・デリミタ間で呼び出されるサービス・サブルーチンは、現在のトランザクションの一部となります。

トランザクションの開始

注意:
setTransactionTimeout()をあまり大きい値に設定すると、システム検出やエラーのレポートが遅延します。タイムアウト値は、適切な時間内でサービス・リクエストへのレスポンスを行ったり、ネットワーク障害などの問題が発生したトランザクションを終了したりするために使用します。本番環境では、システム・ロードおよびデータベース競合によって起こると予想される遅延に対応するよう、タイムアウト値を調整します。

トランザクションは、begin()の呼出しによって開始されます。タイムアウト値を指定するには、begin()文の前にsetTransactionTimeout(int seconds)文を指定します。

Oracle Tuxedoにトランザクションを伝播するには、次の操作を実行する必要があります。

- JNDIで、TuxedoConnectionFactoryオブジェクトをルックアップします。

- getTuxedoConnection()を使用して、TuxedoConnectionオブジェクトを取得します。

TPNOTRANの使用

トランザクション・デリミタ内で呼び出されるサービス・ルーチンは、現在のトランザクションの一部となります。ただし、TPNOTRANに設定されたflagsパラメータがtpcall()またはtpacall()に含まれている場合、呼び出されたサービスによって実行される操作は、そのトランザクションの一部にはなりません。結果として、呼び出されたプロセスによって実行されたサービスは、現在のトランザクションの結果からの影響を受けません。

トランザクションの終了

トランザクションは、commit()、rollback()、またはsetRollbackOnly()の呼出しによって終了されます。commit()が正常に復帰すると、現在のトランザクションでリソースに対して行われた変更はすべて永続的なものとなります。commit()が正常に実行されるには、次の2つの条件が満たされている必要があります。

- 呼出しプロセスは、begin()でトランザクションを開始した同じプロセスでなければなりません。

- 呼出しプロセスに、未処理のトランザクション応答が存在してはなりません。

いずれかの条件がtrueでない場合、この呼出しは失敗し、例外がスローされます。

setRollbackOnly()およびrollback()は、異常が発生したことを示し、すべての記述子を元の状態にロールバックする場合に使用します。

- トランザクションをロールバックする前に何らかの処理やクリーンアップが必要な場合は、setRollbackOnly()を使用します。

- トランザクションをロールバックする前に何の処理もクリーンアップも不要な場合は、rollback()を使用します。

Oracle WebLogic Tuxedo Connectorトランザクションのルール

トランザクション・モード中は、トランザクションを正常に完了させるために特定のルールに従う必要があります。トランザクション・モード中に注意すべき基本的なルールは、次のとおりです。

- begin()でトランザクションを開始した後で、TuxedoConnectionオブジェクトを使用して、Oracle Tuxedoにトランザクションを伝播する必要があります。

- tpterm()はオブジェクトへの接続を終了し、このオブジェクトでは今後操作を行わないようにします。

- 同じトランザクションの参加コンポーネントであるプロセスは、それらのリクエストへの応答を要求する必要があります。

- 応答を必要としないリクエストは、tpacall()のflagsパラメータがTPNOREPLYに設定されている場合のみ実行できます。

- サービスは、commit()を呼び出す前にすべての非同期トランザクション応答を取得する必要があります。

- イニシエータは、begin()を呼び出す前にすべての非同期トランザクション応答を取得する必要があります。

- 取り出す必要のある非同期応答には、トランザクションの非参加コンポーネントから期待される応答(つまり応答ではなくトランザクションを抑制するtpacall()で行われたリクエストに対して期待される応答)が含まれます。

- トランザクションがタイムアウトされず、「中止のみ」にマーク付けされている場合は、通信の結果として実行された処理がトランザクションのロールバック後に永続化するよう、以後の通信をTPNOTRANフラグを設定して実行する必要があります。

- トランザクションがタイムアウトされた場合は次のとおりです。

- タイムアウトされた呼出しの記述子は無効となり、それ以後の記述子の参照には、TPEBADDESCが返されます。

- 未処理の記述子のtpgetrply()またはtprecv()の以後の呼出しは、tperronoをTPETIMEに設定することによってグローバルな状態のトランザクション・タイムアウトを返します。

- TPNOREPLY| TPNOBLOCK| TPNOTRANに設定されたtpacall()のflagsパラメータで非同期呼出しを行うことができます。

- タイムアウト以外の理由でトランザクションが「中止のみ」にマーク付けされると、tpgetrply()の呼出しは、その呼出しのローカルな状態を示すものをすべて返します。つまり、ローカルな状態を示す成功コードまたはエラー・コードのいずれかを返すことができます。

- tpgetrply()で返信を取り込むために使用された記述子は無効になり、それ以後の参照ではTPEBADDESCが返されます。

- tpsend()またはtprecv()でエラー状態を報告するために使用された記述子は無効になり、それ以後の参照ではTPEV_DISCONIMMが返されます。

- トランザクションが中止されると、未処理のすべてのトランザクション呼出し記述子(TPNOTRANフラグなしで実行)が停滞状態となり、以後それらに対する参照にはTPEBADDESCが返されます。

- Oracle WebLogic Tuxedo Connectorでは、ロード・バランシング時に、特定のトランザクションIDの呼び出しすべてが、特定のサーバー・インスタンスにルーティングされるわけではありません。ロード・バランシングは呼出し単位で行われます。

サンプル・トランザクション・コード

次に、トランザクションのサンプル・コードを示します。

例5-1 サンプル・トランザクション・コード

public class TransactionSampleBean implements SessionBean {

.....

public int transaction_sample () {

int ret = 0;
try {
javax.naming.Context myContext = new InitialContext();
TransactionManager tm = (javax.transaction.TransactionManager)
myContext.lookup("javax.transaction.TransactionManager");

// Begin Transaction
tm.begin ();

TuxedoConnectionFactory tuxConFactory = (TuxedoConnectionFactory)
ctxt.lookup("tuxedo.services.TuxedoConnection");

// You could do a local JDBC/XA-database operation here
// which will be part of this transaction.
.....

// NOTE 1: Get the Tuxedo Connection only after
// you begin the transaction if you want the
// Tuxedo call to be part of the transaction!

// NOTE 2: If you get the Tuxedo Connection before
// the transaction was started, all calls made from
// that Tuxedo Connection are out of scope of the
// transaction.

TuxedoConnection myTux = tuxConFactory.getTuxedoConnection();

// Do a tpcall. This tpcall is part of the transaction.
TypedString depositData = new TypedString("somecharacters,5000.00");

Reply depositReply = myTux.tpcall("DEPOSIT", depositData, 0);

// You could also do tpcalls which are not part of
// transaction (For example, Logging all attempted
// operations etc.) by setting the TPNOTRAN Flag!
TypedString logData =
new TypedString("DEPOSIT:somecharacters,5000.00");

Reply logReply = myTux.tpcall("LOGTRAN", logData,
ApplicationToMonitorInterface.TPNOTRAN);

// Done with the Tuxedo Connection. Do tpterm.
myTux.tpterm ();

// Commit Transaction...
tm.commit ();

// NOTE: The TuxedoConnection object which has been
// used in this transaction, can be used after the
// transaction only if TPNOTRAN flag is set.
}
catch (NamingException ne) {
System.out.println ("ERROR: Naming Exception looking up JNDI: " + ne);
ret = -1;
}
catch (RollbackException re) {
System.out.println("ERROR: TRANSACTION ROLLED BACK: " + re);
ret = 0;
}
catch (TPException te) {
System.out.println("ERROR: tpcall failed: TpException: " + te);
ret = -1;
}
catch (Exception e) {
log ("ERROR: Exception: " + e);
ret = -1;
}

return ret;
}

6 Oracle WebLogic Tuxedo Connector JATMI会話

注意:
Oracle Tuxedoの対話通信の詳細は、http://download.oracle.com/docs/cd/E13203_01/tuxedo/tux100/pgc/pgconv.htmlで『C言語を使用したTuxedoアプリケーションのプログラミング』の「会話型クライアントおよびサーバーのコーディング」を参照してください。

以下の節では、会話の概要とそれらをアプリケーションで定義および管理する方法について説明します。

- Oracle WebLogic Tuxedo Connectorの会話型通信の概要

- Oracle WebLogic Tuxedo Connectorの会話の特性

- Oracle WebLogic Tuxedo Connector JATMI会話プリミティブ

- Oracle WebLogic Tuxedo Connectorの会話型クライアントおよび会話型サーバーの作成

- メッセージの送受信

- 会話の終了

- 無秩序な切断の実行

- 会話型通信のイベントについて

- Oracle WebLogic Tuxedo Connectorの会話ガイドライン

Oracle WebLogic Tuxedo Connectorの会話型通信の概要

Oracle WebLogic Tuxedo Connectorは、Oracle Tuxedoの会話をOracle WebLogic ServerアプリケーションとOracle Tuxedoアプリケーションの間でメッセージを交換する手段としてサポートしています。この形態の通信では、仮想接続がクライアントとサーバーの間で維持され、各サイドで会話の状態に関する情報が維持されます。接続を開き、会話を開始するプロセスが、会話の開始側です。接続の制御権を持つプロセスがイニシエータで、制御権のないプロセスがサブオーディネートです。接続は、それを終了するイベントが発生するまでアクティブなままです。

会話型通信では、イニシエータとサブオーディネートの間でHalf-Duplex接続が確立されます。接続の制御権は、イニシエータとサブオーディネートの間で渡されます。制御権を持つプロセスがメッセージを送信でき(イニシエータ)、制御権のないプロセスはメッセージの受信のみを行えます(サブオーディネート)。

Oracle WebLogic Tuxedo Connectorの会話の特性

Oracle WebLogic Tuxedo Connector JATMI会話には以下の特性があります。

- データがTypedBuffersを使用して渡されます。データのタイプおよびサブタイプは、サービスで認識されるタイプおよびサブタイプと一致していなければなりません。

- 会話型クライアントと会話型サーバーの論理接続は、それが終了されるまでアクティブなままです。

- 会話型クライアントと会話型サーバーの接続では、任意数のメッセージを転送できます。

- Oracle WebLogic Tuxedo Connector会話形式のクライアントは、tpcallまたはtpacallではなくtpconnectを使用して、サービスのリクエストを開始します。

- Oracle WebLogic Tuxedo Connectorの会話型クライアントと会話型サーバーは、JATMIプリミティブのtpsendを使用してデータを送信し、tprecvを使用してデータを受信します。

- 会話型クライアントは、会話型サーバーにサービス・リクエストを送信するだけです。

- 会話型サーバーは、tpforwardを呼び出すことが禁止されています。

Oracle WebLogic Tuxedo Connector JATMI会話プリミティブ

以下のOracle WebLogic Tuxedo Connectorプリミティブは、Oracle WebLogic ServerとOracle Tuxedoの間で通信を行う会話型クライアントおよびサーバーを作成する際に使用します。

表6-1 Oracle Weblogic Tuxedo Connectorの会話型クライアントのプリミティブ

名前

操作

tpconnect

Oracle Tuxedo会話型サービスとの接続を確立するために使用します。

tpdiscon

接続を中止し、TPEV_DISCONIMMイベントを生成するために使用します。

tprecv

Oracle Tuxedoアプリケーションからオープンな接続を介してデータを受信するために使用します。

tpsend

Oracle Tuxedoアプリケーションにオープンな接続を介してデータを送信するために使用します。

Oracle WebLogic Tuxedo Connectorの会話型クライアントおよび会話型サーバーの作成

以下の節では、会話型クライアントおよび会話型サーバーの作成方法を説明します。

会話型クライアントの作成

Oracle WebLogic Tuxedo Connectorの会話型クライアントを作成するには、第2章「Oracle WebLogic Tuxedo ConnectorクライアントEJBの開発」で説明されている手順を実行します。次の節では、tpconnectを使用して接続を開き、会話を開始する方法を説明します。

Oracle Tuxedo会話型サービスとの接続の確立

Oracle WebLogic Tuxedo Connectorの会話型クライアントは、Oracle Tuxedo会話型サービスとの接続を確立する必要があります。JATMIプリミティブtpconnectを使用すると、接続を開いて会話を開始できます。呼出しが成功すると、会話でデータを送受信するために使用できるオブジェクトが返されます。

次の表は、tpconnectのパラメータを示しています。

表6-2 Oracle WebLogic Tuxedo Connector JATMI tpconnectのパラメータ

パラメータ

説明

svc

会話型サービス名の文字ポインタ。svcを指定しないと、呼出しは失敗し、TPExceptionがTPEV_DISCONIMMに設定されます。

data

データ・バッファのポインタ。接続を確立するときに、バッファを指すようにdataパラメータを設定することでデータを同時に送信できます。バッファのtypeおよびsubtypeは、呼び出されるサービスによって認識されなければなりません。dataの値をNULLに設定すると、データが送信されないように指定できます。

flags

アプリケーションの必要に応じて、フラグを単独で、または組み合せて使用します。有効なフラグは、以下のとおりです。

TPSENDONLY :開始側が制御権を保持することを指定します。呼び出されるサービスはサブオーディネートになり、データの受信だけが可能です。TPRECVONLYと併用することはできません。

TPRECVONLY :呼び出されたサービスに制御権を渡すことを指定します。開始側はサブオーディネートになり、データの受信だけが可能です。TPSENDONLYと併用することはできません。

TPNOTRAN : svcが呼び出されて開始側がトランザクション・モードのときは、svcは開始側のトランザクションの一部ではないものとすることを指定します。呼出しは、トランザクション・タイムアウトの影響を受け続けます。svcが失敗しても、開始側のトランザクションは影響を受けません。

TPNOBLOCK :ブロッキング条件が存在する場合はリクエストを送信しないことを指定します。TPNOBLOCKを指定しないと、条件が解消されるか、トランザクション・タイムアウトが発生するまで、またはブロッキング・タイムアウトが発生するまで、開始側はブロックされます。

TPNOTIME :開始側は無期限にブロックされ、ブロッキング・タイムアウトの影響を受けないことを指定します。開始側がトランザクション・モードの場合、呼出しはトランザクション・タイムアウトの影響を受けます。

サンプルTuxedoConversationBean.javaコード

次に、tpconnectを使用して会話を開始するサンプル・コードを示します。

例6-1 サンプル会話コード

.
.
.
Context ctx;
Conversation myConv;
TuxedoConnection myTux;
TuxedoConnectionFactory tcf;
.
.
.
ctx = new InitialContext();
tcf = (TuxedoConnectionFactory) ctx.lookup ("tuxedo.services.TuxedoConnection");
myTux = tcf.getTuxedoConnection();
flags =ApplicationToMonitorInterface.TPSENDONLY;
myConv = myTux.tpconnect("CONNECT_SVC",null,flags);
.
.
.

Oracle WebLogic Tuxedo Connectorの会話型サーバーの作成

Oracle WebLogic Tuxedo Connectorの会話型サーバーを作成するには、第3章「Oracle Weblogic Tuxedo ConnectorサービスEJBの開発」で説明されている手順を実行します。

メッセージの送受信

会話型接続がOracle WebLogic ServerアプリケーションとOracle Tuxedoアプリケーションの間で確立されたら、イニシエータ(メッセージを送信)とサブオーディネート(メッセージを受信)の間の通信が送信および受信の呼出しを使用して遂行されます。以下の節では、Oracle WebLogic Tuxedo ConnectorアプリケーションがJATMIプリミティブtpsendおよびtprecvをどのように使用するのかを説明します。

- メッセージの送信

- メッセージの受信

メッセージの送信

JATMIプリミティブtpsendを使用すると、Oracle Tuxedoアプリケーションにメッセージを送信できます。

次の表は、tpsendのパラメータを示しています。

表6-3 Oracle WebLogic Tuxedo Connector JATMI tpconnectのパラメータ

パラメータ

説明

data

この会話で送信されるデータが格納されているバッファへのポインタ。

flags

フラグは以下のいずれかを指定できます。

TPRECVONLY: イニシエータのデータが送信された後にイニシエータが接続の制御権を放棄することを指定します。イニシエータはサブオーディネートになり、データを受信することだけが可能となります。

TPNOBLOCK :ブロッキング条件が存在する場合はリクエストを送信しないことを指定します。TPNOBLOCKを指定しないと、条件が解消されるか、トランザクション・タイムアウトが発生するまで、またはブロッキング・タイムアウトが発生するまで、開始側はブロックされます。

TPNOTIME: イニシエータが無限にブロックされることを拒否せず、ブロッキング・タイムアウトの影響を受けないことを指定します。呼出しは、トランザクション・タイムアウトの影響を受けます。

メッセージの受信

JATMIプリミティブtprecvを使用すると、Oracle Tuxedoアプリケーションからメッセージを受信できます。

次の表は、tprecvのパラメータを示しています。

表6-4 Oracle WebLogic Tuxedo Connector JATMI tpconnectのパラメータ

パラメータ

説明

flags

フラグは以下のいずれかを指定できます。

TPNOBLOCK : tprecvが応答の到着を待たないことを指定します。応答があった場合は、tprecvは応答を取得して復帰します。このフラグを指定しない場合、応答がないと、tprecvは、応答、トランザクション・タイムアウト、またはブロッキング・タイムアウトのいずれかが発生するのを待ちます。

TPNOTIME : tprecvが応答を無限に待つことを指定します。このフラグを使用する場合、tprecvは、ブロッキング・タイムアウトの影響は受けませんが、トランザクション・タイムアウトの影響は受けます。

フラグの値を0にすると、イニシエータは、条件が解消されるまで、またはタイムアウトが発生するまで、ブロックされます。

会話の終了

Oracle WebLogic ServerとOracle Tuxedoの会話は、サーバー・プロセスがそのタスクを正常に完了したときに終了します。以下の節では、会話の終了方法について説明します。

- Oracle Tuxedoアプリケーションが開始した会話

- Oracle Weblogic Tuxedo Connectorアプリケーションが開始した会話

- 階層的な会話の終了

Oracle Tuxedoアプリケーションが開始した会話

Oracle WebLogic Server会話型サーバーによるreturnの正常な呼出しで会話が終了します。TPEV_SVCSUCCイベントが、サービスの正常な終了を示すために接続を開始したOracle Tuxedoクライアントに送信されます。接続はその後に適切な方法で切断されます。

Oracle WebLogic Tuxedo Connectorアプリケーションが開始した会話

Oracle Tuxedo会話型サーバーによるtpreturnの正常な呼出しで会話が終了します。TPEV_SVCSUCCイベントが、サービスの正常な終了を示すために接続を開始したOracle WebLogic Tuxedo Connectorクライアントに送信されます。接続はその後に適切な方法で切断されます。

階層的な会話の終了

階層的な会話を適切に終了するためには、会話の終了する順序が重要になります。

A-BおよびB-Cという2つのアクティブな接続があると仮定します。Bが両方の接続を管理するOracle WebLogic Tuxedo Connectorアプリケーションである場合、returnを呼び出すと、その呼出しは失敗し、TPEV_SVCERRイベントがすべてのオープンな接続にポストされ、それらの接続は無秩序に閉じます。

両方の接続を適切に終了するには、アプリケーションでは次のシーケンスを実行する必要があります。

1. BはTPRECVONLYでtpsendを呼び出し、B-C接続の制御権をOracle TuxedoアプリケーションCに引き渡します。

2. CはrvalをTPSUCCESS、TPFAIL、またはTPEXITに設定してdepartureを呼び出します。

3. Bはreturnを呼び出し、Aについてイベント(TPEV_SVCSUCCまたはTPEV_SVCFAIL)をポストします。

会話型サービスは、リクエストまたはレスポンスの呼出しを行うことができます。したがって、直前の例で、BからCへの呼出しはtpconnectではなくtpacall()またはtpcall()を使用して実行できます。会話型サービスでは、tpforwardを呼び出すことは許可されていません。

無秩序な切断の実行

Oracle WebLogic Server会話型クライアントまたは会話型サーバーは、tpdisconを呼び出して無秩序な切断を実行します。これは、接続を「打ち切る」ような処理です。

tpdisconの呼出しは:

- 接続を直ちに切断し、接続の反対側でTPEV_DISCONIMMを生成します。送信先に到着していないデータはすべて失われます。会話がトランザクションの一部である場合は、そのトランザクションをロールバックする必要があります。

- 会話のイニシエータのみが呼び出すことができます。

会話型通信のイベントについて

Oracle WebLogic Tuxedo Connector JATMIでは、5つのイベントを使用して会話型通信を管理します。次の表は、イベント、それらのイベントが返される機能、およびそれぞれの詳細な説明を示しています。

表6-5 Oracle WebLogic Tuxedo Connectorの会話型通信のイベント

イベント

受信元

説明

TPEV_SENDONLY

Tuxedo tprecv

接続の制御権が渡されました。このOracle Tuxedoプロセスはtpsendを呼び出すことができます。

TPEV_SENDONLY

JATMI tprecv

接続の制御権が渡されました。このJATMIプロセスはtpsendを呼び出すことができます。

TPEV_DISCONIMM

Tuxedo tprecv、tpsend、tpreturn

接続が切断されており、これ以上の通信はできません。JATMI tpdisconはこのイベントを接続の開始側にポストします。開始側は、tpreturnが呼び出されたときにそのイベントを開いているすべての接続に送信します。接続は無秩序に閉じられ、トランザクションが存在する場合、そのトランザクションは中止されます。

TPEV_DISCONIMM

JATMI tprecv、tpsend、return

接続が切断されており、これ以上の通信はできません。Oracle Tuxedo tpdisconはこのイベントを接続の開始側にポストします。開始側は、returnが呼び出されたときにそのイベントを開いているすべての接続に送信します。接続は無秩序に閉じられ、トランザクションが存在する場合、そのトランザクションは中止されます。

TPEV_SVCERR

Tuxedo tpsendまたはJATMI tpsend

接続の開始側によって受信され、従属プログラムがtpreturn (Oracle Tuxedo)またはreturn (JATMI)を発行し、接続の制御権なしに終了したことを示します。

TPEV_SVCERR

Tuxedo tprecvまたはJATMI tprecv

接続の開始側によって受信され、従属プログラムが接続の制御権なくtpreturn (Oracle Tuxedo)またはreturn (JATMI)を正常に発行したが、呼出しの完了前にエラーが発生したことを示します。

TPEV_SVCSUCC

Tuxedo tprecv

接続の開始側によって受信され、従属サービスが正常に終了した(つまりreturnが正常に呼び出された)ことを示します。

TPEV_SVCSUCC

JATMI tprecv

接続の開始側によって受信され、従属サービスが正常に終了した(つまりtpreturnがTPSUCCESSで呼び出された)ことを示します。

TPEV_SVCFAIL

Tuxedo tpsendまたはJATMI tpsend

接続の開始側によって受信され、従属プログラムがtpreturn (Oracle Tuxedo)またはreturn (JATMI)を発行し、接続の制御権なしに終了したことを示します。サービスはステータスTPFAILまたはTPEXITで完了しており、データはNullに設定されます。

TPEV_SVCFAIL

Tuxedo tprecvまたはJATMI tprecv

接続の開始側によって受信され、従属プログラムが正常に終了しなかったことを示します。サービスはステータスTPFAILまたはTPEXITで完了しました。

Oracle WebLogic Tuxedo Connectorの会話ガイドライン

会話が正常に完了するように、会話モードでは以下のガイドラインに従ってください。

- JATMI会話型プリミティブは、Oracle WebLogic Tuxedo Connector ConversationインタフェースおよびApplicationToMonitorInterfaceインタフェースの定義に従って使用します。

- 常にフラグを使用します。

- Oracle WebLogic Tuxedo Connector JATMIで定義されているフラグのみを使用します。

- Oracle WebLogic Tuxedo Connectorには、同時会話の数を制限してOracle WebLogic Serverネットワークの過負荷を防止するために使用できるパラメータがありません。

- Oracle Tuxedoが会話の最大許容数(MAXCONVパラメータで定義)を超えた場合、Oracle WebLogic Tuxedo Connectorの例外値としてはTPEV_DISCONIMMが予期されます。

- 無認可のOracle Tuxedoサービスに対するtprecvでは、TPEV_DISCONIMM例外値が生じます。

- Oracle WebLogic Tuxedo Connectorクライアントが、別の会話型サービスへのtpforwardを実行するOracle Tuxedo会話型サービスに接続された場合、Oracle WebLogic Tuxedo Connectorの例外値としてはTPEV_DISCONIMMが予期されます。

- 会話はトランザクションの中で開始できます。その際は、会話をトランザクション・モードでプログラム文の一部として開始します。トランザクションの詳細は、第5章「Oracle WebLogic Tuxedo Connector JATMIトランザクション」を参照してください。

- Oracle WebLogic Tuxedo Connectorリモート・ドメインでTPENOENTが生じた場合、そのリモート・ドメインは切断イベント・メッセージを送り返し、そのメッセージはOracle WebLogic Tuxedo ConnectorアプリケーションtprecvでTPEV_DISCONIMM例外として捕捉されます。

7 Oracle WebLogic Tuxedo ConnectorでのFMLの使用

以下の節では、フィールド操作言語(FML)の概要とOracle WebLogic Tuxedo ConnectorがFMLを使用する方法について説明します。

- FMLの概要

- Oracle WebLogic Tuxedo Connector FML API

- FMLフィールド表の管理

- tBridge XML/FML32変換

- XmlFmlCnvクラスを使用したXMLとFML/FML32間の変換

- MBSTRINGの使い方

FMLの概要

注意:
FMLの使用方法については、http://download.oracle.com/docs/cd/E13203_01/tuxedo/tux100/fml/fml01.htmlにある、FMLを使用したTuxedo ATMIアプリケーションのプログラミングのガイドを参照してください。

FMLは、フィールド・バッファと呼ばれる記憶構造を定義および操作するJava言語機能のセットです。各フィールド・バッファには、フィールドに属性および値の組合せが含まれています。各フィールドは次のように構成されます。

- 属性はフィールドの識別子です。

- 関連する値はフィールドのデータ内容を示します。

- オカレンス番号。

FMLには、2つのタイプがあります。

- フィールド長および識別子に16ビット値を使用するFML16。一意のフィールド数が8191、個々のフィールド長が64Kバイト、フィールド・バッファの合計サイズが64Kバイトに制限されています。

- フィールド長および識別子に32ビット値を使用するFML32。約3千万のフィールド、約20億バイトのフィールド長およびバッファ長が使用できます。

Oracle WebLogic Tuxedo Connector FML API

注意:
Oracle WebLogic Tuxedo Connectorは、FML機能のサブセットを実装しています。FML32の詳細は、「FML32の考慮事項」を参照してください。

FMLアプリケーション・プログラム・インタフェース(API)は、WebLogic ServerクラスのJavadocに含まれているweblogic.wtc.jatmiパッケージにドキュメント化されています。

FMLフィールド表の管理

フィールド表は、Oracle Tuxedoフィールド表に似た方法で生成されます。フィールド表は、2つのシステム間で共通のフィールド名定義、フィールド・タイプ、および識別番号を提供するテキスト・ファイルです。FMLを使用してOracle Tuxedoシステムと相互運用するには、次の手順を実行する必要があります。

1. Oracle TuxedoシステムからOracle WebLogic Tuxedo Connector環境に、フィールド表をコピーします。
例: Oracle Tuxedo配布キットには、bankappという銀行アプリケーション・サンプルが含まれています。このアプリケーションには、次の構造を持つbankfldsというファイルがあります。

#Copyright (c) 1990 Unix System Laboratories, Inc.
#All rights reserved
#ident  "@(#) apps/bankapp/bankflds     $Revision: 1.3 $"
# Fields for database bankdb
# name                         number  type    flags   comments
ACCOUNT_ID                     110     long    -       -
ACCT_TYPE                      112     char    -       -
ADDRESS                        109     string  -       -
.
.
.

2. フィールド表定義をJavaソース・ファイルに変換します。weblogic.wtc.jatmiパッケージのmkfldclassユーティリティを使用します。このクラスは、FML32フィールド表を読み取るユーティリティ機能で、FldTblインタフェースを実装するJavaファイルを生成します。このユーティリティには、次のような2つのインスタンスがあります。

- mkfldclass

- mkfldclass32

コマンドの正しいインスタンスを使用して、bankfldsフィールド表をFML32 Javaソースに変換します。次は、mkfldclassを使用した例です。

java weblogic.wtc.jatmi.mkfldclass bankflds

作成されたファイルはbankflds.javaとなり、次のような構造を持ちます。

import java.io.*;
import java.lang.*;
import java.util.*;
import weblogic.wtc.jatmi.*;

public final class bankflds
implements weblogic.wtc.jatmi.FldTbl
{
/** number: 110  type: long */
public final static int ACCOUNT_ID = 33554542;
/** number: 112  type: char */
public final static int ACCT_TYPE = 67108976;
/** number: 109  type: string */
public final static int ADDRESS = 167772269;
/** number: 117  type: float */
.
.
.

3. 次のコマンドを使用して、作成したbankflds.javaファイルをコンパイルします。

javac bankflds.java

コンパイルすると、bankflds.classファイルとなります。ロード時、Oracle WebLogic Tuxedo Connectorはクラス・ファイルを使用してFML32フィールドからフィールド・エントリを追加、検索、および削除します。

4. フィールド表のクラス・ファイルをアプリケーションCLASSPATHに追加します。

5. WTCServer MBeanを更新します。

- フィールド表のクラス・ファイルの完全修飾された場所を反映するため、WTCResources MBeanを更新します。

- fml16またはfml32のFMLバッファ・タイプを記述するために必要なキーワードを使用します。

- カンマ区切りのリストに、複数のフィールド表クラスを入力できます。

例:

<wtc-resources>
<name>BankappResources</name>
<fld-tbl16-class>my.bankflds</fld-tbl16-class>
<fld-tbl16-class>your.bankflds</fld-tbl16-class>
<fld-tbl16-class>more.bankflds</fld-tbl16-class>
</wtc-resources>

6. フィールド表のクラス定義をロードするために、Oracle WebLogic Serverを再起動します。

mkfldclass32クラスに対するDynRdHdrプロパティの使用

Oracle WebLogic Tuxedo Connectorには、FML表を別の方法でコンパイルするためのプロパティが提供されています。以下の場合には、DynRdHdrユーティリティを使用する必要があります。

- 非常に大きなFML表を使用しているので、mkfldclass32クラスで作成された.javaメソッドが、単一のクラスまたはインタフェースの全体的な複雑度に関する内部Java仮想マシンの制限を超えます。

- 非常に大きなFML表を使用しているので、.javaメソッドをコンパイルして作成されたクラスをロードできません。

FML表をコンパイルする場合には、次の手順でDynRdHdrプロパティを使用します。

1. フィールド表定義をJavaソース・ファイルに変換します。

java -DDynRdHdr=Path_to_Your_FML_Table weblogic.wtc.jatmi.mkfldclass32 userTable

このコマンドの引数の定義は次のとおりです。

属性

説明

-DDynRdHdr

FML表をコンパイルするためのOracle WebLogic Tuxedo Connectorプロパティ。

Path_to_Your_FML_Table

FML表のパス名。サーバーのCLASSPATHでリソース・ファイルとして検索可能な完全修飾パスまたは相対パスを指定します。

weblogic.wtc.jatmi.mkfldclass32

このクラスは、FML32フィールド表を読み取るユーティリティ機能で、FldTblインタフェースを実装するJavaファイルを生成します。

userTable

mkfldclass32クラスによって作成される.javaメソッドの名前。

2. 次のコマンドを使用して、userTableファイルをコンパイルします。

javac userTable.java

3. userTable.classファイルをアプリケーションCLASSPATHに追加します。

4. userTable.classファイルの完全修飾された場所を反映するため、WTCResources MBeanを更新します。

5. WTCServerをターゲットとします。WTCServerサービスが開始されるときに、userTable.classがロードされます。

userTable.classファイルの作成後は、userTable.classを手動で更新しなくてもFML表を変更してその変更をデプロイすることができます。WTCサービスの開始時に、Oracle WebLogic Tuxedo Connectorは、WTCサービス構成の「リソース」タブで指定された場所を使用して更新済みのFML表をロードします。Path_to_Your_FML_Table属性を変更した場合、前の手順に従ってuserTable.javaおよびuserTable.classファイルを更新する必要があります。

TypedFML32コンストラクタの使用

2つの新しいTypedFML32コンストラクタを使用すると、パフォーマンスが向上します。これらのコンストラクタの使用については、以下を参照してください。

コンストラクタは、WebLogicクラスのJavadocに定義されます。

TypedFML32でパフォーマンスの向上の実現

TypedFML32でパフォーマンスの向上を実現するためには、TypedFML32コンストラクタにサイズ・ヒントを指定します。これらのコンストラクタで利用できるパラメータは、以下の2つです。

- フィールドの最大数のヒントを指定するパラメータ。すべての発生数を指定します。

- バッファで使用されるフィールドIDの総数を指定するパラメータ。

たとえば、バッファで使用されるフィールド表に20個のフィールドIDを格納し、各フィールドを20回発生させることができます。この場合、最初のパラメータにフィールドの最大数400を指定する必要があります。2番目のパラメータにフィールドIDの総数20を指定する必要があります。

TypeFML32 mybuffer = new TypeFML32(400, 20);

注意:
通常、バッファのサイズに制限はありませんが、非常に小さいサイズでは、うまく機能しません。

非常に小さいバッファを使用する場合は、これらのコンストラクタをヒントなしで使用します。非常に小さいバッファとは、たとえば、フィールドの総発生回数が16より小さいバッファを指します。たとえば、フィールドの総発生回数が250,000を超える非常に大きいバッファの場合は、アプリケーションでフィールドの総発生回数250,000より小さいバッファに分割することを検討する必要があります。

tBridge XML/FML32変換

注意:
指定するデータ型は、FLATまたはNOにする必要があります。他のデータ型を指定すると、リダイレクションは失敗します。

WTCtBridgeRedirect MBeanのTranslateFML要素は、FML32変換がメッセージ・ペイロードで実行されることを示すために使用します。FML32変換には、FLATおよびNOの2つのタイプがあります。

FLAT

メッセージ・ペイロードは、Oracle WebLogic Tuxedo Connectorの内部FML32/XMLトランスレータを使用して変換されます。フィールドは、メッセージ構造(階層構造)を意識せず、グループ化を反復せずに、フィールドごとの値に変換されます。

FML32バッファをXMLに変換するため、tBridgeはFML32バッファにある各フィールドの各インスタンスを抽出して文字列に変換し、それをフィールド名で構成されるタグ内に配置します。これらすべてのフィールドは、サービス名で構成されるタグ内に配置されます。たとえば、次のフィールドで構成されるFML32バッファがあるとします。

NAME          JOE
ADDRESS       CENTRAL CITY
PRODUCTNAME   BOLT
PRICE         1.95
PRODUCTNAME   SCREW
PRICE         2.50

変換されたXMLバッファは次のようになります。

<FML32>
<NAME>JOE</NAME>
<ADDRESS>CENTRAL CITY</ADDRESS>
<PRODUCTNAME>BOLT</PRODUCTNAME>
<PRODUCTNAME>SCREW</PRODUCTNAME>
<PRICE>1.95</PRICE>
<PRICE>2.50</PRICE>
</FML32>

NO

変換は使用されません。

JMSからOracle Tuxedoの場合、tBridgeは、リダイレクションの方向に応じて、JMS TextMessageをOracle Tuxedo TypedBuffer (TypedString)に(またはその逆に)マップします。JMS BytesMessageは、Oracle Tuxedo TypedBuffer (TypedCarray)に(またはその逆に)マップされます。

Oracle TuxedoからJMSの場合、FML/FML32バッファの受け渡しは、translateFMLがFLATに設定されているように動作します。したがって、この場合は、translateFMLをNOに設定しても効果はありません。Oracle TuxedoバッファがFML/FML32型の場合、変換が自動的に実行されます。

FML32の考慮事項

FML32を使用する場合は、以下の情報について考慮する必要があります。

- XML入力では、ルート要素は必須ですが無視されます。

- XML出力では、ルート要素は常に<FML32>です。

- フィールド表名は、「FMLフィールド表の管理」で説明されているようにロードする必要があります。

- tBridgeトランスレータは、「flat」またはリニアなグループ化でのみ有効です。これはFML32順を記述する情報が管理されないために、繰返しデータを含むバッファが予期しない形式で示される場合があります。たとえば、部品とそれに関連付けられた価格のリストを含むFML32バッファがあると仮定します。ここではPART A、PRICE A、PART B、PRICE Bなどが予想されますが、tBridge内に構造的なグループ情報がないため、変換されたXMLはPART A、PART Bなど、PRICE A、PRICE Bなどになります。

- XMLをFML32に変換する場合、トランスレータはSTRING値を無視します。たとえば、<STRING></STRING>は、結果的にFML32バッファではスキップされます。他のすべての型の場合、WTCでは変換失敗となるエラーがログに記録されます。

- 組込みFMLは、このリリースではサポートされません。

- FML32バッファ内の組込みVIEWフィールドは、このリリースではサポートされています。

- FML/FML32からXMLへの変換で、TypedCArrayはサポートされています。以下のサポートされているフィールド型から選択してください。

- SHORT

- LONG

- CHAR

- FLOAT

- DOUBLE

- STRING

- CARRAY

- INT (FML32)

- DECIMAL (FML32)

- バイナリ・データを渡す必要がある場合、選択したフィールド型にエンコードし、受け取り側でXMLをデコードします。

- XML入力バッファでCARRAYフィールドを使用する場合は、最初にbase64を使用してコンテンツをエンコードする必要があります。base64でエンコードされたデータのデコードは、データが受信された後、かつデータがアプリケーションによって処理される前に実行する必要があります。

XmlFmlCnvクラスを使用したXMLとFML/FML32間の変換

tBridgeを使用してXMLバッファとFML/FML32の間の変換を自動的に行うかわりに、順序指定、グループ化、および整形機能を備えたXmlFmlCnvクラスを使用することもできます。次のコードは、XMLバッファ・フォーマットとの間での変換にXmlFmlCnvクラスを使用する例です。

import weblogic.wtc.jatmi.TypedFML32;
import weblogic.wtc.jatmi.FldTbl;
import weblogic.wtc.gwt.XmlFmlCnv;

public class xml2fml
{
public static void main(String[] args) {
String xmlDoc = "<XML><MyString>hello</MyString></XML>";
TypedFML32 fmlBuffer = new TypedFML32(new MyFieldTable());
XmlFmlCnv c = new XmlFmlCnv();
fmlBuffer = c.XMLtoFML32(xmlDoc, fmlBuffer.getFieldTables());
String result = c.FML32toXML(fmlBuffer);
System.out.println(result);
}
}

「Class XmlFmlCnv」を参照してください。

XmlFmlCnvクラスの制限事項

このリリースのXmlFmlCnv.FML32toXMLメソッドでは、FML32のFLD_MBSTRINGフィールドはサポートされていません。

MBSTRINGの使い方

TypedMBStringオブジェクトは、WTCアプリケーション・コードでTypedStringオブジェクトとほとんど同じように使用できます。ただ、TypedMBStringには文字列データに関連付けられたコード・セット・エンコーディング名がある点だけが異なります。

この節の内容は以下のとおりです。

- MBSTRINGデータのOracle Tuxedoドメインへの送信

- MBSTRINGデータのOracle Tuxedoドメインからの受信

- Oracle WebLogic Tuxedo ConnectorでのFMLの使用

MBSTRINGデータのOracle Tuxedoドメインへの送信

MBSTRINGデータを含むOracle Tuxedoメッセージが別のOracle Tuxedoドメインに送信されるときに、TypedMBStringはjava.lang.Stringクラスの変換関数を使用してUnicodeと外部エンコーディングの間の変換を行います。TypedMBStringには文字列データに関連付けられたコード・セット・エンコーディング名があります。

WTCアプリケーション・コードでのTypedMBStringオブジェクトの作成時には、エンコーディング名はnullに設定されます。エンコーディング名がnull値の場合、MBSTRINGデータをリモート・ドメインに送信するときに、Unicode文字列のバイト配列への変換にはデフォルトのエンコーディング名が使用されます。デフォルトでは、バイト配列文字列に対するJavaのデフォルト・エンコーディング名がデフォルト・エンコーディング名として使用されます。エンコーディングを指定することも、デフォルト・エンコーディングをそのまま使用することもできます。次の順序は、TypedMBStringに対する優先順位を示しています。

1. setMBEncoding()メソッドでエンコーディング名を指定します。

2. weblogic.wtc.jatmi.MBEncodingクラスのsetDefaultMBEncoding()メソッドを使用してエンコーディング名を指定します。

3. WTCResourcesMBeanのRemoteMBEncoding属性を使用してエンコーディング名を指定します。

4. MBENCODINGPROPERTYシステム・プロパティ値。

5. Javaのデフォルト・エンコーディング名をそのまま使用します。

MBSTRINGデータのOracle Tuxedoドメインからの受信

リモート・ドメインからMBSTRINGデータを含むOracle Tuxedoメッセージが受信されると、以下のアクションが発生します。

1. WTCは、受信したメッセージのコード・セットtcmからMBSTRINGデータのエンコーディングを判別します。

2. WTCは、TypedMBStringオブジェクトを作成します。
TypedMBStringオブジェクトは、WTCアプリケーション・コードでTypedStringオブジェクトとほとんど同じように使用できます。ただし、TypedMBStringには文字列データに関連付けられたコード・セット・エンコーディング名があります。

3. WTCは、TypedMBStringオブジェクトをWTCアプリケーション・コードに渡します。アプリケーション・コードは、インスタンス・メソッドgetMBEncoding()を使用して、受信したMBSTRINGデータのエンコーディングを認識します。

Oracle WebLogic Tuxedo ConnectorでのFMLの使用

TypedFML32にFLD_MBSTRINGフィールド型が追加されています。この場合、FLD_MBSTRINGの関連付けられたオブジェクト型としてTypedMBStringオブジェクトがTypedFML32メソッドに渡されます。FLD_MBSTRINGフィールドのMBSTRING変換に使用するエンコーディング名を指定できます。

次の順序は、TypedFML32に対する優先順位を示しています。

1. フィールドのTypedMBStringオブジェクトのsetMBEncoding()メソッドでエンコーディング名を指定します。

2. TypedFML32オブジェクトのsetMBEncoding()メソッドでエンコーディング名を指定します。

3. weblogic.wtc.jatmi.MBEncodingクラスのsetDefaultMBEncoding()メソッドを使用してエンコーディング名を指定します。

4. WTCResourcesMBeanのRemoteMBEncoding属性を使用してエンコーディング名を指定します。

5. MBENCODINGPROPERTYシステム・プロパティ値。

6. Javaのデフォルト・エンコーディング名をそのまま使用します。

注意:
以下のメソッドFldtype()、Fchg()、Fadd()、Fget()、およびFdel()は、FLD_MBSTRINGの使用時に更新する必要があります。
Oracle Tuxedoで必要なFmbpack32()およびFmbunpack32()などのオンデマンド・エンコーディング・メソッドや自動変換メソッドは、Oracle WebLogic Tuxedo Connectorでは不要です。

8 Oracle WebLogic Tuxedo Connector JATMI VIEW

以下の節では、Oracle WebLogic Tuxedo Connector VIEWバッファの使い方について説明します。

- Oracle WebLogic Tuxedo Connector VIEWバッファの概要

- VIEW記述ファイルの作成方法

- viewjコンパイラの使用方法

- VIEWバッファとの情報の受け渡し方法

- JATMIアプリケーションでのVIEWバッファの使用方法

- XmlViewCnvクラスを使用したXMLとView/View(32)間の変換

Oracle WebLogic Tuxedo Connector VIEWバッファの概要

注意:
Oracle Tuxedo VIEWバッファの詳細は、http://download.oracle.com/docs/cd/E13203_01/tuxedo/tux100/pgc/pgbuf.htmlで『C言語を使用したTuxedo ATMIアプリケーションのプログラミング』の「VIEW型バッファ」を参照してください。

Oracle WebLogic Tuxedo Connectorを使用すると、非依存型C構造体から派生したOracle Tuxedo VIEWバッファ・タイプと同様のJava VIEWバッファを作成することができます。これにより、Oracle WebLogic ServerアプリケーションおよびOracle Tuxedoアプリケーションが共通の構造体を用いて情報を受け渡しできます。Oracle WebLogic Tuxedo Connector VIEWバッファは、FML VIEWもFML VIEW/Java会話もサポートしていません。

VIEW記述ファイルの作成方法

注意:
fbnameフィールドとnullフィールドは、非依存型Java構造体やC構造体とは関係がなく、JavaやCのVIEWコンパイラには無視されます。これらのフィールドにはプレースホルダーとして値(たとえば、ダッシュ)を入れる必要があります。

Oracle WebLogic ServerアプリケーションとOracle Tuxedoアプリケーションは、VIEW記述で定義された同一の情報構造を共有する必要があります。VIEW記述ファイルの各構造体には下記の形式を使用します。

$ /* VIEW structure */
VIEW viewname
type cname fbname count flag size null

説明:

- ファイル名はVIEW名と同一です。

- ファイルごとに1つのVIEWしか持てません。

- Oracle WebLogic Tuxedo Connector viewjコンパイラとOracle Tuxedo viewcコンパイラの両方で同一のVIEW記述ファイルが使用されます。

- viewnameは情報構造の名前です。

- コメント行は、「#」または「$」文字で始めます。

- 各構造体用のVIEW記述ファイルに指定しなければならないフィールドを下表で説明します。

表8-1 VIEW記述ファイルのフィールド

フィールド

説明

type

フィールドのデータ型。設定できる型は、short、long、float、double、char、string、carrayまたはdec_t (パック10進数)。

cname

情報構造内でのフィールド名。

fbname

無視されます。

count

フィールドの反復回数。

flag

次のいずれかのオプション・フラグを指定します。

- N - ゼロ方向マッピング

- C - 連想カウント・メンバー(ACM)に追加フィールドを生成

- L - STRINGおよびCARRAYに転送されるバイト数を保持

size

STRINGおよびCARRAYバッファ・タイプの場合、バッファの値の最大長を指定します。その他のバッファ・タイプの場合には、このフィールドは無視されます。

null

ユーザー指定のNULL値、または、マイナース記号(-)の場合にはフィールドのデフォルト値を示します。VIEW型バッファで使用されるNULL値は空のC構造体メンバーを示します。

デフォルトのNULL値は、数値型の場合はすべて0 (dec_tでは0.0)。文字型の場合は、`\0'。STRINGおよびCARRAY型では、" "。

規約により、エスケープ文字として使用される定数にも、NULL値を指定できます。VIEWコンパイラが認識するエスケープ定数は次のとおりです: \ddd (dは8進数)、\0、\n、\t、\v、\r、\f、\\、\'、および\"。

STRING、CARRAY、およびchar型のNULL値を、二重引用符または単一引用符で囲んでもかまいません。ユーザー指定のNULL値内のエスケープされていない引用符は、VIEWコンパイラでは受け付けられません。

VIEWメンバー記述のNULLフィールドでキーワード「NONE」を指定することもできます。この指定は、そのメンバーにはNULL値がないことを意味します。文字列および文字配列メンバーの最大サイズのデフォルト値は2660文字です。

サンプルVIEW記述ファイル

次に、Oracle Tuxedoアプリケーションと情報を送受信するためにVIEWバッファを使用するサンプルVIEW記述を示します。このVIEWのファイル名はinfoencです。

例8-1 サンプルVIEW記述

VIEW infoenc
#type    cname    fbname  count flag size null
float    amount   AMOUNT  2     -    -    0.0
short    status   STATUS  2     -    -    0
int      term     TERM    2     -    -    0
char     mychar   MYCHAR  2     -    -    -
string   name     NAME    1     -    16   -
carray   carray1  CARRAY1 1     -    10   -
dec_t    decimal  DECIMAL 1     -    9    - #size ignored by viewj/viewj32
END

viewjコンパイラの使用方法

VIEW型バッファをコンパイルするには、引数としてパッケージ名とVIEW記述ファイルの名前を指定して、viewjコマンドを実行します。出力ファイルはカレント・ディレクトリに作成されます。

viewjコンパイラを使用するには、次のコマンドを入力します。

java weblogic.wtc.jatmi.viewj [options] [package] viewfile

viewj32コンパイラを使用するには、次のコマンドを入力します。

java weblogic.wtc.jatmi.viewj32 [options] [package] viewfile

このコマンドの引数の定義は次のとおりです。

引数

説明

options

- -associated_fields:
AssociatedFieldHandlingをtrueに設定します。これにより、VIEW記述ファイルで関連する長さと数のフィールドが指定されている場合は、その値をsetおよびgetアクセサ・メソッドで使用できます。指定しない場合、AssociatedFieldHandlingのデフォルト値はfalseです。

- -bean_names:
JavaBeansの命名規則に従って、setおよびgetアクセサ名を作成します。フィールド名の最初の文字は、setまたはget接頭辞を付加する前に大文字に変更されます。配列フィールドに対する索引の付いたsetアクセサのシグネチャは、デフォルト・シグネチャのvoid setAfield(T value, int index)からvoid setAfield(int index, T value)に変更されます。

- -compat_names:
VIEW記述ファイルからフィールド名を取得してsetまたはget接頭辞を追加する方法で、setおよびgetアクセサ名を作成します。WebLogic Server 8.1 SP2より前のリリースとの互換性があります。-bean_namesまたは -compat_namesを指定しない場合、デフォルト値は-compat_namesになります。

- -modify_strings:
Oracle Tuxedoに送信する文字列のエンコードとOracle Tuxedoから受信する文字列のデコードに対して異なるJavaコードを生成します。エンコードのコードでは、各文字列の最後にnull文字を追加します。デコードのコードでは、最初のnull文字を受け取った箇所で各文字列を切り詰めます。

- -xcommon:
TypedViewのかわりに、TypedViewを拡張したTypedXCommonとして出力クラスを生成するために使用します。

- -xtype:
TypedViewのかわりに、TypedViewを拡張したTypedXCTypeとして出力クラスを生成するために使用します。

注意: -compat_namesと-bean_namesは相互に排他的なオプションです。

package

.javaソース・ファイルに含まれるパッケージ名。
例: examples.wtc.atmi.simpview

viewfile

VIEW記述ファイルの名前。
例: Infoenc

例:

- VIEWバッファは次のようにしてコンパイルします。

java weblogic.wtc.jatmi.viewj -compat_names examples.wtc.atmi.simpview infoenc

- VIEW32バッファは次のようにしてコンパイルします。

java weblogic.wtc.jatmi.viewj32 -compat_names -modify_strings
examples.wtc.atmi.simpview infoenc

VIEWバッファとの情報の受け渡し方法

viewjおよびviewj32コマンドの出力は、VIEW記述ファイルの各フィールドに対するsetおよびgetアクセサ・メソッドが含まれた.javaソース・ファイルになります。VIEWバッファとの間で情報を受け渡すには、Javaアプリケーションでこれらのsetおよびgetアクセサ・メソッドを使用します。

VIEW記述ファイルで関連する長さと数のフィールドが指定されている場合、その値をsetおよびgetアクセサ・メソッドで使用するかどうかを指定するには、AssociatedFieldHandlingフラグを使用します。

- setメソッドは、配列フィールドの数を設定し、文字列またはcarrayフィールドの長さを設定します。

- 配列に対するgetメソッドは、関連する数のフィールド以下のサイズを持つ配列を返します。

- 文字列とcarrayに対するgetメソッドは、関連する長さのフィールド以下の長さを持つデータを返します。

AssociatedFieldHandlingフラグの状態を設定または取得するには、次のいずれかの方法を使用します。

- viewjおよびviewj32コンパイラの-associated_fieldsオプションを使用して、AssociatedFieldHandlingフラグをtrueに設定します。

- Javaアプリケーションでvoid setAssociatedFieldHandling(boolean state)メソッドを呼び出して、AssociatedFieldHandlingフラグの状態を設定します。

- falseの場合、setおよびgetメソッドは長さと数のフィールドを無視します。

- trueの場合、VIEW記述ファイルで関連する長さと数のフィールドが指定されている場合は、その値をsetおよびgetアクセサ・メソッドで使用します。

- デフォルトの状態はfalseです。

- Javaアプリケーションでboolean getAssociatedFieldHandling()メソッドを呼び出して、AssociatedFieldHandlingの現在の状態を返します。

JATMIアプリケーションでのVIEWバッファの使用方法

JATMIアプリケーションにVIEWバッファを取り込む際には、次の手順に従います。

1. 「VIEW記述ファイルの作成方法」で説明されているとおりに、アプリケーション用のVIEW記述ファイルを作成します。

2. 「viewjコンパイラの使用方法」で説明されているとおりに、VIEW記述ファイルをコンパイルします。

3. 「VIEWバッファとの情報の受け渡し方法」で説明されているとおりに、setおよびgetアクセサ・メソッドを使用して、VIEWバッファに情報を渡したり、VIEWバッファから情報を受け取ったりします。
クライアントでアクセサを使用してVIEWバッファと情報を受け渡す方法の例については、Oracle WebLogic Server配布キットのexamples/wtc/atmi/simpview/ViewClient.javaファイルを参照してください。

4. VIEWコンパイラの出力ファイルをソース・コードにインポートします。

5. 必要な場合は、http://download.oracle.com/docs/cd/E13203_01/tuxedo/tux100/pgc/pgbuf.htmlにある『C言語を使用したTuxedo ATMIアプリケーションのプログラミング』の「VIEW型バッファ」で説明されているとおりに、Oracle Tuxedoアプリケーション用のVIEW記述ファイルをコンパイルし、その出力をCソース・ファイルにインクルードします。

6. コンパイル済みJava VIEW記述ファイルの完全修飾クラス名とVIEWバッファ・タイプ(VIEWまたはVIEW32)を指定したResources MBeanでWTCServer MBeanを構成します。コンパイル済みJava VIEW記述ファイルのクラスをCLASSPATHに指定する必要があります。

7. Oracle Tuxedoアプリケーションをビルドし、起動します。

8. Oracle WebLogic Serverアプリケーションをビルドし、起動します。

FML32バッファに対してVIEW32データを追加および取得する方法

ヘルパー・クラスを使用して、FML32バッファに対してVIEW32データを追加および取得できます。クラス名はwtc.jatmi.FViewFldです。このクラスを使用することで、プログラマはFML32バッファに対してVIEW32フィールド・タイプを使用するJATMIベースのアプリケーションを簡単に開発できます。

構成の変更は不要です。引き続き、WLS構成ファイルのWTCResourcesセクションにあるViewTbl32Classes属性を使用して、VIEW32クラス・パスを構成します。

このヘルパー・クラスでは、以下のアクセス・メソッドを使用できます。

- FViewFld(String vname, TypedView32 vdata);

- FviewFld(FviewFld to_b_clone);

- void setViewName(String vname)

- String getViewName();

- void setViewData(TypedView32 vdata)

- void TypedView32 getViewData();

例8-2 TypedFML32バッファに対して埋め込みTypedView32バッファを追加および取得する方法

String toConvert = new String("hello world");
TypedFML32 MyData = new TypedFML32(new MyFieldTable());
Long d1 = new Long(1234);
Float d2 = new Float(12.32);
MyView data = new myView();
FviewFld vfld;
data.setamount((float)100.96);
data.setstatus((short)3);
vfld = new FviewFld("myView", data);

try {
myData.Fchg(MyFieldTable.FLD0, 0, toConvert);
myData.Fchg(MyFieldTable.FLD1, 0, 1234);
myData.Fchg(MyFieldTable.FLD2, 0, d2);
myData.Fchg(MyFieldTable.myview, 0, vfld);
} catch (Ferror fe) {
log("An error occurred putting data into the FML32 buffer.  The error is " + fe);
}

try {
myRtn = myTux.tpcall("FMLVIEW", myData, 0);
} catch(TPReplyException tre) {
….
}
TypedFML32  myDataBack = (TypedFML32)myRtn.getReplyBuffer();
Integer myNewLong;
Float myNewFloat;
myView View;
String myNewString;

try {
myNewString = (String)myDataBack.Fget(MyFieldTable.FLD0, 0);
myNewLong = (Integer)myDataBack.Fget(MyFieldTable.FLD1, 0);
myNewFloat = (Float)myDataBack.Fget(MyFieldTable.FLD2, 0);
vfld = (FviewFld)myDataBack.Fget(MyFieldTable.myview, 0);
view = (myView)vfld.getViewData();
} catch (Ferror fe) {
….
}

次のコード・リストは、例8-2のサンプルに関連するFML記述(MyFieldTable)の例です。

*base 20000
#name    number  type   flags   comments
FLD0     10      string -       -
FLD1     20      long   -       -
FLD2     30      float  -       -
myview   50      view32 -       defined in View description file

XmlViewCnvクラスを使用したXMLとView/View(32)間の変換

XmlViewCnvクラスを使用すると、XMLからView/View(32)への変換、およびView/View(32)からXMLへの変換を実行できます。次のコードは、XMLバッファ・フォーマットとの間での変換にXmlViewCnvクラスを使用する例です。

import examples.wtc.atmi.simpview.infoenc; // View class import
weblogic.wtc.gwt.XmlViewCnv;
import weblogic.wtc.jatmi.TypedBuffer;

public class xml2view
{
public static void main(String[] args) {
String xmlDoc =
"<VIEW32><infoenc><amount>1000.0</amount><infoenc></VIEW32>";

infoenc convertMe = new infoenc();
convertMe = (infoenc) XmlViewCnv.XMLToView(
xmlDoc,
convertMe.getClass(),
convertMe.getSubtype());

convertMe = (infoenc) echo.Echo(convertMe);

result = XmlViewCnv.ViewToXML(
(TypedBuffer) convertMe,
convertMe.getClass(),
true);

System.out.println(result);
}
}

9 カスタムAppKeyプラグインの作成方法

以下の節では、カスタムAppKeyジェネレータ・プラグインの作成方法について説明します。

- カスタム・プラグインの作成方法

- サンプル・カスタム・プラグイン

カスタム・プラグインの作成方法

注意:
Oracle Tuxedo AAAトークンはカスタマイズできません。

1. AppKeyおよびUserRecインタフェースを使用して、カスタムJavaプラグインを作成します。initメソッドのparamパラメータを使用して、必要な初期化パラメータまたはプロパティ・ファイルを提供できます。

2. プラグインをコンパイルします。例:

javac exampleAppKey.java

3. コンパイルしたプラグインへのパスを含めてCLASSPATHを更新します。例:

export CLASSPATH=$CLASSPATH:/home/mywork

4. サーバーを起動します。

5. カスタム・プラグインを使用するように、WTCサービスを構成します。詳細は、Oracle WebLogic Server WebLogic Tuxedo Connector管理ガイドのカスタム・プラグインに関する項を参照してください。

サンプル・カスタム・プラグイン

exampleAppKey.javaファイルは、カスタム・プラグインの例です。AppKeyを格納するためのデータベースとしてtpusrfileファイルを利用しています。

例9-1 exampleAppKey.Javaカスタム・プラグイン

import java.io.*;
import java.lang.*;
import java.util.*;
import java.security.Principal;
import weblogic.wtc.jatmi.AppKey;
import weblogic.wtc.jatmi.UserRec;
import weblogic.wtc.jatmi.DefaultUserRec;
import weblogic.wtc.jatmi.TPException;
import weblogic.security.acl.internal.AuthenticatedSubject;
import weblogic.security.WLSPrincipals;

/**
* @author Copyright (c) 2002 by BEA Systems, Inc. All Rights Reserved.
*/

/**
* @exclude
* Sample AppKey plug-in using TPUSRFILE as the database for APPKEY.
* It is installed through "Custom" option.
* The syntax for option custom plug parameter input contains the full
* pathname to the <tpusrfile>
*
* @author BEA Systems, Inc.
*/
public class exampleAppKey implements AppKey {
private String  anon_user = null;
private String  tpusrfile = null;
private File    myfile;
private HashMap userMap;
private long    l_time;
private int     dfltAppkey;
private boolean allowAnon;
private final static int USRIDX = 0;
private final static int PWDIDX = 1;
private final static int UIDIDX = 2;
private final static int GIDIDX = 3;
private final static int CLTIDX = 4;

private final static byte[] tpsysadm_string = {
(byte)'t', (byte)'p', (byte)'s', (byte)'y', (byte)'s',
(byte)'a', (byte)'d', (byte)'m' };
private final static byte[] tpsysop_string = {
(byte)'t', (byte)'p', (byte)'s', (byte)'y', (byte)'s', (byte)'o',
(byte)'p' };

public void init(String param, boolean anonAllowed, int dfltAppKey)
throws TPException {

if (param == null) {
System.out.println("Error: tpusrAppKey.init@param == null");
throw new TPException(TPException.TPESYSTEM,
"Invalid input parameter");
}

// get the tpusrfile name
parseParam(param);

myfile  = new File(tpusrfile);
if (myfile.exists() != true) {
System.out.println("Error: exampleAppKey.init@file \"" + param
+ "\" does not exist");
throw new TPException(TPException.TPESYSTEM,
"Failed to find TPUSR file");
}
if (myfile.isFile() != true) {
System.out.println("Error: exampleAppKey.init@the specified name \"" +
param + "\" is not a file");
throw new TPException(TPException.TPESYSTEM,
"Invalid TPUSR file");
}
if (myfile.canRead() != true) {
System.out.println("Error: exampleAppKey.init@file \"" + param +
"\" is not readable");
throw new TPException(TPException.TPESYSTEM,
"Bad TPUSR file permission");
}

userMap = new HashMap();

// create the cache
if (createCache(tpusrfile) == -1) {
System.out.println("Error: exampleAppkey.init@fail to create user cache");
throw new TPException(TPException.TPESYSTEM,
"fail to create user cache");
}

l_time     = myfile.lastModified();
anon_user  = weblogic.security.WLSPrincipals.getAnonymousUsername();
allowAnon  = anonAllowed;
dfltAppkey = dfltAppKey;

System.out.println("exampleAppKey installed!");

return;
}

public void uninit() throws TPException {
if (userMap != null) {
userMap.clear();
}
return;
}

public UserRec getTuxedoUserRecord(AuthenticatedSubject subj) {
Object[] obj = subj.getPrincipals().toArray();
if (obj == null || obj.length == 0) {
// a subject without principals is an anonymous user
if (allowAnon) {
return new DefaultUserRec(anon_user, dfltAppkey);
}
System.out.println("Error: exampleAppKey.
getTuxedoUserRecord@return " +
"anonymous user not allowed");
return null;
}

// looping through all Principal names if necessary to get first user
// name defined in tpuser file
Principal user;
String    username;
int       key;
UserRec   rec;

for (int i = 0; i < obj.length; i++) {
user     = (Principal)obj[i];
username = user.getName();
if (username.equals(anon_user)) {
return new DefaultUserRec(anon_user, dfltAppkey);
}
if ((rec = (UserRec)userMap.get(username)) != null) {
return rec;
}
}
System.out.println("WARN: exampleAppKey.getTuxedoUserRecord@return " +
"null UserRec");
return null;
}

private int createCache(String fname) {
FileInputStream fin;
byte[]          line;

try {
fin = new FileInputStream(fname);

while ((line = readOneLine(fin)) != null) {
DefaultUserRec newUser = parseOneLine(line);
if (newUser != null) {
userMap.put(newUser.getRemoteUserName(), newUser);
}
}
fin.close();
}
catch (FileNotFoundException fnfe) {
System.out.println("Error: exampleAppKey.createCache@reason: " + fnfe);
return -1;
}
catch (SecurityException se) {
System.out.println("Error: exampleAppKey.createCache@reason: " + se);
return -1;
}
catch (IOException ioe) {
System.out.println("Error: exampleAppKey.createCache@reason: " + ioe);
return -1;
}
catch (Exception e) {
System.out.println("Error: exampleAppKey.createCache@reason: " + e);
return -1;
}
return 0;
}

private byte[] readOneLine(FileInputStream fh) {
int    len  = 80;
byte[] line = new byte[len];
int    inp  = -1;
int    idx  = 0;

try {
while ((inp = fh.read()) != -1) {
if (idx == 0 && (inp == '\n' || inp == '\0')) {
continue;
}
if (inp == '\n') {
break;
}
if (idx == (len - 1)) {
byte[] tmp = new byte[len + 80];
System.arraycopy(line, 0, tmp, 0, len);
line = tmp;
len += 80;
}
line[idx] = (byte)inp;
idx++;
}
}
catch (Exception e) {
System.out.println("Error: exampleAppKey.readOneLine@reason: " + e);
return null;
}

if (inp == -1 && idx == 0) {
return null;
}

byte[] tmp = new byte[idx];
System.arraycopy(line, 0, tmp, 0, idx);

return tmp;
}

private DefaultUserRec parseOneLine(byte[] line) {
String      name;
int         key   = 0;
DefaultUserRec usr;
int         firstCharacter;
int         i;
int         sidx;
int         fldlen;
int         fn;
byte[]      buid  = null;
byte[]      bgid  = null;
byte[]      clt   = null;
byte[]      uname = null;

firstCharacter = (int)line[0];
if (firstCharacter == '#' || firstCharacter == '\n' ||
firstCharacter == '!' || firstCharacter == '\0' ||
firstCharacter == '\r') {
return null;
}
fldlen = 0;
sidx   = 0;
for (i = 0, fn = 0; i < line.length && fn <= CLTIDX; i++) {
if (line[i] == (byte)':') {
switch (fn) {
case USRIDX:
uname = new byte[fldlen];
System.arraycopy(line, sidx, uname, 0, fldlen);
break;
case UIDIDX:
buid = new byte[fldlen];
System.arraycopy(line, sidx, buid, 0, fldlen);
break;
case GIDIDX:
bgid = new byte[fldlen];
System.arraycopy(line, sidx, bgid, 0, fldlen);
break;
case CLTIDX:
if (line[sidx  ] == (byte)'T' &&
line[sidx+1] == (byte)'P' &&
line[sidx+2] == (byte)'C' &&
line[sidx+3] == (byte)'L' &&
line[sidx+4] == (byte)'T' &&
line[sidx+5] == (byte)'N' &&
line[sidx+6] == (byte)'M' &&
line[sidx+7] == (byte)',') {
sidx   += 8;
fldlen -= 8;
}
if (fldlen > 0) {
clt = new byte[fldlen];
System.arraycopy(line, sidx, clt, 0, fldlen);
}
break;
default:
break;
}   // end of switch
fn++;
fldlen = 0;
sidx   = i + 1;
}     // end of if
else {
fldlen++;
}
}

// try to tolerate incomplete line
if (fn <= CLTIDX && fldlen > 0) {
switch (fn) {
case USRIDX:
uname = new byte[fldlen];
System.arraycopy(line, sidx, uname, 0, fldlen);
break;
case UIDIDX:
buid = new byte[fldlen];
System.arraycopy(line, sidx, buid, 0, fldlen);
break;
case GIDIDX:
bgid = new byte[fldlen];
System.arraycopy(line, sidx, bgid, 0, fldlen);
break;
case CLTIDX:
if (line[sidx  ] == (byte)'T' &&
line[sidx+1] == (byte)'P' &&
line[sidx+2] == (byte)'C' &&
line[sidx+3] == (byte)'L' &&
line[sidx+4] == (byte)'T' &&
line[sidx+5] == (byte)'N' &&
line[sidx+6] == (byte)'M' &&
line[sidx+7] == (byte)',') {
sidx   += 8;
fldlen -= 8;
}
clt = new byte[fldlen];
System.arraycopy(line, sidx, clt, 0, fldlen);
break;
}
}

if (uname == null || buid == null || bgid == null) {
return null;
}

name = new String(uname);
if (clt != null) {
if (Arrays.equals(tpsysadm_string, clt) == true) {
key = TPSYSADM_KEY;
}
else if (Arrays.equals(tpsysop_string, clt) == true) {
key = TPSYSOP_KEY;
}
}

if (key == 0) {
Integer u_val;
Integer g_val;
int uid = 0;
int gid = 0;

try {
u_val = new Integer(new String(buid));
g_val = new Integer(new String(bgid));
uid   = u_val.intValue();
gid   = g_val.intValue();
uid &= UIDMASK;
gid &= GIDMASK;
key = uid | (gid << GIDSHIFT);
}
catch (NumberFormatException nfe) {
System.out.println("Error: exampleAppKey.readOneLine@reason: " + nfe);
return null;
}
}

return new DefaultUserRec(name, key);
}

private void parseParam(String param) {
String str;

// trim the input
tpusrfile = param.trim();

return;
}
}

10 アプリケーション・エラーの管理

以下の節では、アプリケーションでエラー条件を管理し解釈するメカニズムについて説明します。

- アプリケーション・エラーのテスト

- Oracle WebLogic Tuxedo Connectorのタイムアウト条件

- アプリケーション・イベントのトラッキングのガイドライン

アプリケーション・エラーのテスト

注意:
エラー条件のテスト方法を示すサンプルを表示するには、「サンプル・トランザクション・コード」を参照してください。

アプリケーション・ロジックは、戻り値を持つ呼出しの後にエラー条件をテストし、それらの条件に基づいて適切な手順を実行する必要があります。関数が値を返すイベントでは、特定の値をテストする関数を呼び出し、各条件に適切なアプリケーション・ロジックを実行できます。

例外クラス

Oracle WebLogic Tuxedo Connectorでは、次の例外クラスがスローされます。

- Ferror : FML操作中に発生したエラーでスローされる例外。

- TPException : TPException障害を表す例外。

- TPReplyException :ユーザー・データが、スローされる例外と関連付けられている場合にTPException障害を表す例外。

致命的なトランザクション・エラー

トランザクションの管理では、どのエラーがトランザクションにとって致命的であるかを理解することが重要です。致命的なエラーが発生した場合、トランザクションのイニシエータによってcommit()を呼び出し、そのトランザクションをアプリケーション・レベルで明示的に中止する必要があります。トランザクションは、次のような理由によりエラーとなります。

- トランザクションのイニシエータまたは参加コンポーネントが、トランザクションをロールバックとしてマーク付けしました。

- トランザクションがタイムアウトしました。

- commit()が、トランザクションの開始側ではなく、参加コンポーネントによって呼び出されました。

Oracle WebLogic Tuxedo Connectorのタイムアウト条件

Oracle WebLogic Tuxedo Connectorを使用するときに発生するタイムアウトには、次の2つのタイプがあります。

- ブロッキング・タイムアウト

- トランザクション・タイムアウト

ブロッキング・タイムアウトとトランザクション・タイムアウト

ブロッキング・タイムアウトは、呼出しがブロッキング条件を消去するために待機できる時間を超えると発生します。トランザクション・タイムアウトは、トランザクションがsetTransactionTimeout()内で定義された時間以上かかっている場合に発生します。デフォルトでは、プロセスがトランザクション・モードでない場合、ブロッキング・タイムアウトが実行されます。通信呼出しのflagsパラメータがTPNOTIMEに設定されている場合は、ブロッキング・タイムアウトのみが適用されます。プロセスがトランザクション・モードである場合、ブロッキング・タイムアウトおよびTPNOTIMEフラグは適切ではありません。トランザクションが開始されたときにタイムアウトが定義されていた場合、プロセスはトランザクション・タイムアウトのみに対応します。2つの異なるタイプのタイムアウトの関係は、次のようになります。

- プロセスがトランザクション・モードでなく、ブロッキング・タイムアウトが非同期呼出しで発生した場合、ブロックした通信呼出しは失敗しますが、呼出し記述子はそのまま有効となり、再発行された呼出しで使用可能です。今後の一般の通信に影響はありません。

- トランザクション・タイムアウトの場合、非同期トランザクション応答への呼出し記述子(TPNOTRANフラグなしで実行)は停滞状態となり、参照されなくなることがあります。今後許可される通信は、応答、ブロッキング、およびトランザクションのない前述のケースのみです。

commit()の影響

タイムアウトがcommit()の呼出し後に発生した場合のトランザクションの状態は不定です。トランザクションがタイムアウトし、そのトランザクションが中止されたことをシステムが認識した場合、setRollbackOnly()またはrollback()はエラーを返します。

トランザクションの状態が明確ではない場合、トランザクションがコミットされたか中止されたかを調べるために、リソースを問い合せてそのトランザクションの一部だった変更作業が適用されているかどうかを判断する必要があります。

TPNOTRANの影響

注意:
トランザクションは、そのトランザクションの一部ではないサービスからの応答を待機中にタイムアウトすることがあります。

プロセスがトランザクション内にあり、TPNOTRANに設定されたflagsを使用して通信呼出しを行う場合、呼び出されたサービスはそのトランザクションの参加コンポーネントになることはできません。サービスの成功または失敗は、そのトランザクションの結果に影響を与えません。

アプリケーション・イベントのトラッキングのガイドライン

System.out.println()を使用してアプリケーションの実行を追跡し、Oracle WebLogic Serverトレース・ログにメッセージを書き込むことができます。String型の変数を取得するlog()メソッドを作成し、呼出しへの引数として変数名を使用するか、呼出しへの引数としてリテラルを引用符で囲んだメッセージを使用します。次の例は、tpcall()の進行状況を追跡するために使用する一連のメッセージです。

例10-1 サンプル・イベント・ロギング

.
.
.
log("About to call tpcall");
try {
myRtn = myTux.tpcall("TOUPPER", myData, 0);
}
catch (TPReplyException tre) {
log("tpcall threw TPReplyExcption " + tre);
throw tre;
}
catch (TPException te) {
log("tpcall threw TPException " + te);
throw te;
}
catch (Exception ee) {
log("tpcall threw exception: " + ee);
throw new TPException(TPException.TPESYSTEM, "Exception: " + ee);
}
log("tpcall successfull!");
.
.
.
private static void
log(String s)
{System.out.println(s);}
.
.
.

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2015, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

制限付権利

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。