|
以下の節では、WebLogic JMS C API を使用する方法について説明します。
WebLogic JMS C API は、WebLogic JMS アプリケーションおよびリソースにアクセスできる C クライアント アプリケーションを作成するためのアプリケーション プログラム インタフェースです。作成した C クライアント アプリケーションでは、Java ネイティブ インタフェース (JNI) を使用してクライアントサイドの Java JMS クラスにアクセスします。図 13-1 を参照してください。
このリリースの WebLogic JMS C API は、Java JMS 1.1 コードの移植を容易にするため、JMS バージョン 1.1 仕様に準拠しています。詳細については、WebLogic JMS C API の Javadoc を参照してください。
ここでは、それぞれの環境で WebLogic JMS C API を使用するためのシステム要件を示します。
weblogic.jar
ファイル)。wljmsclient.jar
ファイル)。『スタンドアロン クライアント プログラマーズ ガイド』の「WebLogic JMS シン クライアント」を参照してください。
JMS 開発者用に、WebLogic JMS C API クライアントのコンフィグレーションおよび開発の方法を示すサンプルが用意されています。http://dev2dev.bea.com/code/index.jsp を参照してください。
以下の節では、WebLogic JMS C API のアプリケーションを移植または開発する上での原則について説明します。
WebLogic JMS C API は、モジュール形式でコードを実装するハンドル ベースの API です。つまり、アプリケーションでは C コードのハンドルとして Java オブジェクトを実装します。JMS オブジェクトの実装方法の詳細はハンドル内に隠されます。ただし、Java とは異なり、ハンドルを使用して実装したら、対応する Close または Destroy メソッドを呼び出してハンドルを明示的に開放する必要があります。「メモリ割り当てとガベージ コレクション」を参照してください。
WebLogic JMS C API から返されるハンドルがスレッド セーフかどうかは、対応する Java 型がスレッド セーフかどうかによって決まります。次に例を示します。
同時実行性の制御を C クライアント アプリケーションで管理している限り、WebLogic JMS C API が返すすべてのオブジェクトはどのスレッドでも使用される可能性があります。
注意 : | WebLogic JMS C API では、整数のリターン コードを使用します。 |
WebLogic JMS C API での例外は、実行スレッドに対してローカルです。WebLogic JMS C API には、以下の型の例外があります。
Java コードと C コードを相互運用する場合、主なタスクの 1 つになるのが C 型から Java 型への変換です。たとえば、short
型は、Java でも C でも 2 バイト エンティティです。以下の型変換では、特別な処理が必要になります。
Integer (int)
は、JMS32I
(4 バイト符号付き値) に変換します。
Long (long)
は、JMS64I
(8 バイト符号付き値) に変換します。
Character (char)
は、short
(2 バイト Java 文字) に変換します。
Java 文字列は、2 バイト文字の配列です。C の文字列は、通常は UTF-8 エンコードの 1 バイト文字の配列です。純粋な ASCII 文字列は UTF-8 仕様にも適合します。UTF-8 文字列の詳細については、www.unicode.org を参照してください。C プログラマにとって、すべての文字列を 2 バイト Java エンコーディングに変換するのは不便です。JmsString
構造体を使用すると、アプリケーションの要件に応じ、C クライアントでネイティブ文字列または Java 文字列を使用できます。
JmsString
では、以下の 2 種類の文字列がサポートされます。
uniOrC
という UNISTRING
と CSTRING
のユニオンには string
という文字ポインタがあり、これを NULL
で終了する UTF-8 エンコードの C 文字列に使用できます。uniOrC
ユニオンは、文字列データと整数長 (バイト) の void ポインタを含む uniString
という構造体を提供します。
JmsString
の stringType
要素を入力として使用する場合、文字列入力の型に応じて CSTRING
または UNISTRING
を設定する必要があります。対応するデータ フィールドには、入力として使用する文字列が含まれます。
UNISTRING
エンコーディングでは、すべての 2 バイトが単一の Java 文字としてエンコードされます。2 バイト シーケンスはビッグエンディアンです。Unicode では、このエンコーディングを UTF-16BE と呼びます (2 バイト シーケンスがリトルエンディアンの場合は UTF-16LE)。CSTRING
エンコーディングでは、UTF-8 でエンコードされた文字列が想定されます。
JmsString
の stringType
要素を出力として使用する場合、API が malloc
を使用して出力に十分なスペースを割り当てるようにするか、呼び出し側でスペースを割り当てて、返された文字列がそのスペースにコピーされるようにするかを選択できます。ユニオン内の適切なフィールド (string または data) が NULL である場合は、API が malloc
を使用して出力に十分なスペースを割り当てます。この方法で割り当てたスペースは、メモリをそれ以上使用しなくなったときに、呼び出し側で free
を使用して開放する必要があります。ユニオン内の適切なフィールド (string または data) が NULL でない場合は、JmsString
の allocatedSize
フィールドに書き込み可能なバイト数が指定されている必要があります。
文字列内に出力全体を格納するための十分なスペースがない場合は、allocatedSize
に必要なスペースの量が設定され、呼び出された API が JMS_NEED_SPACE
を返します。JmsString
の適切なフィールド (string または data) には、allocatedSize
バイトを限度として格納できるだけのデータが格納されます。この場合、返される C 文字列データの最後に、NULL 文字が書き込まれる場合と書き込まれない場合があります。例:
テキスト メッセージからの文字列出力に 100 バイトを割り当てるため、データ ポインタを設定し、allocatedSize
フィールドを 100 に設定したとします。JmsMessageGetTextMessage
API は、allocatedSize
が 200 に設定された JMS_NEED_SPACE
を返します。元の文字列で realloc
を呼び出してデータ ポインタをリセットし、関数をもう一度呼び出します。今回は呼び出しが成功し、メッセージ ハンドルから文字列を抽出できます。代わりに、元のバッファを開放して、正しいサイズの新しいバッファを割り当てることも可能です。
割り当てるすべてのリソースも、適切に破棄する必要があります。Java では、参照されなくなったすべてのオブジェクトは、ガベージ コレクションによってクリーンアップされます。しかし、C ではすべてのオブジェクトを明示的にクリーンアップする必要があります。ユーザに提供されたすべての WebLogic JMS C API ハンドルは、明示的に破棄しなければなりません。ハンドルの動詞が、Close で終わる場合と Destroy で終わる場合があることに注意してください。この規約に基づいて、close
メソッドを含む Java オブジェクトと含まない Java オブジェクトを区別できます。例:
注意 : | クローズまたは破棄したハンドルは、再び参照しないようにしてください。 |
Java JMS では、接続を暗黙的にクローズすると、従属するすべてのセッション、プロデューサ、およびコンシューマがクローズされます。WebLogic JMS C API では、接続をクローズしても、従属するセッション、プロデューサ、およびコンシューマはクローズされません。接続をクローズしたら、従属するすべてのハンドルは使用できなくなり、明示的にクローズする必要があります。
WebLogic JMS C API に用意されているヘルパー関数のなかには、WebLogic JMS に存在しないものもあります。これらのヘルパーの詳細については、WebLogic JMS C API の Javadoc を参照してください。次に例を示します。
JmsMessageGetSubclass は JmsMessage
ハンドルで動作し、メッセージのサブクラスに対応する整数を返します。JMS では、instanceof
を使用してこの機能を実現できます。
WebLogic JMS C API では、username
と password
に基づく WebLogic 互換性レルム セキュリティ モードがサポートされています。username
と password
は、InitialContext
オブジェクトの作成に使用するハッシュ テーブルの SECURITY_PRINCIPAL
および SECURITY_CREDENTIALS
フィールドの初期コンテキストに渡す必要があります。
WebLogic JMS C API を実装する際は、以下の点に注意してください。
ULOG.mmddyy
(月/日/年) になります。このログ ファイルは、クライアントの NLSPATH
、LOCALE
、および LANG
環境変数を使用して完全にインターナショナライズされます。gencat
ユーティリティまたはホスト プラットフォームの gencat
ユーティリティを使用できます。生成されたカタログ ファイルが NLSPATH
、LOCALE
、および LANG
変数に従って配置されていれば、ログ ファイルにメッセージを書き込む際に翻訳済みのカタログが使用されます。