IBM FileNet P8, バージョン 5.2.1            

制約事項および最適な方法

アクション・ハンドラー・エラーまたはパフォーマンス上の問題を回避するには、以下の制約事項および最適な方法に注意してください。

制約事項

  • ハンドラーは、要求された作業の一部を実行するために、追加スレッドを作成することがあります。このようなスレッドがある場合、スレッドは、ハンドラー呼び出しのトランザクション・コンテキストの外部で実行され、Content Engine API 呼び出しを行うことは禁止されています。
  • 同期的なイベント・アクション・ハンドラーまたはライフ・サイクル・アクション・ハンドラーに渡されたソース・オブジェクトは更新できません。これはサポートされていません。同期的なイベント・アクション・ハンドラー内でソース・オブジェクトを更新すると、永続化問題が発生します。

    ソース・オブジェクトを更新するには、次のセクションで説明するように、変更プリプロセッサーまたは非同期的なイベント・アクション・ハンドラーを使用します。

  • 同期的なイベント・アクション・ハンドラーでは、50 を超える数のイベントを再帰的に起動しようとすると、EVENT_INFINITE_LOOP_DETECTED 例外が発生します。
  • 同期的なアクション・ハンドラーおよび非同期のアクション・ハンドラーのいずれでも、メタデータを作成し、それを使用してインスタンスを作成することはできません。例えば、次のコード例に示すように、新規に作成されたドキュメント・サブクラスのインスタンスを作成しようとすると、BAD_CLASSID 例外が発生して失敗します。
     ClassDefinition myNewDocSubclass =createDocSubclass(); 
    Document doc = Factory.Document.createInstance(objectStore,
       myNewDocSubclass.get_SymbolicName()); 
    doc.save(RefreshMode.REFRESH); 
  • アクション・ハンドラー・コードを使用して GUI エレメントを表示しないでください。表示しようとした場合、結果は予測不能であり、Content Engine サーバーのハングなどの重大な問題が発生する可能性があります。
  • GetContentEvent は、ソース・オブジェクト・プロパティーを持たないタイプ RetrievalEvent のサブスクライブ可能なイベントです。したがって、GetContentEvent を受け取るイベント・アクション・ハンドラーは、渡されたイベントからソース・オブジェクトを取得することはできません。イベントの SourceObjectID プロパティーを使用して、永続化されたソース・オブジェクトをオブジェクト・ストアから取得する必要があります。

