トランザクションリスナーの演習
推定所要時間
カスタムのトランザクションリスナーを作成します。
このレッスンでは、Creo Elements/Direct Manager Server 用のカスタムトランザクションリスナーを実装します。
説明:
15 分
演習:
2-3 時間
説明
トランザクションリスナープロセッサは、Creo Elements/Direct Model Manager などと同様に、データベースのクライアントになります。また、Creo Elements/Direct Model Manager と同じ Java コードで構築されています。この演習は、Java API 文書で記述されている Creo Elements/Direct Model Manager ビジネスロジックまたはユーザインターフェイスの拡張に慣れていることを前提としています。トランザクションリスナーを作成するには、Java クラスを記述してリスナーを実装し、その後でリスナーを Service Controller の XML 設定ファイルに登録する必要があります。
Creo Elements/Direct Model Manager または別のクライアントがトランザクションを完了すると、すべてのトランザクションリスナーが正常にイベントを処理するまで、イベント通知がデータベースに保存されます。
イベント処理
クライアントは、データベースの MM_QUEUE テーブルに、文書と添付ファイルの形式でイベント通知を保存します。
トランザクションリスナープロセッサは、イベントキューをポーリングして、新しいイベントをチェックします。トランザクションリスナープロセッサはイベントを適用順に取得し、イベント情報を持つ登録済みトランザクションリスナーを呼び出します。すべての登録済みトランザクションリスナーがイベントを正常に処理し終えた後、トランザクションリスナープロセッサはイベント通知キューからイベントを削除します。
デフォルトでは、トランザクションリスナープロセッサは、それぞれのトランザクションリスナーの transactionApplied メソッドを同時に呼び出します。トランザクションリスナーがスレッドセーフでない場合は、Service Controller の XML ファイルで <ConcurrentProcessingMode>false に設定し、トランザクションリスナープロセッサが一度に呼び出すトランザクションリスナーを 1 つにします。
トランザクションリスナーの Java クラス
トランザクションリスナーは TransactionListener Java クラスとなり、transactionApplied() メソッドを実装します。イベント通知キュー内でイベント通知が検出されると、トランザクションリスナープロセッサは transactionApplied メソッドを呼び出します。transactionApplied メソッドに TransactionEvent が渡されます。
TransactionEvent にはトランザクション全体の情報が含まれています。TransactionEvent からは、以下の情報を得ることができます。
トランザクションを適用したユーザの名前 (getUserName())
トランザクションの日時 (getDate())
トランザクション内の各要素についての AuditRecordSets のリスト (getAuditRecordSets())。ほとんどのトランザクションには複数の項目が含まれます。
AuditRecordSet では以下の情報を得ることができます。
オブジェクト ID (getObjID())
オブジェクトの AuditEventRecords のリスト (getAuditEventRecords())。当該の要素に対する変更ごとに、AuditEventRecord が 1 つ含まれます。たとえば、バージョンと状態の両方が変更されると、AuditEventRecords は 2 つになります。
AuditRecordSet クラスにはこのほかにも追加のメソッドがいくつか含まれていますが、今後のリリースで削除される予定です。
トランザクション処理の一般的なアルゴリズムは、AuditRecordSetsAuditEventRecords を、2 つの for ループを使用してループさせます。
for (int i = 0; i < e.getAuditRecordSets().size(); ++i) {
AuditRecordSet ars = (AuditRecordSet) e.getAuditRecordSets().get(i);
for (int j = 0; j < ars.getAuditEventRecords().size(); ++j) {
//do something
}
}
トランザクションリスナーを作成する場合の規則
トランザクションリスナーをトランザクションリスナープロセッサ内で共存させるためには、いくつかの規則に従う必要があります。特に、メモリリークのないスレッドセーフのコードを記述する必要があります。トランザクションリスナーがイベントを処理する上で重要なリソースにアクセスできない場合は、ブロックせずに例外をスローする必要があります。
開発環境への影響
トランザクションリスナーは、トランザクションリスナープロセッサの一部として作成および配布されます。このため、開発環境はいくつかの影響を受けることになります。
データベースからのトランザクションを処理できるトランザクションリスナープロセッサは 1 つだけであるため、テストデータベースが必要になります。
トランザクションリスナーのデバッグおよびテスト中は、テストデータベースに接続されているほかのトランザクションリスナープロセッサをすべて停止する必要があります。
テストデータベースに対して Creo Elements/Direct Model Manager を実行して、トランザクションハンドラに送信されるイベントを生成する必要があります。
トランザクションリスナーの登録
トランザクションリスナーは、<TransactionListener> タグを使用して ServiceControllerConfig.xml のトランザクションリスナープロセッサセクションに登録されます。サービス用のカスタマイズファイルを指定するには、<ConfigurationFile> 要素を使用します。
トランザクションリスナーのデバッグ
トランザクションリスナーの開発中は、NetBeans 統合開発環境からトランザクションリスナープロセッサを起動できます。デバッガをトランザクションリスナープロセッサに接続して、トランザクションリスナーをデバッグすることができます。
1. Creo Elements/Direct Model Manager - Java Services Manager」ダイアログボックスを使用して、Java Service を停止します。詳細については、このガイドの「Java Service の開始、停止、再起動」のトピックを参照してください。Windows の「サービス」パネルを使用することもできます。イベントの処理は、一度に 1 つのトランザクションリスナープロセッサのインスタンスだけが実行できます。
2. ローカルの Windows ユーザ名を Model Manager ユーザに管理者として追加します。
3. クラス com.osm.services.transaction.TransactionListenerProcessor を開き、NetBeans の「Debug」 > 「Debug File」から実行します。
4. Creo Elements/Direct Model Manager で通知イベントを生成している間に、デバッガで transactionApplied メソッドを繰り返し実行します。
演習
パーツを作成、修正、またはリリースする際に、他のシステムとの連携が必要となる場合があります。たとえば、新しいパーツが作成された場合、他のシステムへの登録が必要な場合があります。このような場合に、トランザクションリスナーを活用できます。
この演習では、パーツ (部品情報) に関するトランザクションを検索して変更をファイルに書き込むトランザクションリスナーを作成できます。情報をファイルに書き込むことで、トランザクションレコードのループの方法、およびトランザクションリスナーが動作していることを確認できます。実際の実装では、ファイルへの書き込みを行うコードを、他のシステムとの対話を行うコードに置き換えることができます。
この演習は、「Creo Elements/Direct Model Manager のカスタマイズ」セクションの基本的なカスタマイズと配布の演習およびXML のカスタマイズの演習が終了していることを前提としています。
この演習の主な手順は以下のとおりです。
トランザクションリスナーへのコードの追加は、複数のステップで実行します。最終クラスについては、「完成したクラス」を参照してください。
XML ファイルへのトランザクションリスナーの登録
まず、XML ファイルにトランザクションリスナーを登録します。
1. NetBeans で、「XML のカスタマイズの演習」で作成した acme.xml ファイルをダブルクリックして、編集画面に表示します。
2. Manager Service の ServiceControllerConfig.xml をプロジェクトディレクトリにコピーします。
3. 以下の要素を、大文字と小文字の区別に注意しながらトランザクションリスナープロセッサセクションに追加します。
<TransactionListener java_class ="com.acme.event.AcmeTransactionListener"</TransactionListener>
基本 Java コードの作成
最初に、基本トランザクションリスナーを作成します。
1. Java クラス AcmeTransactionListener を作成します。try から catch までの間の処理内容に注目してください。予期しないイベントが発生するとエラーがスローされ、トランザクションリスナーがイベントを正常に処理できなかったことがトランザクションリスナープロセッサに通知されます。
package com.acme.event;
import java.io.*;
import java.util.*;
import java.lang.*;
import com.osm.datamgmt.biz.*;
import com.osm.biz.*;
import com.osm.exception.*;
import com.osm.webservices.event.*;
import com.osm.webservices.service.*;
public class AcmeTransactionListener implements TransactionListener {
public void transactionApplied(TransactionEvent e)
throws WMException {
List recordSets = e.getAuditRecordSets();
File partsFile = new File("C:\\temp\\partsfile.txt");
try {
PrintWriter out = new PrintWriter(new FileOutputStream (partsFile));
out.println("Opened file: " + recordSets.size() + " recordSets");
out.flush();
}
catch (Exception ex) {
throw new WMException(ex);
}
}
}
トランザクションリスナーのテスト
コードは、インストールしなくても、NetBeans から実行できます。
1. NetBeans からトランザクションリスナープロセッサを実行します。
2. Windows エクスプローラで C:\temp を開くと、トランザクションリスナーによって作成されたファイルを確認できます。
3. Creo Elements/Direct Modeling と Creo Elements/Direct Model Manager を起動します。
4. 「ファイル」 > 「新規」 > 「パーツ」を使用して、Creo Elements/Direct Model Manager ワークスペースに新しいパーツを作成します。パーツ名を入力して「了解」をクリックします。
5. 数秒待ち、F5 キーを押して Windows エクスプローラの表示を更新します。
6. partsfile.txt をメモ帳で開きます。Opened file: というメッセージが記述されているはずです。これは、Creo Elements/Direct Model Manager トランザクションによってトランザクションリスナーが呼び出されていることを示します。
トランザクションリスナーの配布
この時点では、トランザクションリスナーは NetBeans 開発環境から実行されています。次に、本番サーバにトランザクションリスナーを配布します。配布されると、トランザクションリスナープロセッサプロセスは Service Controller の子として実行されます。
1. Creo Elements/Direct Model Manager - Java Services Manager」ダイアログボックスを使用して、Java Service を停止します。詳細については、このガイドの「Java Service の開始、停止、再起動」のトピックを参照してください。Windows の「サービス」パネルを使用することもできます。イベントの処理は、一度に 1 つのトランザクションリスナープロセッサのインスタンスだけが実行できます。
2. 新しい custom.jar を配布場所 (通常は C:\Program Files\PTC\Creo Elements\Direct Manager Server 20.7\jar\custom) にコピーします。
3. ServiceControllerConfig.xml. のトランザクションリスナープロセッサセクションにリスナーを登録します。
4. 次の手順で、Service Controller を再起動します。
a. Windows の「スタート」メニューから、「コントロールパネル」 > 「管理ツール」の順にクリックします。
b. 「サービス」をダブルクリックします。「サービス」ウィンドウが開きます。
c. 「Creo Elements/Direct Manage Services」を選択して、「再起動」をクリックします。
5. Creo Elements/Direct Model Manager Standalone を起動して、互換性のある XML 設定ファイルが使用されていることを確認します。
Windows の「スタート」メニューで、「プログラム」 > 「PTC」 > 「Creo Elements/Direct Model Manager」の順に選択します。構成の選択が要求されたら、acme を選択して「了解」をクリックします。
Creo Elements/Direct Model Manager ワークスペースで、Creo Elements/Direct Model Manager の「ヘルプ」 > 「バージョン情報」を参照して、使用されている XML 設定ファイルを確認します(通常、最後の行に表示されます)。
メモ帳を使用して、XML 設定ファイルを開きます。必要な場合は、ホスト名をローカルコンピュータ名に、ポート番号を 8085 に修正します。
ホスト名またはポートを変更した場合は、Creo Elements/Direct Model Manager を再起動して、新しい設定ファイルが読み込まれるようにします。
6. 「ファイル」 > 「新規」 > 「パーツ」を使用して、Creo Elements/Direct Model Manager ワークスペースに新しいパーツを作成します。
7. partsfile.txt ファイルをチェックして、トランザクションリスナーが配布されたことを確認します。
これは役に立ちましたか?