[BPM] Searching BPM tasks by payload content: Flex Fields (Mapped Attributes)

原文はこちら。
https://blogs.oracle.com/bpmtech/entry/searching_bpm_tasks_by_the

概要

Oracle BPM 11gR1では現在、ワークフローサービスのJava APIを使って、ペイロードの内容でBPMタスクを検索することはできません。このエントリではフレックスフィールドを使うことにより実現する方法を説明します。

フレックスフィールドについて

検索可能な情報をタスクペイロード内に格納する方法として、フレックスフィールドを利用するやり方があります(Fusion Middleware 11gR1 PS4以後ではマップ済属性と呼んでいます)。マップ済属性を使うと、タスク詳細に隠れることなく、ペイロードの値をタスクデータアソシエーションコンポーネントの列として表示することができます。フレックスフィールドにカスタム属性を格納することにより、以下のメリットを享受できます。
  • タスクのデータアソシエーションコンポーネントでフレックスフィールドを表示することができます
  • フレックスフィールドを使ってカスタムビューや詳細検索でタスクをフィルタすることができます
  • (WorkspaceおよびAPIから)フレックスフィールドを使ってキーワード検索することができます
ペイロード中のトップレベルの単純型属性のみをフレックスフィールドに割り当てることができます。複合型属性や、複合型属性内の単純型はサポートされていません。

プロセスを定義してからBusiness Process Workspaceでフレックスフィールドを定義します。フレックスフィールドを作成した後に生成されたインスタンスのみが正しいフレックスフィールドを反映します。フレックスフィールド作成前のビジネスプロセスのインスタンスでは後のフレックスフィールドの変更を反映しません。

マップ済属性には、Public(パブリック)とProtected(保護された)の2種類あります。パブリックフレックスフィールドの振る舞いはプロセスアクティビティで定義されるのに対し、保護されたフレックスフィールドではヒューマンタスクで他の要素(つまりタスクペイロード)へのマッピングとして定義されます。

この2種類のフレックスフィールドは、両者ともプロセスの生存期間中に変化することができ、各タスクに対し異なった割り当てを施すことができるという点でほぼ同じなのですが、値の割り当て方に違いがあります。パブリックフレックスフィールドの場合、BPMプロセスアクティビティでデータアソシエーションやトランスフォーメーションを使って値を割り当てますが、保護されたフレックスフィールドはSOAヒューマンタスク定義でマッピングすることにより値を割り当てます。

フレックスフィールドをsystemMessageAttributes要素に格納します。以下のワークフロータスクペイロードの一部ではフレックスフィールド格納方法を説明しています。
<...>

1
11
111

Salary
ProtectedTextAttribute1



Country
TextAttribute2



Manager
TextAttribute1



<...>

パブリックフレックスフィールド

これらのマッピングをいつでも変更できますが、タスクコンポーネントを再デプロイした場合にはマッピングを再作成する必要があります。以下のような属性があります。
フレックスフィールドの要素名説明
TextAttribute1 - TextAttribute202000文字までのテキストデータを格納します。これらのフィールドの内容はワークリストアプリケーションやタスク問い合わせサービスでのキーワード検索でチェックされます。
FormAttribute1 - FormAttribute102000文字までのテキストデータを格納します。これらのフィールドの内容はワークリストアプリケーションのキーワード検索でチェックされません。
URLAttribute1 - URLAttribute10200文字以内のテキストデータを格納します。これらのフィールドの内容はワークリストアプリケーションのキーワード検索でチェックされません。
DateAttribute1 - DateAttribute10日付情報を格納します。
NumberAttribute1 - NumberAttribute10数値情報を格納します。

パブリックフレックスフィールドの作成

1.JDeveloperで、フレックスフィールドが必要なタスク内に文字列パラメータを作成する。
2. Business Process Workspaceを管理者権限で開き、管理オプションを選択する。下図のように、フレックスフィールドメニューオプションを確認できるはず。



3. パブリックフレックスフィールドを選択し、新しいフレックスフィールドを作成する。フレックスフィールドを作成したら、「タスクタイプでマッピングを編集」を選択し、タスクを選択して、所望のヒューマンタスクを割り当てる。

4. 各タスクに対し、フレックスフィールドを、ヒューマンタスク内の対応する文字列型パラメータに割り当てる。

5. フレックスフィールドが対応するタスクに割り当てられていることを、フレックスフィールドを選択することで確認する。

保護されたフレックスフィールド

パブリックフレックスフィールドとの大きな違いは保護されたフレックスフィールドはランタイムでの変更ができない、という点です。保護されたフレックスフィールドは、タスクコンポーネントとともにデプロイされます。

次のような属性が利用できます。

フレックスフィールドの要素名説明
ProtectedTextAttribute1 - ProtectedTextAttribute202000文字までのテキストデータを格納します。これらのフィールドの内容はワークリストアプリケーションやタスク問い合わせサービスでのキーワード検索でチェックされます。
ProtectedFormAttribute1 - ProtectedFormAttribute102000文字までのテキストデータを格納します。これらのフィールドの内容はワークリストアプリケーションのキーワード検索でチェックされません。
ProtectedURLAttribute1 - ProtectedURLAttribute10200文字以内のテキストデータを格納します。これらのフィールドの内容はワークリストアプリケーションのキーワード検索でチェックされません。
ProtectedDateAttribute1 - ProtectedDateAttribute10日付情報を格納します。
ProtectedNumberAttribute1 - ProtectedNumberAttribute10数値情報を格納します。

保護されたフレックスフィールドの作成

1. Business Process Workspaceを管理者権限で開き、管理オプションを選択する。下図のように、フレックスフィールドメニューオプションを確認できるはず。

2. 保護されたフレックスフィールドを選択し新しいフレックスフィールドを作成する。
3. JDeveloperでヒューマンタスクを選択する。
4. 新しいマップ済属性をデータセクションに追加し、所望のペイロード要素に割り当てる。


Java APIを使ってフレックスフィールドを使って検索する

フレックスフィールドを作成してから、ワークフローサービスJava APIを使いフレックスフィールドで検索するJavaアプリケーションを作成することができます。フレックスフィールドの種類にあわせて述語を作成する必要があります。

a) パブリックフレックスフィールド
Predicate predicate = new Predicate(TableConstants.WFTASK_TEXTATTRIBUTE1_COLUMN,Predicate.OP_EQ,"<ValueX>");
b) 保護されたフレックスフィールド
Predicate predicate = new Predicate(TableConstants.WFTASK_PROTECTEDTEXTATTRIBUTE1_COLUMN,Predicate.OP_EQ, "<ValueX>");
その上で、述語をクエリに追加する必要があります。
List tasks = querySvc.queryTasks(ctx, queryColumns, null, //Do not query additional info
ITaskQueryService.AssignmentFilter.ALL, null, predicate, null, 0, 0);
コードを実行すると、変数tasksには述語に一致するタスクが含まれています。つまり、最初のフレックスフィールド(TEXTATTRIBUTE1 または PROTECTEDTEXTATTRIBUTE1)として、"<ValueX>"を含んでいるタスクを検索できる、ということです。

0 件のコメント:

コメントを投稿