最適な方法

  • カスタム・スイープ・ハンドラー以外のアクション・ハンドラーは、Java Platform, Enterprise Edition (Java EE) トランザクション内で実行されます。トランザクションには常に時間制限があるため、トランザクションが開いている時間をできるだけ短くすることが推奨されます。同期的なアクション・ハンドラーと変更プリプロセッサー・ハンドラーは、1 つの RPC (リモート・プロシージャー・コール) 内の他のすべてのアクティビティー (他の更新、アクション・ハンドラーなど) と、トランザクション時間を共有します。例外が発生するとトランザクション全体がロールバックします。一方、非同期的なハンドラーは専用のトランザクションを取得します。

    非同期的なハンドラーの全体的なオーバーヘッドは、同期的なハンドラーのオーバーヘッドよりも大きくなります (後から実行できるようにキューイングされるため)。そのため、可能であれば同期的なハンドラーを使用し、非同期的なハンドラーは同期的な実行が不適切な場合に使用します。

    いずれの実行モードでも、ハンドラー内のアクティビティーは、できるだけ短くなるようにしてください。長期実行アクティビティー (別のシステムへのコールアウトなど) の場合、ハンドラー・コード自体は短時間で完了するように、何らかの外部のキューイング・メカニズムに情報を追加することを検討してください。

  • ソース・オブジェクトの更新は、非同期的なイベント・アクション・ハンドラーまたは変更プリプロセッサー (同期的に実行される) を使用して行うことができます。変更プリプロセッサーは、非同期的なイベント・アクション・ハンドラーとは異なり、ソース・オブジェクトが永続化される前に実行されるため、作成時のみ設定可能またはチェックイン時のみ設定可能な (SOOC) プロパティーを変更する場合、または値の変更やトランザクション全体のロールバックによってプロパティーを検証する場合に使用します。

    変更プリプロセッサーは、他のアプリケーションの依存関係 (ハンドラーの正常な完了に依存するクライアント・アプリケーションの後続アクションなど) を満たすために、時間内にハンドラーが完了する必要がある場合にも使用します。非同期的なイベント・ハンドラーでは、あるトランザクション内のターゲット・オブジェクトが永続化されてから、別個のトランザクションで実行される非同期的なイベント・ハンドラーが変更を適用するまでに多少の時間 (通常数秒または数分) が経過します。そのため、従属クライアントで、必要なハンドラーの変更が適用されていない期間があることを許容できない場合は、非同期的なイベント・ハンドラーは使用しないようにしてください。

    非同期的なイベント・ハンドラーの利点は、Java EE トランザクション時間を起動元のアクションと共有する必要がないことにあります。ソース・オブジェクトを更新する場合、以下のシチュエーションでは非同期的なイベント・アクション・ハンドラーを使用することを検討してください。

    • 前述の変更プリプロセッサーのユース・ケースが当てはまらない場合。
    • クラス・インスタンスで作成、更新、または削除のサーバー要求が呼び出されたときではなく、ソース・オブジェクトで特定のイベントが発生したときにのみ、ハンドラーが呼び出されるようにする必要がある場合。
  • 非同期的なイベント・アクション・ハンドラーでソース・オブジェクトを更新するには、更新する前に、ソース・オブジェクトの永続化インスタンスをまずフェッチする必要があります。フェッチされたソース・オブジェクトについて save メソッドを呼び出すことができます。

    非同期的なハンドラーに渡されたソース・オブジェクトを更新しないでください。これは、ハンドラーの実行前にソース・オブジェクトが既に変更されている可能性があることから、そのオブジェクトが古い可能性があるためです。

  • イベント・アクション・ハンドラー、ライフ・サイクル・アクション・ハンドラー、およびドキュメント分類子では、ハンドラーに渡されるアクションのソース・オブジェクトは、オブジェクトのシャロー・コピーです。このシャロー・コピーには、オブジェクトのプロパティー・キャッシュ内のスカラー (非オブジェクト) プロパティーのみが含まれます。シャロー・コピーに含まれないプロパティー値を取得しようとすると、API_PROPERTY_NOT_IN_CACHE エラー・メッセージを受け取ります。このエラーが発生しないようにするため、プロパティーにアクセスする前に、プロパティー・キャッシュ内に値が存在するかどうかを確認してください。プロパティー・キャッシュ内に値が存在しない場合は、永続化されたオブジェクトをフェッチしてください。 次に例を示します。
    IndependentObject sourceObj = event.get_SourceObject();
    if (!sourceObj.getProperties().isPropertyPresent(PropertyNames.FOLDERS_FILED_IN)) 
    { 
       Id id = event.get_SourceObjectId(); 
       ObjectStore os = event.getObjectStore(); 
       // Fetch the source object. プロパティー・フィルターの代わりに NULL を指定することによって、
       // すべてのプロパティーが取得されます。
       sourceObj = Factory.Document.fetchInstance(os, id, null); 
    }
    Property prop = sourceObj.getProperties().find(PropertyNames.FOLDERS_FILED_IN); 
    FolderSet folders = (FolderSet) prop.getIndependentObjectSetValue(); 
     
  • 他のアクション・ハンドラーと同様、変更プリプロセッサーも、プロパティー・キャッシュ内に値が存在するかどうかを確認します。変更プリプロセッサーは、サーバーへの要求のタイプ (作成、更新、削除) に関係なく実行されます。作成要求の場合、プロパティー・キャッシュ内の項目は少なく、クライアントが指定した値およびデフォルト値のみが含まれます。


最終更新日: 2015 年 10 月
customHandlers_best_practices.htm

© Copyright IBM Corp. 2015.