Interstage BPM - ソフトウェア - Fujitsu

Interstage Business Process Manager V11
開発者ガイド
B1WD-2807-01Z0(00)
2010年1月
まえがき
本書の目的
本書では、ユーザの要件に適応するよう、Interstage BPMのAPIを使用してInterstage BPMのカスタマイズや拡張方法について説明さ
れています。
本書の読者
本書は、次の読者を対象としています。
・ ビジネスプロセスの開発に携わるIT専門家
・ ワークフローによる自社製品の強化を考えている独立ソフトウェアベンダー
・ ワークフローを活用するアプリケーションの構築やワークフローによる既存アプリケーションの強化を計画しているシステム管理者
注意
本書では、“管理者”とは“Interstage BPM Super Users”ではなく、“Interstage BPM Tenant Owners”を指します。
本書の構成
本書は以下の内容で構成されています。
章
タイトル
説明
1
概要
Interstage BPMの特長や概要など、全体の概要について説明します。
2
Interstage BPM の基本設計
Interstage BPMのコンポーネントとその連携について説明します。
3
Interstage BPMの基礎知識
Interstage BPMを操作するために必要な、基本的な事項について説明しま
す。
4
Model API
Model APIを使用したアプリケーション開発のためのシステム環境につい
て説明します。
5
プロセス定義のデザイン
単純なプロセス定義と複雑なプロセス定義のプログラミング例、およびプロ
セスインスタンスのプログラミング例について説明します。
6
Interstage BPMの強化
JavaActionと詳細なフィルタとソートを含む、Interstage BPMを強化するさま
ざまな手法について説明します。
7
運用管理
運用管理機能のプログラミング例について説明します。
8
履歴情報の取得
ワークフローの履歴情報をデータベースから取得する方法について説明
します。
付録A
Interstage BPMのサンプル
Interstage BPMに提供されているサンプルの一覧、その構造、および使い
方について説明します。
付録B
JavaScript関数
JavaScriptについて説明します。
付録C
トラブルシューティング
Interstage BPMの使用に関連する問題の解決に役立つ情報について説明
します。
用語集
用語の解説です。
本書の読み方
本書は、以下の表を目安にお読みください。
-i-
目的
章
Interstage BPMの概要について知りたい。
1
Interstage BPMの基本設計について知りたい。
2
Interstage BPMの基礎知識について知りたい。
3
Model APIの使用方法について知りたい。
4
プロセス定義およびプロセスインスタンスのプログラミングについて知りたい。
5
システムの拡張方法について知りたい。
6
運用管理アクティビティのプログラミングについて知りたい。
7
ワークフローの履歴情報をデータベースから取得する方法について知りたい。
8
サンプルプログラムについて知りたい。
付録A
JavaScriptについて知りたい。
付録B
トラブルシューティングについて知りたい
付録C
表記規則
本書は、次の規則に従って記述されています。
例
意味
[画面に表示されるテキスト]
ユーザインタフェースに表示されるテキストです。[]付きで表示されます。
「参照先」
参照先は「」付きで表示されます。
関連マニュアル
Interstage Business Process Managerには、以下のマニュアルがあります。必要に応じてご利用ください。
・ ソフトウェア説明書
ソフトウェア説明書には、提供媒体の内容、留意事項など重要な情報について説明します。ご使用になる前に、ソフトウェア説明
書を必ずお読みください。
・ マニュアル体系と読み方
Interstage Business Process Manager のマニュアル体系とそれぞれのマニュアルの読み方について説明します。
・ サーバ・コンソール導入ガイド
Interstage Business Process Managerサーバのソフトウェア、ハードウェア要件と、Interstage Business Process Managerサーバ、コン
ソールのインストール方法について説明します。
・ コンソールユーザーズガイド
Interstage Business Process Manager コンソールのユーザインタフェースを使用する方法について説明します。
・ サーバ管理者ガイド
Interstage Business Process Managerの設定および管理方法について説明します。Interstage Business Process Managerサーバの
設定パラメータの説明が含まれます。
・ 開発者ガイド
Interstage Business Process Manager開発の手順について説明します。
Interstage Business Process Manager のAPI を使用したInterstage Business Process Manager のカスタマイズやカスタムアプリケー
ションの開発方法について説明します。
・ Studioユーザーズガイド
Interstage Business Process Manager Studioを使用してプロセスをモデル化する方法について説明します。
- ii -
・ Javadoc (APIリファレンス)
カスタムアプリケーションの開発のためのAPIおよびパッケージ、インタフェース、クラスの構文について説明します。
略称
本マニュアルで説明される製品を次のように省略します。
・ 「BEA WebLogic Server」は「WebLogic Application Server」と呼ばれ、「WebLogic」と省略します。
・ 「Interstage Business Process Manager」は「Interstage BPM」と省略します。
・ 「Microsoft® Windows Server® 2003」は「Windows Server® 2003」と省略します。
・ 「Interstage Business Process Manager」は「Interstage BPM」と省略します。
・ 「Microsoft® Windows® 2000 Server」は「Windows® 2000 Server」と省略します。
・ 「Solaris™ Operating System」は「Solaris」と省略します。
・ 「Microsoft® SQL Server 2005 Standard Edition」、「Microsoft® SQL Server 2005 Enterprise Edition」、「Microsoft® SQL Server
2008 Standard Edition」、「Microsoft® SQL Server 2008 Enterprise Edition」は、「Microsoft® SQL Server」、「Microsoft SQL
Server」、または「SQL Server」と省略します。
・ 「Oracle 10g R2 Standard Edition」、「Oracle 10g R2 Standard Edition One」、「Oracle 10g R2 Enterprise Edition」、「Oracle 11g Standard
Edition」、「Oracle 11g Standard Edition One」、「Oracle 11g Enterprise Edition」は、「Oracle」と省略します。
・ 「WebSphere Application Server」は、「WebSphere」と省略します。
輸出管理規制について
当社ドキュメントには、外国為替および外国貿易管理法に基づく特定技術が含まれていることがあります。特定技術が含まれている場
合は、当該ドキュメントを輸出または非居住者に提供するとき、同法に基づく許可が必要となります
発行日
2010年1月
版数
2版
登録商標について
Interstage、Symfowareは、富士通株式会社の登録商標です。
ARISはIDS Scheer AGの登録商標です。
Microsoft、Windows、WindowsNT、Windows Serverは、米国Microsoft
Corporationの米国およびその他の国における商標または登録商標です。
UNIXは、米国およびその他の国におけるオープン・グループの登録商標で
す。
JavaおよびすべてのJava関連の登録商標およびSolarisは、米国およびその他
における米国Sun Microsystem,Incの商標または登録商標です。
Linuxは、Linus Torvalds氏の米国およびその他の国における商標または登録
商標です。
Red Hat、the Red Hat "Shadow Man" ロゴ、RPM、Maximum RPM、RPM ロゴ、
Linux Library、 PowerTools、 Linux Undercover、RHmember、RHmember
More、Rough Cuts、Rawhide、およびRed Hatをベースとしたすべての商標とロ
ゴは、Red Hat, Inc.の米国およびその他の国における登録商標あるいは商標
です。
そのほか、本書に記載されている会社名および製品名は、それぞれ各社の商
標または登録商標です。
Microsoft Corporationのガイドラインに従って画面写真を使用しています。
お願い
・ このマニュアルは、予告なしに変更されることがあります。
・ このマニュアルは無断で他に転用しないようお願いします。
- iii -
・ このマニュアルに記載されたデータの使用に起因する第三者の特許権お
よびその他の権利の侵害については、当社はその責を負いません。
[高度な安全性が要求される用途への使用について]
本製品は、一般事務用、パーソナル用、家庭用、通常の産業等の一般的用途を想定して開発・設計・製造され
ているものであり、原子力施設における核反応制御、航空機自動飛行制御、航空交通管制、大量輸送システム
における運行制御、生命維持のための医療用機器、兵器システムにおけるミサイル発射制御など、極めて高度
な安全性が要求され、仮に当該安全性が確保されない場合、直接生命・身体に対する重大な危険性を伴う用途
(以下「ハイセイフティ用途」という)に使用されるよう開発・設計・製造されたものではありません。お客さまは本製
品を必要な安全性を確保する措置を施すことなくハイセイフティ用途に使用しないでください。また、お客さまが
ハイセイフティ用途に本製品を使用したことにより発生する、お客様または第三者からのいかなる請求または損
害賠償に対しても富士通株式会社およびその関連会社は一切責任を負いかねます。
Copyright FUJITSU LIMITED 2008-2010
- iv -
目 次
第1章 概要................................................................................................................................................................................1
1.1 ワークフローとは..................................................................................................................................................................................1
1.2 Interstage BPMとは..............................................................................................................................................................................1
1.3 Interstage BPMの特長........................................................................................................................................................................1
1.4 アプリケーションの作成.......................................................................................................................................................................1
第2章 Interstage BPMの基本設計.............................................................................................................................................2
2.1 設定の概要..........................................................................................................................................................................................2
2.2 システムアーキテクチャ.......................................................................................................................................................................3
2.2.1 Interstage BPMサーバ層..............................................................................................................................................................3
2.2.2 Interstage BPMのWeb層およびクライアント層............................................................................................................................5
2.3 Interstage Analytics連携.....................................................................................................................................................................5
2.4 CentraSite連携.....................................................................................................................................................................................6
2.5 Interstage BPMをサービスとして提供する(SaaSモード)....................................................................................................................7
第3章 Interstage BPMの基礎知識.............................................................................................................................................8
3.1 プロセス定義とプロセスインスタンス...................................................................................................................................................8
3.2 プロセス定義........................................................................................................................................................................................8
3.2.1 プロセス定義の状態.....................................................................................................................................................................9
3.2.2 プロセス定義識別子...................................................................................................................................................................10
3.2.3 ワークフローエレメント................................................................................................................................................................10
3.2.4 Java Action.................................................................................................................................................................................11
3.2.5 ロールユーザグループ...............................................................................................................................................................11
3.2.6 フォーム......................................................................................................................................................................................11
3.2.7 タイマー......................................................................................................................................................................................12
3.2.8 プロセス定義の所有権...............................................................................................................................................................12
3.2.9 ユーザ定義属性.........................................................................................................................................................................13
3.2.10 ノードタイプ...............................................................................................................................................................................13
3.2.11 プロセス定義の変更.................................................................................................................................................................19
3.3 プロセスインスタンス..........................................................................................................................................................................19
3.3.1 プロセスインスタンスの状態.......................................................................................................................................................21
3.3.2 ノードインスタンスと矢印インスタンス.........................................................................................................................................21
3.3.3 プロセスインスタンスの所有権...................................................................................................................................................22
3.3.4 添付文書....................................................................................................................................................................................22
3.4 ワークアイテム....................................................................................................................................................................................22
3.4.1 ワークアイテムモード..................................................................................................................................................................22
3.4.2 ワークアイテムの状態.................................................................................................................................................................23
3.4.3 矢印............................................................................................................................................................................................24
3.4.4 将来のワークアイテム.................................................................................................................................................................24
3.5 フィルタ..............................................................................................................................................................................................25
3.6 構造的プロセス編集の目的..............................................................................................................................................................25
3.7 サブプロセス機能の目的..................................................................................................................................................................26
3.8 セキュリティモードと再割当てモード.................................................................................................................................................26
3.8.1 セキュリティモード.......................................................................................................................................................................26
3.8.2 再割当てモード..........................................................................................................................................................................27
第4章 Model API.....................................................................................................................................................................28
4.1 システム環境.....................................................................................................................................................................................28
4.1.1 Interstage Application Server(ローカル)の環境設定...............................................................................................................28
4.1.2 Interstage Application Server (リモート) の環境設定................................................................................................................30
4.1.3 WebSphere Application Server スタンドアロンアプリケーション配備(ローカル)の環境設定.................................................32
4.1.4 WebSphere Application Serverクライアント J2EE アプリケーション配備(ローカル)の環境設定............................................32
4.1.5 WebSphere Application Server スタンドアロンアプリケーション配備(リモート)の環境設定...................................................33
4.1.6 WebSphere Application Serverクライアント J2EE アプリケーション配備(リモート)の環境設定..............................................34
4.1.7 WebLogicの環境設定................................................................................................................................................................36
-v-
4.1.8 JBossの環境設定.......................................................................................................................................................................37
4.2 Model APIアプリケーションの実行...................................................................................................................................................37
4.3 プロパティファイルの格納.................................................................................................................................................................37
4.4 Model APIアーキテクチャー.............................................................................................................................................................38
4.5 例外処理...........................................................................................................................................................................................38
第5章 プロセス定義のデザイン.................................................................................................................................................39
5.1 基本的なプロセス定義のデザイン....................................................................................................................................................39
5.1.1 一般ユーザのログインとログアウト.............................................................................................................................................41
5.1.2 ワークフローアプリケーションを選択する..................................................................................................................................41
5.1.3 プロセス定義の新規デザイン....................................................................................................................................................42
5.2 応用的なプロセス定義のデザイン....................................................................................................................................................44
5.2.1 ユーザ定義属性の追加.............................................................................................................................................................46
5.2.2 Voting Activityノード..................................................................................................................................................................47
5.2.3 ANDノードとORノードの追加....................................................................................................................................................48
5.2.4 Conditionalノード........................................................................................................................................................................48
5.2.5 Subprocessノード.........................................................................................................................................................................49
5.2.6 Delayノード.................................................................................................................................................................................51
5.2.7 Chained-Processノード................................................................................................................................................................51
5.3 プロセスインスタンス..........................................................................................................................................................................53
5.3.1 プロセス定義の最新バージョンの取得......................................................................................................................................54
5.3.2 プロセスインスタンスの作成と開始............................................................................................................................................54
5.3.3 ワークアイテムリストの作成.........................................................................................................................................................55
5.3.4 ワークアイテムの実行.................................................................................................................................................................56
5.3.5 ワークアイテムの取戻し..............................................................................................................................................................56
5.3.6 添付文書....................................................................................................................................................................................59
第6章 Interstage BPMの強化..................................................................................................................................................61
6.1 Interstage BPMと外部アプリケーションの統合.................................................................................................................................61
6.2 アプリケーション変数を使用する......................................................................................................................................................62
6.3 Java Action........................................................................................................................................................................................63
6.3.1 Java Actionsのタイプ..................................................................................................................................................................64
6.3.2 Server Enactment Contextインタフェースを使用するワークフローデータへのアクセス...........................................................65
6.3.3 開始アクションの割当て.............................................................................................................................................................66
6.3.4 終了アクションの割当て.............................................................................................................................................................67
6.3.5 組込みJava Action.....................................................................................................................................................................68
6.3.6 JavaScript Java Action................................................................................................................................................................68
6.3.7 アクティビティの作業者と関連...................................................................................................................................................69
6.3.8 エラーJava Actionの使用...........................................................................................................................................................70
6.3.9 Java Actionのエラー処理...........................................................................................................................................................71
6.3.10 エラーの場合のJava Action構造と実行プラン........................................................................................................................74
6.3.11 中止時、一時停止時、および再開時アクションの使用..........................................................................................................77
6.4 フィルターとソートのAPI....................................................................................................................................................................77
6.4.1 WFObjectListインタフェース......................................................................................................................................................77
6.4.2 フィルターとソートのメソッド........................................................................................................................................................79
6.4.3 メソッドの呼び出し手順..............................................................................................................................................................80
6.4.4 リストに使用するUDAの識別.....................................................................................................................................................80
6.4.5 ソートとフィルター.......................................................................................................................................................................80
6.4.6 バッチ処理の注意点..................................................................................................................................................................80
6.4.7 リストの更新通知.........................................................................................................................................................................81
6.5 複数オブジェクトの情報の一括取得................................................................................................................................................81
6.6 プロセスコメントの使い方..................................................................................................................................................................82
6.7 特別なユーザ定義属性のプロパティ...............................................................................................................................................84
6.7.1 タイプXMLのユーザ定義属性でのワーク................................................................................................................................84
6.7.2 ワークリストUDA..........................................................................................................................................................................85
6.8 拡張属性の使用................................................................................................................................................................................86
6.8.1 拡張属性の割当て.....................................................................................................................................................................87
6.8.2 拡張属性値の取得.....................................................................................................................................................................88
- vi -
6.8.3 エレメントの全拡張属性の取得.................................................................................................................................................88
6.8.4 拡張属性の名前.........................................................................................................................................................................89
6.8.5 拡張属性の名前空間.................................................................................................................................................................91
6.9 トランザクション制御..........................................................................................................................................................................92
6.10 トリガ.................................................................................................................................................................................................93
6.10.1 トリガの機能..............................................................................................................................................................................94
6.10.2 トリガの定義..............................................................................................................................................................................94
6.11 Event Activity(Trigger)ノードの使用..............................................................................................................................................96
6.12 File Listenerファイルリスナ..............................................................................................................................................................97
6.12.1 File Listenerファイルリスナの使用...........................................................................................................................................97
6.12.2 File Listenerファイルリスナの設定...........................................................................................................................................98
6.13 Emailリスナ......................................................................................................................................................................................99
6.13.1 トリガ起動のためのEmailリスナの使用....................................................................................................................................99
6.14 JMS リスナ......................................................................................................................................................................................101
6.14.1 トリガ起動のためのJMSリスナの使用....................................................................................................................................101
6.15 エージェントの使用.......................................................................................................................................................................102
6.15.1 エージェントの概要................................................................................................................................................................103
6.15.2 FTPエージェントの構成.........................................................................................................................................................104
6.15.3 FTPエージェントの使用.........................................................................................................................................................106
6.15.4 HTTPエージェントの設定......................................................................................................................................................107
6.15.5 HTTPエージェントの使用......................................................................................................................................................108
6.16 タイマーの使用..............................................................................................................................................................................109
6.16.1 タイマーの定義.......................................................................................................................................................................109
6.16.2 期限の追加.............................................................................................................................................................................111
6.16.3 タイマーの実行を制御する....................................................................................................................................................111
6.16.4 タイマーインスタンス履歴.......................................................................................................................................................112
6.16.5 ビジネスカレンダーの使用.....................................................................................................................................................112
6.16.6 タイマーの時刻コードと日付コード........................................................................................................................................114
6.17 リモートサブプロセスのモデル化..................................................................................................................................................115
6.17.1 親とリモートサブプロセス定義を設計....................................................................................................................................116
6.17.2 実行中のリモートサブプロセス定義.......................................................................................................................................119
6.17.3 リモートサブプロセスのエラー処理........................................................................................................................................119
6.18 Compound Activityノードの使い方..............................................................................................................................................120
6.18.1 Compound Activityノードの定義...........................................................................................................................................121
6.19 ダイナミックサブタスクの使い方....................................................................................................................................................121
6.20 ダイナミックプロセスの使い方.......................................................................................................................................................123
6.21 決定表...........................................................................................................................................................................................124
6.21.1 決定表の概念.........................................................................................................................................................................124
6.21.2 プロセス定義内での決定表の使用.......................................................................................................................................125
6.21.3 決定表の仕様.........................................................................................................................................................................126
6.21.4 決定表の管理.........................................................................................................................................................................127
6.22 Iteratorノード..................................................................................................................................................................................130
6.22.1 Iteratedアクティビティノード....................................................................................................................................................131
6.22.2 繰り返し作成されたSubprocessノードとChained-Processノード.............................................................................................132
6.22.3 Iteratorノードの使い方...........................................................................................................................................................132
第7章 運用管理..................................................................................................................................................................... 138
7.1 管理者のログインとログアウト(テナント所有者)..............................................................................................................................138
7.2 ワークフローアプリケーションを選択する.......................................................................................................................................139
7.3 ユーザおよびグループ管理...........................................................................................................................................................139
7.3.1 ローカルユーザの管理............................................................................................................................................................140
7.3.2 ローカルグループの管理.........................................................................................................................................................140
7.3.3 ログインしたユーザリストの作成...............................................................................................................................................142
7.3.4 ユーザのログアウト...................................................................................................................................................................142
7.3.5 ユーザとグループキャッシュのリセット.....................................................................................................................................142
7.4 プロセス定義管理............................................................................................................................................................................143
7.4.1 プロセス定義リストの作成.........................................................................................................................................................143
- vii -
7.4.2 プロセス定義の公開.................................................................................................................................................................144
7.4.3 プロセス定義のアーカイブ.......................................................................................................................................................144
7.4.4 プロセス定義の削除.................................................................................................................................................................145
7.4.5 アーカイブ済のプロセス定義の削除.......................................................................................................................................145
7.4.6 プロセス定義のインポート........................................................................................................................................................145
7.4.7 プロセス定義のエクスポート.....................................................................................................................................................146
7.5 プロセスインスタンス管理................................................................................................................................................................146
7.5.1 プロセスインスタンスリストの作成.............................................................................................................................................147
7.5.2 プロセスインスタンスの所有権の変更.....................................................................................................................................147
7.5.3 プロセスインスタンスのアーカイブ...........................................................................................................................................148
7.5.4 プロセスインスタンスの一時停止.............................................................................................................................................148
7.5.5 プロセスインスタンスの中止.....................................................................................................................................................149
7.5.6 プロセスインスタンスの削除.....................................................................................................................................................150
7.5.7 アーカイブ済のプロセスインスタンスの削除...........................................................................................................................150
7.6 ワークアイテム管理..........................................................................................................................................................................150
7.6.1 ワークアイテムのユーザに再割当て........................................................................................................................................150
7.6.2 ワークアイテムの更新...............................................................................................................................................................151
第8章 履歴情報の取得..........................................................................................................................................................153
8.1 Model APIを使用した履歴情報の取得..........................................................................................................................................153
8.2 ハッシュテーブルからの履歴情報の取得......................................................................................................................................154
8.2.1 HISTORY_ID...........................................................................................................................................................................154
8.2.2 HISTORY_TIME_STAMP......................................................................................................................................................154
8.2.3 HISTORY_EVENT_CODE.....................................................................................................................................................154
8.2.4 HISTORY_EVENT_TYPE......................................................................................................................................................155
8.2.5 HISTORY_EVENTDATA.......................................................................................................................................................155
8.2.6 HISTORY_PRODUCER_ID....................................................................................................................................................155
8.2.7 HISTORY_PRODUCER_TYPE..............................................................................................................................................155
8.2.8 HISTORY_CONSUMER_ID...................................................................................................................................................156
8.2.9 HISTORY_CONSUMER_TYPE.............................................................................................................................................156
8.2.10 HISTORY_ISHANDLED_CODE.........................................................................................................................................156
8.2.11 HISTORY_PROCESSINSTANCE_ID..................................................................................................................................156
8.2.12 HISTORY_RESPONSIBLE...................................................................................................................................................157
8.2.13 履歴エントリの検索ルール.....................................................................................................................................................157
8.3 履歴テーブル..................................................................................................................................................................................158
8.4 SQLステートメントの履歴情報検索................................................................................................................................................159
付録A Interstage BPMのサンプル.........................................................................................................................................161
A.1 /client/samples/examples/sources...................................................................................................................................................161
A.1.1 プロセスのモデル化と実行に関連したサンプル....................................................................................................................161
A.1.2 System Administration に関連したサンプル..........................................................................................................................162
A.1.3 JMS インタフェースに関連したサンプル................................................................................................................................163
A.1.4 決定表に関連したサンプル....................................................................................................................................................165
A.2 /client/samples/examples/classes....................................................................................................................................................165
A.3 /client/samples/examples/bin..........................................................................................................................................................165
付録B JavaScript関数...........................................................................................................................................................166
B.1 JavaScript関数................................................................................................................................................................................166
B.2 Java ActionでサポートするJavaScript関数....................................................................................................................................169
B.3 トリガでサポートするJavaScript関数...............................................................................................................................................171
付録C トラブルシューティング.................................................................................................................................................172
C.1 ログファイルの情報.........................................................................................................................................................................172
C.2 特定のエラー状態を解決...............................................................................................................................................................172
C.2.1 Interstage BPMサーバの起動の失敗.....................................................................................................................................172
C.2.2 IBPMServer.logのエラー.........................................................................................................................................................173
C.2.3 JavaScript実行中の時間切れ.................................................................................................................................................173
C.2.4 Oracleデータベースへの書き込み時のエラー.......................................................................................................................173
- viii -
C.2.5 Interstage Applicationサーバの警告、エラーメッセージ........................................................................................................173
C.3 インストール、配備時および構成時に発生するエラー.................................................................................................................174
C.4 Interstage BPMサーバの起動時のエラー.....................................................................................................................................176
C.5 問題が解決できない場合...............................................................................................................................................................177
用語集...................................................................................................................................................................................179
索引......................................................................................................................................................................................185
- ix -
第1章 概要
Interstage BPMはワークフローアプリケーション開発用のAPIを備えた、サーバベースのワークフローエンジンです。開発者やシステム
エンジニアは、独自の製品やシステムにワークフローエンジンとしてInterstage BPMを組み込むことができます。 Interstage BPMは、シ
ステム管理者やソフトウェア製品ベンダーの方を対象とした製品です。
1.1 ワークフローとは
ワークフローは、ビジネスプロセスを自動化するための比較的新しい手法です。ビジネスプロセスの自動化は、初期の手法では、作業
フローのロジックは専用アプリケーションに組み込まれていました。このため、作業プロセスの変化に応じて、アプリケーションを更新す
る必要があり、保守に多大な労力を必要としていました。
ワークフロー製品は、プロセスのあらゆる状況をカプセル化することによってこの問題を解決しています。たとえば、ルール、ルーティン
グパス、アクティビティ、データなどのプロセス定義の情報をカプセル化します。さらに、これら情報を自動的に管理します。このように、
ワークフロー対応の製品を使うことで、ワークフロープロセス自体の深い知識がなくても、ワークフローシステムを実装できます。
1.2 Interstage BPMとは
Interstage BPMは、Web対応の分散型ワークフローアプリケーション開発ツールです。ビジネスプロセスにモデル化、自動化、統合、管
理、最適化というライフサイクルを適合し、プロセス改善を遂行するビジネスプロセス管理ソリューションを提供します。
Interstage BPMの主要な機能は以下のとおりです。
・ 多様なプロセスを実行できる、拡張性のある実行基盤。
・ Interstage BPMサーバと連携するユーザアプリケーション開発用APIの提供。
・ プロセスに関連する添付文書の一元管理。
1.3 Interstage BPMの特長
Interstage BPMの背景にあるのは、ワークフローシステムの導入により業務を自動化することができ、日常業務にかかる時間を短縮す
ることで、本来の業務に専念できるようにするという考え方です。たとえば、カスタマーサービスの担当者や営業担当者は、業務を自動
化することにより、注文やクレームなどの処理よりも顧客サービスに集中できるようになります。
エンジニアリング、ビジネス開発、および研究開発業務への適用においては、Interstage BPMの柔軟性を活用して、会社、部署、部
門、チームそれぞれのレベルで業務の進捗状況を監視し、業務の実施を促進することができます。これにより、グループ内の一人一
人の能力を最大限に引き出せます。
Interstage BPMでは、実装時に適用業務に応じた情報を組み込んだり、アプリケーションをカスタマイズして業務に応じた適用を行うこ
とができます。
1.4 アプリケーションの作成
このマニュアルは、お客様がお持ちの製品やシステムへのInterstage BPMの組み込みおよび機能拡張を行う際、ご利用いただくことを
目的としています。これを最も効果的かつ実践的に行うには、まず、Interstage BPMサーバのインストールディレクトリにあるclient/samples
サブディレクトリのサンプルをご覧いただき、サンプルのクラスに組み込まれている内容を確認してから、お客様のニーズに合うようアプ
リケーション作成の計画を立案することをお勧めします。
以下は、基本的な開発方法です。
・ Model APIを使用することにより、Interstage BPMサーバにアクセスするWebアプリケーションなどを作成します。Model APIの詳細
は、『API Javadocマニュアル』を参照してください。『API Javadocマニュアル』は、Interstage BPMのインストールディレクトリのjavadocs
サブディレクトリにあります。
・ JavaActionを使用すると、データの取り扱いや意思決定の自動化に向けた、システムの機能拡張が可能です。これにより、ビジネ
スプロセスを自動化することができます。
-1-
第2章 Interstage BPMの基本設計
Interstage BPMは、ワークフローアプリケーション開発用のApplication Programming Interfaces(以降、APIと呼びます。)を備えた、サー
バベースのワークフローエンジンです。開発者やシステムエンジニアは、製品やシステムにワークフローエンジンとしてInterstage BPM
を組み込むことができます。
Interstage BPMの主な機能は以下のとおりです。
・ Interstage BPMサーバと連携するユーザアプリケーションを開発するためのAPIを提供。
・ 多様なプロセスを実行できる、拡張性のある実行基盤。
・ プロセスに関連する文書の一元管理。
・ Interstage BPM Analytics:Interstage BPMサーバは、業務プロセスの監視データをInterstage Analyticエンジンに提供できます。
Interstage Analyticsを使用して、このデータを評価、処理することができます。詳細は、「2.3 Interstage Analytics連携」を参照してく
ださい。
・ CentraSite連携:CentraSiteと連携することで、プロセス定義をリポジトリに登録したり、UDDIレジストリからWebサービス情報(WSDL)
を検索することが可能。詳細については、「2.4 CentraSite連携」を参照してください。
2.1 設定の概要
Interstage BPMは以下の設定で動作します。
図2.1 設定の概要
Interstage BPMサーバは、データベースおよびオプションとしてディレクトリサービスと共に動作します。Interstage BPMサーバへのアク
セスには、Interstage BPMクライアントを使います。
Interstage BPMの完全なインストール環境を構成するコンポーネントを、様々な設定でインストールできます。
・ システムはすべて、同一のコンピュータにインストールします。
・ 以下の1つまたは複数については、別々のコンピュータにインストールします。
- Interstage BPMサーバ
- データベース
- ディレクトリサービス
- Interstage BPMコンソール
- Studio
詳細については、『Interstage Business Process Manager サーバ・コンソール導入ガイド』を参照してください。
-2-
2.2 システムアーキテクチャ
Interstage BPMは、基本的にサーバとModel APIで構成されています。複数の接続オプションにより、サードパーティ製のツールとその
他システムを統合できます。ここでは、Interstage BPMコンポーネントとその連携の概要について説明します。
図2.2 アーキテクチャの概要
2.2.1 Interstage BPMサーバ層
Interstage BPMサーバは、Enterprise Java Bean(EJB)インタフェースを提供しているアプリケーションサーバ内で動作します。サーバ
は、ユーザとその他コンポーネント間の対話を受け持ち、ユーザが開始したプロセスを実行し、ユーザにプロセス内におけるステータ
スの変更を通知します。Interstage BPMは、アプリケーションサーバの標準機能を使って設定できます。Model APIを使って開発したク
ライアント経由でのみ、サーバにアクセスできます。
Interstage BPMは、オペレーティングシステムやデータベースの相違からアプリケーションを隔離する標準アプリケーションサーバへ配
備されます。Interstage BPMは、アプリケーションサーバの機能を利用して、たとえばクラスタリング、ロードバランシング、フェイルオー
バーなどの機能を提供します。
サーバは、アプリケーションサーバ内で動作するEJBの集合体として構成され、アプリケーションサーバの機能を活用します。Interstage
BPMのEJBは、コンテナトランザクションに参加し、サーバや任意のクライアントアプリケーションが同じトランザクションに参加できるよう
にします。コンテナベースのトランザクションによって、サーバの一貫性が保たれます。
以下のセクションでは、EJBについてさらに詳しく説明します。
ユーザエージェント(ファサード)
ユーザエージェントEJB(UA bean)によって、クライアントはInterstage BPMシステムにログインでき、クライアントとInterstage BPMとの認
証、対話を行います。まず、クライアントがUA beanの作成を要求します。次に、サーバがUA beanを作成して、UA beanへのハンドルを
クライアントに返します。そして、クライアントがサーバログインに必要なユーザ名、パスワード、サーバ名を提供します。この情報は、
Interstage BPMのローカルユーザ管理機能、または接続しているディレクトリサービスの機能を使って認証されます。
ユーザエージェントインスタンスは、サーバへのログインセッションを表し、特定のログインセッションの情報を保持します。ユーザエー
ジェントは、クライアントのエージェントとしてクライアントに代わり、他のInterstage BPMコンポーネントに対して、bean要求やメソッド呼び
出しを行います。つまり、モデルはプロセス定義、プロセスインスタンス、ワークアイテム、ディレクトリ、その他オブジェクトにアクセスす
るゲートウェイとして機能します。こうしたことから、UA beanは、サーバとモデルの間のインタフェースを表すファサードとも呼ばれます。
UA beanには、プロセス定義、プロセスインスタンス、ワークアイテムオブジェクトに対する様々なフィルタを解釈するという機能もありま
す。クライアントがログアウトを選択すると、ユーザエージェントは、関連するクライアントに代わり保持するリソースに必要な、クリーンアッ
プを行います。さらに、UA beanはセッションの同期を実装しています。
-3-
サーバは、Interstage BPMにログインする各クライアントに対して、UA beanの固有のインスタンスを要求します。サーバは、アプリケー
ションサーバを構成するEJBコンテナに対して、これらのインスタンスを要求します。サーバbeanは、UA beanのインスタンスを「作成」す
る、いわゆるファクトリ(工場)のようなものです。
実行エンジン - プロセス定義インタプリタ
プロセス定義インタプリタは、Interstage BPMサーバのコアです。Interstage BPMで定義したプロセスの実行を受け持ちます。サーバ
は、データベースアダプタと通信し、プロセスステートデータ、プロセスインスタンス、アクティビティ関連データ、プロセス履歴情報を維
持管理します。サーバは、データベース要求キューを管理します。
エンティティbeanには2種類あり、プロセス定義とインスタンスの情報を保持するデータオブジェクトを表しています。プロセスを実行す
ると、プロセス定義EJBが作成され、次にプロセスインスタンスbeanが作成されます。どちらのbeanも、bean管理永続性およびコンテナト
ランザクションという、アプリケーションサーバの機能を実装しています。
これらのbeanモデルには公開されません。モデルに対するすべての要求はUA beanを経由して行われます。
現在の状況に関する情報といったプロセスデータは、データベースに格納され、要求に応じてデータベースから読み出されます。サー
バは、データベースと通信し、プロセスステートデータ、プロセスおよびアクティビティ関連データを維持管理します。
メッセージング
Message Driven bean(MDB)とJavaクラスライブラリの組み合わせによって、Interstage BPMのタイプシステム(Metaモデル)が実装され
ます。プロセス実行イベントは、MDBが処理するJMSメッセージ内にカプセル化されます。Interstage BPMは、デフォルトのアプリケー
ションサーバ機能を利用します。
Interstage BPMでは、Message Driven bean(MDB)は、非同期メッセージを用いてサーバコンポーネント間に情報のフローを作ります。
たとえば以下のようなMDBがあります。
・ EnactmentMessage Bean:プロセスインスタンスが作成されると、このbeanはメッセージを生成してクライアントに通知します。
・ Email Dispatcher bean:クライアントへのEmailメッセージを扱います。
・ Action Agent bean:アクションエージェントを扱います。
カスタムEJB
任意のアプリケーションに、Interstage BPMサーバと同じアプリケーションサーバインストール環境上で動作するEJBを実装できます。
カスタムEJBはModel APIを使い、Interstage BPMのEJBはJava Actionを使ってカスタムEJBを呼び出せます。
ユーザおよびグループ管理
Interstage BPMで作業するすべてのユーザにユーザアカウントが必要です。また各ユーザは、1つ以上のグループに割り当てられてい
る必要があります。グループを使って、プロセスのタスクを実行する担当者を決定します。
Interstage BPMには、独自のユーザ管理とグループ管理の機能があります。また、Interstage BPMからディレクトリサービスに接続する
ことも可能です。Interstage BPMのローカルユーザストアとディレクトリサービスのどちらでユーザを管理するかは、サーバの配備時に
選択できます。グループは、Interstage BPMのローカルグループストア、ディレクトリサービス、または両方のシステムで管理できます。
接続性
Interstage BPMのアーキテクチャは、サードパーティ製品との統合を考慮に入れています。サーバは、「アダプタクラス」を介して他のコ
ンポーネントと通信できます。アダプタは、サーバを共通のインタフェースと通信させるコンバータとして動作します。Interstage BPMで
は、以下への接続が可能です。
・ JDBC規格を用いたデータベース(DB)アダプタ。サーバは、データベースサーバとの間の通信手段を提供します。データベース
は、すべてのプロセス情報を一貫して格納し、維持管理します。DBアダプタは、サーバ内オブジェクトを一貫性のある多様な形式
に変換させます。Interstage BPMには、JDBCおよび複数のストアドプロシージャを用いて、関連するデータベース内の構造を持続
させるアダプタがあります。Oracle、Microsoft SQL Server、Symfowareサーバを使用できるように設定する、初期化スクリプトが利
用可能です。
・ Interstage BPMの特定のインタフェースを実装して、ユーザグループを個人の一覧に拡張するディレクトリサービス(Dir & DD)ア
ダプタ。実行エンジンは、これを実行時に使ってワークアイテムを渡す相手を決定します。ディレクトリサービスアダプタは、LDAP
規格を使っています。現時点では、Microsoft® Active DirectoryおよびSun Java System Directory Serverをサポートしています。
ユーザエージェントが、DD Framework Adapterを使ってログイン時にユーザを認証します。
-4-
・ Interstage BPMシステムと、標準的コピーおよび転送プロトコルを使う外部のファイルシステムをインタフェースで接続するために使
われるDMSアダプタ。フォーム、添付文書、プロセス定義などは、ファイルシステムに格納できます。こうしたドキュメントのロケータ
は、プロセスインスタンスの添付文書の属性に格納されています。Interstage BPMは、WebDAVプロトコルを介してアクセスできる
ファイルシステムやファイルストアに格納されたドキュメントにアクセスしたDMSアダプタを備えています。他のドキュメント管理シス
テムにアクセスするには、カスタムDMSアダプタが必要です。
・ SMTP規格を使ったメッセージ。Interstage BPMイベントへのレスポンスとして、サーバからSMTPメールサーバへEmailを送信でき
ます。
・ 外部システム。
- Java ActionとJavaScript:CRMやERPシステムのような任意の外部システムへの接続のために、Java Actionを実装できます。
Java Actionはワークフローエンジンの拡張機能です。
Java Actionは、Interstage BPMサーバに実行中に特定のJavaメソッドを呼び出す方法を提供するプロセス定義のデータ構造
です。これらのメソッドの呼び出しは、プロセスの実行をカスタマイズし、Interstage BPMサーバの機能範囲外でのJavaビジネス
メソッドの実行を可能にします。Java Actionによって、アプリケーションの統合が容易になり、外部アプリケーションやアダプタ
の呼び出しが速くなります。
- エージェント:Interstage BPMのエージェントが設定され、自動的かつユーザの代わりに非同期に動作します。エージェントを
使って、会社のファイアウォール内外を問わず、レガシーシステムやWebサービスなどの外部システムにアクセスできます。エー
ジェントを使って、これらの外部サービスをInterstage BPMのプロセスインスタンスに組み込めます。このJava統合方式は、複数
の再試行が必要な場合に特に便利です。
2.2.2 Interstage BPMのWeb層およびクライアント層
Model APIは、サーバのアブストラクト層で、単独の統合APIをサーバに提供します。Model APIは、クライアントプロセスで動作し、サー
バへの通信すべてを処理します。
Interstage BPMは、StudioやBPMコンソールのような複数のクライアントアプリケーションを備えています。
Studioを除いて、クライアントはservletエンジンで動作し、Webブラウザを使ってアクセスします。クライアントは、Javaユーザインタフェー
スクラスの組み合わせによって構成されています。そのようなクライアントコンポーネントは、2層で構成されています。1つはモデル層
(Model APIを使用)、もう1つはユーザインタフェース層(Javaユーザインタフェースクラスを使用)です。モデル層は、クライアントオブ
ジェクトのステートをカプセル化し、サーバと対話します。Model APIを使って、クライアントアプリケーションおよびユーザアプリケーショ
ンを開発できます。
Studioは、別途インストール可能なスタンドアロン型のプロセスデザインツールです。Studioは、アプリケーションサーバの機能からは独
立しています。Studioは、Web層を通してInterstage BPM サーバと相互に作用します。
Webサービス機能はweb層にあります。この機能によって、多数の定義済みSOAP(Simple Object Access Protocol)要求を受け取り、XML
形式の結果を使って応答できます。このポートを経由して、ほとんどのInterstage BPMの共通操作にアクセスできます。
Interstage BPMは、非同期Web Serviceインタフェースとして知られる、もう1種類のWebサービスインタフェースをサポートしています。
これは、プロセスインスタンスや他の長時間動作プログラムにアクセスする標準的な方法を実装したものです。この規格は、Asynchronous
Service Access Protocol(ASAP)として知られています。
Interstage BPM Webサービスの詳細については、『Interstage Business Process Manager サーバ・コンソール導入ガイド』を参照してくだ
さい。
2.3 Interstage Analytics連携
Interstage Analyticsは、Interstage BPMサーバのプロセスデータの分析と評価に使います。Interstage BPM 配備ツールによって、
Interstage Analyticsが評価するイベントをInterstage BPMのデータベースへ書き込むかどうかを設定できます。
以下の図は、関連するアプリケーションの相互作用を表しています。
-5-
図2.3 Interstage Analytics連携
Interstage BPMサーバ、Interstage Analyticsセンサ、Interstage Analyticsサーバは、同一の装置または同一ネットワーク上の異なる装
置にインストールできます。
配備中のイベント送信の設定方法については、『Interstage Business Process Manager サーバ・コンソール導入ガイド』を参照してくださ
い。
センサの設定とInterstage Analyticsの使用方法については、Interstage Analyticsのマニュアルを参照してください。
2.4 CentraSite連携
CentraSiteは、連携ソフトウェアで生成されたメタデータ、Webサービスの説明、およびアプリケーション固有のデータを管理するほか、
ネイティブXML形式および非XML形式の文書を一元的に格納する場所として機能します。
CentraSiteが提供する以下の機能をInterstage BPMから使用できます。
・ UDDIレジストリ
・ WebDAVリポジトリ
UDDIは業界標準の仕様であり、Webサービスを使用するための公開、検索、およびステージングのようなレジストリ公開機能を提供し
ます。Interstage BPMが提供するWebサービス機能の公開、検索、および取得は標準のUDDIインタフェースに基づいているため、
Interstage BPMからCentraSiteをUDDIレジストリ実装として使用できます。
WebDAVもまた業界標準の仕様であり、XPDLなどの標準フォーマットで保存されている開発成果物の保存と取得に使用できます。
Interstage BPMにはメタデータをWebDAVで公開する機能が用意されているため、Interstage BPMからCentraSiteをWebDAVリポジトリ
実装として使用できます。
-6-
2.5 Interstage BPMをサービスとして提供する(SaaSモード)
Interstage BPMには、SaaS (Software as a Service)モードがあります。SaaSモードでInterstage BPMを使用すると、複数のテナントを作
成して、ユーザへそれらをリースできます。ユーザは、それらをサービスとして使用できます。なお、以下に注意してください。
・ Interstage BPMをインストールする際に、SaaSモードでInterstage BPMを使用するかどうかを決めることができます。
・ Interstage BPMをサービスとしてリースする組織をサービスプロバイダと呼びます。
・ サービスプロバイダが、サービスとして提供するInterstage BPMをテナントと呼びます。
・ サービスプロバイダが、テナントを管理するためのユーザをスーパーユーザと呼びます。スーパーユーザの権限は、テナント管理
に制限されます。テナント管理のために、Interstage BPM テナント管理コンソールを使用できます。
- Interstage BPM テナント管理コンソールのインストール方法については、『Interstage Business Process Manager サーバ・コン
ソール導入ガイド』を参照してください。
- Interstage BPM テナント管理コンソールの利用方法については、Interstage BPM テナント管理 コンソールのオンラインヘルプ
を参照してください。
- Interstage BPMの管理については、『Interstage BPM サーバ管理者ガイド』を参照してください。
・ スーパーユーザは、Interstage BPM ワークフロー機能の管理および利用ができません。
・ サービスプロバイダは、自身がInterstage BPMを使用するために、Interstage BPMをインストールする際に、デフォルトテナントを作
成する必要があります。このとき、デフォルトテナントに、システムアプリケーションが作成されます。
・ 非SaaSモードで、Interstage BPMを使用する場合、以下に注意してください。
- インストールの際に、スーパーユーザを設定する必要があります。スーパーユーザの権限は、Interstage BPMサーバの管理だ
けに制限されます。
- インストールの際に、デフォルトテナントを設定する必要があります。デフォルトテナントを通して、Interstage BPMサーバの機
能を使用します。デフォルトテナント以外のテナントは、作成できません。
・ Interstage BPMを使用する場合、SaaSモードまたは非SaaSモードに関わらず、すべてのワークフローの要素の操作は、アプリケー
ションに含まれます。このため、プロセス定義かプロセスインスタンスを作成する前に、アプリケーションを選択する必要があります。
SaaSモードでは、必ずアプリケーションを選択しなければなりません。非SaaSモードでは、アプリケーションの選択を省略できます。
-7-
第3章 Interstage BPMの基礎知識
ワークフローアプリケーションの開発者およびユーザは、ワークフローアプリケーションの開始から終了までの間に以下の操作の一部、
またはすべてを行います。
・ Interstage BPMサーバへの接続
・ プロセス定義の構築
・ 新しいプロセスインスタンスの開始
・ プロセスインスタンスの変更
・ Java Actionでの変数の変更
・ プロセスインスタンスへの添付文書の関連付け
・ アクティビティの矢印オプションの実行
・ プロセス定義リスト、プロセスインスタンスリスト、およびワークアイテムリストの取得
・ プロセスインスタンスとアクティビティの状態の取得
これらの操作の働きは、この章で詳しく解説します。
3.1 プロセス定義とプロセスインスタンス
ワークフローは、複雑なプロジェクトにおける共同作業や、作業調整の中心となります。この共同作業の基礎となるのがプロセス定義で
す。プロセス定義は、業務で扱う情報と、作業手順および作業判断の条件を提供します。
プロセスインスタンスは、プロセス定義に基づいて実際の作業状態を表したものです。プロセスインスタンスはプロジェクト内の作業を
進めるために、必要となる情報を提供します。すべての業務担当者が適切な時間に適切な作業情報を取得していること、およびすべ
ての人が定められた手順に従って作業情報を使用していることを保証します。ビジネスにおいては、「作業情報」は一般的に文書や
データで構成されています。
プロセスインスタンスはプロセス定義内にデザインされている構造や機能を反映するので、プロセス定義に従属するオブジェクトとプロ
セスインスタンスは、密にやりとりを行います。ここでは、まずプロセス定義に関連するクラスに焦点をあてて、システム全体を理解する
ための基礎的な知識について説明します。
3.2 プロセス定義
プロセス定義は、デザイン時に設定されるプロセスインスタンスのすべての状況をカプセル化します。状況には、定義済属性、プロセ
スインスタンスが実行されたときに行われる操作、実行時に設定される変数データの定義、およびプロセス定義の状態が含まれます。
プロセス定義の属性
プロセス定義の属性には以下のものが含まれます(ただし、以下のものに限定はされません)。
・ プロセス定義の状態
・ プロセス定義識別子
- ID
- バージョン
- 所有者
- 名前
- タイトル(省略可)
- 説明(省略可)
・ フローコントロール
- ノード
-8-
- 矢印
・ プロセス定義の所有権(ロール)
・ 変数データ
- ユーザ定義属性(以降、UDAと呼びます。)
・ Java Action
- 初期化アクション
- 完了アクション
- エラーアクション、一時停止時アクション、再開時アクション、中止時アクション
・ タイマーアクションを含むタイマー
注意
これらの属性はデザイン時にプロセス定義に追加されます。ただし、そのほとんどは、プロセス定義がプロセスインスタンスを作成し、プ
ロセスインスタンスが実行されるまで特別な意味はありません。
3.2.1 プロセス定義の状態
プロセス定義は、以下の状態のいずれかになっています。
・ ドラフト
・ 公開済
・ プライベート
・ 廃止
・ 削除済
ドラフト状態のプロセス定義は、デザイン中のプロセス定義です。ドラフトプロセス定義の所有者だけが、そのプロセス定義からプロセ
スインスタンスを作成することができます(テスト用として)。管理者 (テナント所有者)がドラフトプロセス定義を公開すると、一般ユーザが
プロセス定義からプロセスインスタンスを開始できるようになります。ユーザが実行中のプロセスインスタンスを変更すると、そのプロセ
スインスタンス専用にプライベートプロセス定義が作成されます。
公開済みのプロセス定義を編集することはできませんが、ドラフト状態にあるプロセス定義の新しいコピーを作成することが可能です。
プロセス定義の新しいコピーは、公開済みになるまでは編集可能です。
図3.1 プロセス定義の状態
-9-
公開済みプロセス定義を回収したい場合、管理者はプロセス定義の状態を公開済から廃止に変更することができます。プロセス定義
を削除したい場合、管理者はその状態を削除済に変更することができます。ドラフトとプライベートのプロセス定義を削除すると、シス
テムから物理的に削除されます。公開済または廃止のプロセス定義を削除すると、システムからは物理的に削除されませんが、状態
の変更はできなくなります。新しいバージョンをドラフト、プライベート、公開済、および廃止状態のプロセス定義から作成できますが、
削除済のプロセス定義からは作成できません。
注意
プライベートプロセス定義を現在使用されているプロセス定義と将来入れ替えたいと考えている場合は、単純にプライベートプロセス
定義の新しいバージョンを作成してください。新しいプロセス定義には、同じ名前でバージョン番号が上がり、ドラフト状態となります。管理者
(テナント所有者)だけがドラフトプロセス定義の状態を公開済に変更できます。ドラフト状態のプロセス定義を公開すると、自動的に、
元のプロセス定義の状態が公開済から廃止に変更されます。
各プロセス定義ファミリ(つまり、同じ名前で別のバージョン番号のプロセス定義)は、公開済のプロセス定義を1つだけもつことができま
す。
3.2.2 プロセス定義識別子
プロセス定義は次の属性で識別されます。
・ ID
・ バージョン
・ 所有者
・ 名前
・ タイトル(省略可)
・ 説明(省略可)
IDはLong型の変数で、プロセス定義を一意に取り扱うために、Interstage BPMサーバから自動的に割り当てられます。バージョン番号
は自動的に割り当てられます。所有者はプロセス定義の作成者です。
そのほかの3つの識別子は省略可能です。アプリケーションをデザインする場合、必要であれば、Model APIのPlanインタフェースから
名前、タイトル、説明にアクセスすることができます。
プロセス定義の版数管理
新しいプロセス定義には、バージョン番号1.0が割り当てられます。たとえば、Purchase Order v1.0などです。プロセス定義の新しいバー
ジョンは、名前を変更せずに作成することができます。プロセス定義をコピーした場合、プロセス定義の新しいバージョンは、次のバー
ジョン番号になります。たとえば、Purchase Order v2.0などです。
注意
アプリケーションが異なれば、プロセス定義は同じ名前のプロセス定義を作成することができます。
3.2.3 ワークフローエレメント
ワークフロープロセスは、矢印によって接続されたノードのネットワークです。ノードと矢印はワークフローエレメントと呼ばれます。
ノードはプロセス内の手順を表します。手順は、プロセスの関係者に特定のタスクを割り当てるアクティビティを表す場合も、プロセスフ
ローに関する決定が行われる場所を表す場合もあります。後者の場合、ユーザによるアクションは不要です。
ワークフローエレメントには、少なくともID、名前、タイトル、および説明という属性があります。IDは、すべてのワークフローエレメントが
必ず持っていなければならない属性です。Interstage BPMサーバは、ワークフロープロセス内の各エレメントを識別するために、自動
的に固有のIDを割り当てます。
すべてのノードがもつ属性に加えて、特定のノードでは、そのノード固有のプロパティがあります。これらのプロパティは、そのノードタ
イプが目的とする動作をするために必要となります。
- 10 -
矢印は、プロセスインスタンスの1つのノードから別のノードへのフローをつなぐ接続子です。イベントのフローは、単純に1つのノードか
ら次のノードへ、フロー上の矢印を通っていきます。矢印には、つなぎ先ノードの状態を変えること以外の機能はほとんどありません。
矢印には、ID、名前、および説明という、簡単な識別子があります。IDのデータ型は「long」で、プロセス定義に一意のハンドルを提供
するために、Interstage BPMサーバから自動的に割り当てられます。
説明は省略可能です。アプリケーションをデザインする場合、必要であれば、Model APIのPlanインタフェースからID、名前、説明の
フィールドにアクセスすることができます。
3.2.4 Java Action
プロセスインスタンスは、それらを実行するInterstage BPMサーバ上に存在しており、どのようなクライアントであってもプロセスインスタ
ンスを通じてユーザとやりとりできます。Java Actionは、プロセスインスタンスが外部と通信できるメカニズムを提供します。根本的に、
Java Actionは、Interstage BPMがプロセス実行の一部として呼び出すことができるよう構成されている、静的なJavaメソッドにすぎませ
ん。
Interstage BPMは、さまざまなタイプのJava Actionを提供します。主にJava Actionはノードで定義されています。たとえば、プロセス定
義全体で定義されているもの、他のJava Actionで定義されているものなどがあります。
・ 開始アクション:開始アクションは、ノードがタスクを実行する前に評価されます。したがって、このJava Actionは、ノードがタスクを実
行する前にそのノードに関連付けられている値を設定または初期化するために使用されます。
・ 終了アクション:終了アクションは、ノードがタスクを終了した後、プロセスインスタンスが別のノードに移動する前に実行されます。
したがって、このJava Actionは、目的の作業が終了した後、ノードに関連付けられた値を事後処理するまたは分析するために使用
されます。
・ ロールアクション:ロールアクションは、タスクの担当者の決定後に評価されます。したがって、このJava Actionは割り当てられたグ
ループと連動したタスクの担当者リストを動的に出力するために使用されます。
・ プロセス実行時の特定のエラー状況に対処するのに使用します。エラーアクションは、プロセス定義全体、各ノード、そして、他の
Java Actionで、定義することができます。すなわち、他のJava Actionの実行中に起きたエラーに対処する場合です。
・ Interstage BPMの外部システムにアクセスする他のJava Actionで定義することができます。たとえば、データベースです。データ
ベース内で新しく追加した列を削除する場合など、トランザクションの除去や、ロールバックのトランザクションで関連するすべての
システムの一貫した状況を確保するのに役立ちます。
詳細については、「6.3.1 Java Actionsのタイプ」を参照してください。
3.2.5 ロールユーザグループ
ユーザグループと担当者の割当ては、ワークローシステムの基本的な機能です。ユーザグループは、一組織に対して与えられる名前
で、一般的にはユーザのグループです。システムの設定により、Interstage BPMのローカルグループストア内、Directory Service内、も
しくは、両方のシステムで、ユーザグループは定義されています。ディレクトリサービスの機能を利用すると、ユーザグループはコン
ピュータ、ソフトウェアプログラム、パラメータ化された関数呼び出し、他の組織に対してもマッピングすることができます。
通常、ユーザグループはビジネスや組織のニーズに合わせてグループ化したユーザのグループに与えられる名前です。一般的には、
組織内の一人以上で行われる作業の担当グループにロールを割り当てます。そのほか、権限、職責、スキルまたは専門分野などに
よってユーザをグループ化することができます。ワークフローエンジンは、ロールを文字列の変数として識別しますが、ロールに割り当
てられたグループのメンバーが何かということは識別しません。
ユーザが関与するアクティビティノードの場合はユーザグループを割り当てることが可能です。現在のInterstage BPMでは、Activityノードと
Voting Activityノードだけがこのプロパティをサポートしています。
3.2.6 フォーム
多くのビジネスプロセスには、業務の情報に基づいた決定とアクションが伴います。ユーザは、フォームを持つアプリケーションを作成
し、そのフォームから業務の情報にアクセスします。フォームはプロセスのデザイン時にプロセス定義に追加され、添付文書は実行中
のプロセスインスタンスに追加されます。
フォームはユーザ定義属性に保存されたデータや外部データソースからのデータを表示したり、レポートしたりするために使用します。
また、ユーザがプロセスインスタンスや外部データソースのデータの追加・変更などを行う場合にも使用します。フォームで変数データ
を使用する方法については、「3.2.9 ユーザ定義属性」を参照してください。
- 11 -
フォームはWebサーバ上に保存されるアプリケーションですが、Interstage BPMはプロセス定義にフォーム属性として、アプリケーショ
ンで使用するフォームのURLを登録することができます。フォーム属性は、Startノード、Activityノード、およびVoting Activityノードと
関連付けることができます。
プロセスインスタンスを開始するか、ワークアイテムを表示する時に、ユーザアプリケーション(Model API)を使ってフォーム属性の情報
を取得できます。
3.2.7 タイマー
ほとんどのビジネスプロセスは、納期によって存続が決定します。納期には、締切日や支払い利息、マイルストーン、遅延、プロジェク
ト管理、休暇予定、個人的な集まりなどがあります。
Interstage BPMでは、納期が満了時に特定のアクションをトリガするタイマーを作成できます。タイマーには、Activityノードが活性化さ
れた場合に実行が開始されるActivityノードレベルタイマー、またはタイマーを含むプロセス定義から新しいプロセスインスタンスが作
成されるたびに実行が開始されるプロセスレベルタイマーがあります。
タイマーは、UDAで与えられる 時間およびアクションのパラメータで制御されます。タイマーは、Java Actionから設定します。タイマー
の納期満了や発行時刻は、時刻を指定する絶対指定や(アクティビティやプロセスの開始のような)他イベントからの相対指定です。タ
イマーでは、定期的にトリガアクションを指定することも可能です。また、タイマーは、エスカレーション(追加のユーザリストにアクティビ
ティを割り当てる)やメールの送信を含む、さまざまなアクションを実行できます。
以下のタイマー種別が利用可能です。
・ 相対時刻タイマー:相対時刻タイマーは、期限切れ をアクティビティやプロセスの活性化された時間に基づいて計算します。相対
時刻タイマーは一度だけ活性化されます。
・ 絶対時刻タイマー:絶対時刻タイマーは、期限切れを絶対時刻で設定します。設定値は1970年1月1日、00:00:00以降で、ミリ秒単
位に指定します。
・ 定期タイマー:定期タイマーは、繰り返し動作する相対時刻タイマーです。初回のタイマー起動時刻は、アクティビティやプロセス
の活性化された時刻との比較で決定されます。次回以降のタイマー起動時刻は、最後にタイマーが起動した時刻との比較で決定
されます。
・ ビジネス定期タイマー:ビジネス定期タイマーは、繰り返し動作するビジネス相対時刻タイマーです。初回のタイマー起動時刻は、
アクティビティやプロセスの活性化された時刻との比較で決定されます。次回以降のタイマー起動時刻は、最後にタイマーが起動
した時刻との比較で決定されます。
・ ビジネス相対時刻タイマー:ビジネス相対時刻タイマーは、期限切れをアクティビティやプロセスの活性化された時間に基ついて計
算します。また、記述に[ビジネスカレンダー]を使用します。ビジネス相対時刻タイマーは一度だけ活性化されます。
ビジネス定期タイマーとビジネス相対時刻タイマーはビジネスカレンダーを使用します。Model APIを使用してタイマーを定義する詳細
については、「6.16 タイマーの使用」を参照してください。ビジネスカレンダーを構成する方法の詳細は、『Interstage BPMサーバ 管理
者ガイド』を参照してください。
3.2.8 プロセス定義の所有権
プロセス所有権の属性は、各個人およびグループに対してプロセス定義、および、プロセスインスタンス内の許可レベルの設定を可能
にします。プロセス所有権の目的は、編集権限を与えられたユーザを構造的に識別することです。
プロセス定義の所有者は、そのプロセス定義の作成者です。プロセス定義からプロセスインスタンスが作成される場合、デフォルトで
は、プロセス定義の所有者はプロセスインスタンスの所有者にもなります。ただし、プロセス定義とプロセスインスタンスの所有権は、2
つの異なる属性です。
プロセス定義をデザインしている間、プロセスの所有権はユーザグループの担当者に直接割り当てられるか、ロールアクションの使用
によりプログラムで割り当てられます。ロールアクションは、以下の表に示すように相互作用します。
ユーザグループ
ロールアクション
プロセスインスタンスの所有者
未設定
未設定
プロセス定義の所有者
設定
未設定
ユーザグループで設定されたユーザ
未設定
設定
ロールアクションで設定されるユーザ
設定
設定
・ ユーザグループとロールアクションで同じユーザを所有者に設定した場合、設
定したユーザがプロセスインスタンスの所有者となります。
- 12 -
ユーザグループ
ロールアクション
プロセスインスタンスの所有者
・ ユーザグループとロールアクションで異なるユーザを所有者に設定した場合、
または、明示的に設定しなかった場合、プロセス定義の所有者がプロセスイン
スタンスの所有者となります。
Interstage BPMサーバがディレクトリサービスにアクセスして、ユーザを認証し、ユーザに割り当てられたグループや、ユーザがプロセ
スインスタンス、アクティビティ、およびユーザ属性にアクセスしたり操作したりする範囲を識別します。グループを使用すると、人事異
動があった場合にすべてのプロセス定義を変更する必要がありません。Interstage BPMのローカルグループストア、もしくは、ディレクト
リサービスよりグループのメンバーを更新してください。
3.2.9 ユーザ定義属性
プロセス定義には、ユーザ定義属性として、UDAを割り当てることが可能です。UDAの定義は、プロセス定義から作成されたプロセス
インスタンスと関連付けられているデータアイテムを示します。したがって、プロセスインスタンス固有の値はこの定義に保存することが
できます。値は、プロセスインスタンスの実行開始時、または実行中に割り当てられます。変数データは、関連付けられているすべての
プロセスインスタンスに対してグローバルです。すべてのユーザが変数データにアクセスして変更することができます。
デザイナーは、プロセス定義のデザイン時に、プロセスインスタンスで使用するデータ型を決定し、データを変数に割り当てる方針を
作成します。
データはJava Actionを使用して変更することも可能です。Java Actionの使用に関しては、「6.1 Interstage BPMと外部アプリケーション
の統合」を参照してください。
3.2.10 ノードタイプ
Interstage BPMは、様々なノードタイプをサポートしています。以下の表に、サポートしているノードタイプと属性の概要を示します。す
べてのノードタイプに共通する属性は含まれていません。
ノードタイプ
担当者
ロールア
クション
開始アク
ション
終了アク
ション
中止時アク エラーア タイマー
ション、
クション
トリガ
フォーム
一時停止時
アクション、
再開時アク
ション
Startノード
-
-
-
-
-
-
-
-
対応
Exitノード
-
-
-
-
-
-
-
-
-
Activityノード
対応
対応
対応
対応
対応
-
対応
対応
対応
VotingActivityノー
ド
対応
対応
対応
対応
対応
-
対応
-
対応
Delayノード
-
-
対応
対応
対応
-
対応
-
-
Triggerノード
-
-
対応
対応
対応
-
対応
対応
-
ANDノード
-
-
-
対応
対応
-
-
-
-
ORノード
-
-
-
対応
対応
-
-
-
-
Conditionalノード
-
-
対応
-
対応
-
-
-
-
Subprocessノード
-
-
対応
対応
対応
-
-
-
-
RemoteSubprocess
ノード
-
-
対応
対応
対応
対応
-
-
-
Chained-Process
ノード
-
-
対応
対応
対応
-
-
-
-
Compound Activity
ノード
対応
対応
対応
対応
対応
-
-
-
対応
- 13 -
次に、それぞれのノードタイプの詳細について説明します。
Startノード
Startノードは、プロセスの開始を示すノードです。1つのプロセスは1つのStartノードしかもつことができません。
サポートしていない機能: このノードタイプは、ロールアクション、タイマー、トリガをサポートしていません。
留意事項:
・ Startノードが動作するためにはプロセス定義からプロセスが生成(Create)されている必要があります。
・ プロセスインスタンスの実行はStartノードから開始されます。プロセスインスタンスが開始されると、Startノードにイベントが送られま
す。
・ Startノードは直ちにすべての外向き矢印にイベントを送ります。
Exitノード
Exitノードは、プロセスの終了を示すノードです。
1つのプロセスは1つ以上のExitノードをもつことができます。プロセス定義には、別のプロセスの完了モードをモデル化した複数のExit
ノードが存在する場合があります。プロセス定義が多数ある場合は、複数のExitノードを単純化した図形で示すことができます。
一般的なプロセス定義では、Exitノードには1つ以上の内向き矢印があり、外向き矢印はありません。
サポートしていない機能: Exitノードは、全種類のロールアクション、タイマー、トリガをサポートしていません。
留意事項: プロセスインスタンスの実行はExitノードで停止します。プロセスインスタンスに複数のExitノードがある場合は、プロセスイン
スタンスの実行がExitノードの1つに到達すると、そのプロセスインスタンスは完了したと見なされます。
Activityノード
Activityノードは、人が業務を実行することで作業が完了する対話型ノードです。このノードが実行されると、プロセスインスタンス内で
イベントのスレッドが一時停止します。このスレッドは人が介入するまで再開されません。
Activityノードは、外部エージェント(ほかのデバイスなど)が実行するアクティビティを代行することもできます。
プロセスインスタンスには、任意の数のActivityノードを指定できます。1つのActivityノードには、1つ以上の内向き矢印と、1つ以上の
外向き矢印があります。
サポートしている機能: このノードは、開始アクション、終了アクション、ロールアクション、タイマー、およびnode-levelトリガをサポートし
ています。さらに、管理者がこのノードが含まれるプロセスインスタンスの破棄、一時停止、もしくは、再開する場合に有効となるJava Action
セットを定義することができます。
留意事項:
・ 割り当てられたグループと担当者の関係は下表のようになります。
グループ
担当者
JavaActionで指定されたユーザ
設定
未設定
ユーザグループまたはユーザグループに含まれる
個々のメンバー
設定
設定(グループに含まれるユーザを指定)
グループとロールアクションで設定されたメンバー
設定
設定(グループに含まれないユーザを指定)
プロセスの所有者
未設定
設定
ロールアクションで指定されたメンバー
・ このノードについて定義されたすべてのタイマーは活性化されます。
・ すべての担当者のワークアイテムが作成されます。
・ 1人の担当者(すべての担当者ではありません)がActivityノードに関連付けられたタスクを完了すると、その担当者はタスクが完了
したことを知らせることで(たとえば、ボタンをクリックするなど)プロセスインスタンスを再び始動させます。これはワークアイテムのコ
ミットと呼ばれます。
・ このノードのそれぞれの外向き矢印は、このノードからどのプロセスインスタンスに進むかを表しています。担当者は、ビジネスプロ
セスに応じて方向を表す矢印を選択することにより、プロセスインスタンスを特定の方向に進めることができます。
- 14 -
・ ワークアイテムがコミットされると、終了アクションが評価され、活性中のプロセスタイマーはすべてキャンセルされます。また、イベ
ントは選択された矢印に送られます。
Voting Activityノード
Voting Activityノードでは、投票ルールを使用して1位の矢印(アクティビティの外向き矢印)を決定します。すべてのVoting Activityノー
ドについて、投票ルールが指定されている必要があります。
プロセスインスタンスには、任意の数のVoting Activityノードを指定できます。1つのVoting Activityノードには、1つ以上の内向き矢印
と、1つ以上の外向き矢印があります。
サポートしている機能: このノードでは、開始アクション、終了アクション、ロールアクション、およびタイマーをサポートしています。さら
に、管理者がこのノードが含まれるプロセスインスタンスの破棄、一時停止、もしくは、再開する場合に有効となるJava Actionセットを定
義することができます。
留意事項:
・ 内向き矢印からイベントを受け取ると、Voting Activityノードは実行状態になります。実行状態の間、内向き矢印から受け取ったイ
ベントは無視されます。ノードに一覧表示されているユーザグループを評価できない場合、ノードとそのプロセスインスタンスはエ
ラー状態になります。
・ 実行状態になるとVoting Activityノードは開始アクションを評価します。
・ ユーザグループと担当者の関係は下表のようになります。
ユーザグ
ループ
担当者
JavaActionで指定されたユーザ
設定
未設定
ユーザグループに設定されたメンバー
設定
設定(ユーザグループに含まれるユーザを
指定)
ユーザグループとロールアクションで設定されたメン
バー
設定
設定(ユーザグループに含まれないユーザ
を指定)
プロセスの所有者
未設定
設定
ロールアクションで指定されたメンバー
・ このノードについて定義されたすべてのタイマーは活性化されます。
・ すべての担当者のワークアイテムが作成されます。
・ 1人の担当者(すべての担当者ではありません)がVoting Activityノードに関連付けられたタスクを完了すると、その担当者はタスク
が完了したことを知らせることで(たとえば、ボタンをクリックするなど)プロセスインスタンスを再び始動させます。これはワークアイテ
ムのコミットと呼ばれます。
・ このアクティビティのそれぞれの外向き矢印は、このノードからどのプロセスインスタンスに進むかを表しています。担当者は、ビジ
ネスプロセスに応じて方向を表す矢印を選択することにより、プロセスインスタンスを特定の方向に進めることができます。
・ ワークアイテムがコミットされると、終了アクションが評価され、活性中のプロセスタイマーはすべてキャンセルされます。また、イベ
ントは選択された矢印に送られます。
注意
Interstage BPM Studioで使用できるカスタムノードがあります。APIレベルでは、Complex ConditionalノードはConditionalノードに相当
します。同様に、EmailノードとWeb ServiceノードはORノードに相当します。
Delayノード
Delayノードは、プロセスインスタンスの実行(またはプロセスインスタンス内の特定の実行スレッド)が指定された期間一時停止する、
ワークフロープロセス内のステップを表しています。
プロセスインスタンスには、任意の数のDelayノードを指定できます。1つのDelayノードには、1つ以上の内向き矢印と、1つ以上の外向
き矢印があります。
- 15 -
サポートしている機能: 開始アクション、終了アクション、およびタイマーを必要に応じて使用することができます。複数のタイマーをこの
ノードに指定できますが、有効になるのは1つだけです。さらに、管理者がこのノードが含まれるプロセスインスタンスの破棄、一時停
止、もしくは、再開する場合に有効となるJava Actionセットを定義することができます。このノードでは、ロールアクションをサポートして
いません。
留意事項:
・ Delayノードが内向き矢印からイベントを受け取ると、すべての開始アクションを評価し、指定されたすべてのタイマーを活性化し
て、待機します。待機中に内向き矢印から受け取った追加のイベントは無視されます。
・ 活性中のタイマーが期限切れになると、ノードはほかのすべての活性中のタイマーをキャンセルし、すべての終了アクションを評
価して、すべての外向き矢印にイベントを送ります。
Triggerノード
Triggerノードは、外部イベントによって動作する一つのステップを表します。各Triggerノードには、データ(通常はXMLファイル)が外
部システムから届いた際実行する動作が定義されます。
一度データが届くと、トリガは定義に基づいてデータをUDA(ユーザ定義属性)にコピーします。
それから、矢印が選択されプロセスは次のノードに遷移します。
この種類のノードには人の操作は不要です。そのため、この種類のノードが活性化すると、ワークアイテムは1つも生成されません。ノー
ドで定義されたトリガによってのみ完了できます。
プロセス定義はいくつでもTriggerノードを所有できます。Triggerノードは1つ以上の内向き矢印を所有できますが、外向き矢印は1つ
のみです。
サポートしている機能:Triggerノードには1つ以上の定義済みのノードレベルのトリガ(選択トリガ)が必要です。必要に応じて開始アク
ション、終了アクション、およびタイマーが使用できます。さらに、管理者がこのノードが属するプロセスインスタンスを中止、一時停止、
または再開するときに、Java Action Setが活性化するように定義できます。この種類のノードはユーザ、ロール、またはエージェントに割
り当てられません。また、この種類のノードはロールアクションやフォームに対応していません。
留意事項:
・ Triggerノードを内向き矢印からイベントを受け取ると、すべての開始アクションも評価し、すべてのアクティブトリガを活性化し、待
機します。待機中は、内向き矢印からの追加イベントは無視されます。
・ 1つのアクティブトリガが実行されるとすぐに、ノードはすべての終了アクションを評価し、外向き矢印にイベントを送ります。
ANDノード
ANDノードは、プロセスインスタンスが複数の実行スレッドの完了を同期するための待ち合わせ処理を表しています。
プロセスインスタンスには、任意の数のANDノードを指定できます。1つのANDノードには、1つ以上の内向き矢印と、1つ以上の外向
き矢印があります。
サポートしている機能: 終了アクションを必要に応じて使用することができます。ANDノードは、開始アクション、ロールアクション、また
はタイマーをサポートしていません。
留意事項:
・ ANDノードは、少なくとも1つのイベントを各内向き矢印から受け取るまで待機します。それぞれの矢印からのイベントを待機してい
る間、同じ内向き矢印から送られる追加のイベントは無視されます。
・ それぞれの内向き矢印がイベントを受け取ると、内向き矢印で表されるすべての実行スレッドは同期されます。すべての終了アク
ションは評価され、イベントがすべての外向き矢印に送られます。
ORノード
ORノードは、ワークフローを複数の並行する分枝に分割する処理を表しています。プロセスインスタンスには、任意の数のORノードを
指定できます。
1つのORノードには、1つ以上の内向き矢印と、1つ以上の外向き矢印があります。
サポートしている機能: 終了アクションを必要に応じて使用することができます。ORノードタイプは、開始アクション、ロールアクション、
またはタイマーをサポートしていません。
- 16 -
留意事項: このノードタイプでは、1つの内向き矢印からイベントを受け取るたびに終了アクションを評価し、すべての外向き矢印にイ
ベントを送ります。
Conditionalノード
Conditionalノードは、特定のUDAの値に応じて、プロセスの遷移先ノードを、複数の選択可能な方向から1つの進む方向を決定しま
す。このノードのすべての外向き矢印は、プロセスインスタンスが進むことのできるさまざまな方向を表しています。
プロセスインスタンスには、任意の数のConditionalノードを指定できます。1つのConditionalノードには、1つ以上の内向き矢印と、1つ
以上の外向き矢印があります。
サポートしている機能: 開始アクションを必要に応じて使用することができます。さらに、管理者がこのノードが含まれるプロセスインスタ
ンスの破棄、一時停止、もしくは、再開する場合に有効となるJava Actionセットを定義することができます。このノードでは、ロールアク
ション、またはタイマーをサポートしていません。
留意事項:
・ どの方向に進むかは、指定されたUDAの値によって異なります。Conditionalノードでは、UDAの値と、それぞれの外向き矢印の
条件に関連付けられている定数の値を比較します。
・ Conditionalノードが内向き矢印からイベントを受け取ると、まず開始アクションを評価し、次に指定された順序で外向き矢印の条件
を評価します。
・ プロセスインスタンスは、指定されたUDAの値が条件を満たす最初の1つの外向き矢印にそって進みます。UDAの値がどの条件
も満たさない場合、プロセスインスタンスはデフォルトの外向き矢印にそって進みます。
Subprocessノード
Subprocessノードは、タスクがデータを外部プロセスへ渡し終え、そこでワークフロープロセスを呼び出して、最終的に結果を受け取る
ワークフロープロセス内のステップを表しています。
Subprocessノードは、既存のプロセス定義の再利用を支援します。1つのSubprocessノードは、デザイン済のプロセス定義のすべての
ノード、矢印、およびそのほかの特性にアクセスして、そのプロセス定義全体を表すことができます。
Subprocessノードを使用すると、ユーザは複雑なプロセスを、詳細を非表示にして重要な項目だけを表示したサブプロセスの単純な階
層ネットワークに整理することができます。プロセスとサブプロセスは独立しているため、同時にデザインすることができます。
Subprocessノードは、ほかの人に作業を委任する場合に使用することもできます。
プロセスインスタンスには、任意の数のSubprocessノードを指定できます。1つのSubprocessノードには、1つ以上の内向き矢印と、1つ
以上の外向き矢印があります。
サポートしている機能:
・ 開始アクションと終了アクションを必要に応じて使用することができます。さらに、管理者がこのノードが含まれるプロセスインスタン
スの破棄、一時停止、もしくは、再開する場合に有効となるJava Actionセットを定義することができます。このノードでは、ロールア
クション、またはタイマーをサポートしていません。
・ このノードタイプに固有の属性には、サブプロセスインスタンスの作成、および親プロセスインスタンスとサブプロセスインスタンスの
間で移動するデータを定義するデータマッピング参照の作成に使用するプロセス定義のIDが含まれます。
・ 入力データマッピングでは、サブプロセスの実行前に、サブプロセスのUDAを親プロセスのUDAの値で初期化します。
・ 出力データマッピングでは、サブプロセスの完了後に、サブプロセスのUDAの値を親プロセスのUDAにコピーします。
・ サブプロセスとの間でコピーするデータがない場合、データマッピングを指定する必要はありません。
留意事項:
・ 内向き矢印からイベントを受け取ると、Subprocessノードは開始アクションを評価し、次に指定されたIDのプロセス定義を使用して
プロセスインスタンスを作成します。入力データマッピングが指定されている場合は、サブプロセスのUDAを初期化します。
・ 初期化が完了し、サブプロセスが開始されると、Subprocessノードはプロセスの完了まで待機します。待機中に内向き矢印からノー
ドが受け取ったイベントは、すべて無視されます。
・ サブプロセスが完了すると、出力データマッピングが指定されている場合は、サブプロセスから親プロセスにデータがコピーされ、
終了アクションが評価されます。次に、それぞれの外向き矢印にイベントが送られます。これで、それぞれの外向き矢印が実行さ
れます。
- 17 -
Remote Subprocessノード
Remote Subprocessノードは、リモートコンピュータのワークフローサーバで実行中のワークフロープロセスに実行を渡してタスクが完了
する、ワークフロープロセス内のステップを表しています。リモートコンピュータのワークフローサーバは、たとえば、ほかのInterstage BPM
サーバなどです。Subprocessノードと同様に、Remote Subprocessノードは、既存のプロセス定義を新しいプロセス定義内で再利用した
り、複雑なビジネスプロセスを単純化したり、作業をほかの人に委任したりするために使用できます。
プロセスには、任意の数のRemote Subprocessノードを指定できます。1つのRemote Subprocessノードには、1つ以上の内向き矢印と、1
つ以上の外向き矢印があります。ただし、外向き矢印の名前は、リモートサブプロセスのExitノードの名前と一致している必要がありま
す。
サポートしている機能:
・ 開始アクションと終了アクションを必要に応じて使用することができます。さらに、管理者がこのノードが含まれるプロセスインスタン
スの破棄、一時停止、もしくは、再開する場合に有効となるJava Actionセットを定義することができます。Remote Subprocessの起動
に失敗した場合に、エラーJava Actionの割り当てもサポートします。このノードでは、ロールアクション、またはタイマーをサポートし
ていません。
・ このノードタイプに固有の属性には、リモートサブプロセスインスタンスの作成、および親プロセスインスタンスとリモートサブプロセ
スインスタンスの間で移動するデータを定義するデータマッピング参照の作成に使用するプロセス定義のURIが含まれます。
・ 入力データマッピングでは、リモートサブプロセスの実行前に、リモートサブプロセスのUDAを親プロセスのUDAの値で初期化し
ます。
・ 出力データマッピングでは、リモートサブプロセスの完了後に、リモートサブプロセスのUDAの値を親プロセスのUDAにコピーしま
す。
・ リモートサブプロセスとの間でコピーするデータがない場合、データマッピングを指定する必要はありません。
留意事項:
・ 内向き矢印からイベントを受け取ると、Remote Subprocessノードは開始アクションを評価し、次に指定されたURIのプロセス定義を
使用してプロセスインスタンスを作成します。入力データマッピングが指定されている場合は、リモートサブプロセスのUDAを初期
化します。
・ 初期化が完了すると、リモートサブプロセスが開始され、Remote Subprocessノードはプロセスの完了まで待機します。待機中に内
向き矢印からノードが受け取ったイベントは、すべて無視されます。
・ リモートサブプロセスが完了すると、出力データマッピングが指定されている場合は、リモートサブプロセスから親プロセスにデータ
がコピーされ、終了アクションが評価されます。次に、それぞれの外向き矢印にイベントが送られます。
Chained-Processノード
Chained-Processノードは、親プロセスインスタンスから独立した新しいワークフロープロセスがタスクを完了するために作成される、ワー
クフロープロセス内のステップを表しています。このノードでは、その独立したワークフロープロセスを、親ワークフロープロセスの実行
の一部として実行します。
プロセスインスタンスには、任意の数のChained-Processノードを指定できます。1つのChained-Processノードには、1つ以上の内向き矢
印と、1つ以上の外向き矢印があります。
サポートしている機能:
・ 開始アクションと終了アクションを必要に応じて使用することができます。さらに、管理者がこのノードが含まれるプロセスインスタン
スの破棄、一時停止、もしくは、再開する場合に有効となるJava Actionセットを定義することができます。このノードでは、ロールア
クション、またはタイマーをサポートしていません。
・ このノードに固有の属性には、新しいプロセスのインスタンスの作成、および新しいプロセスインスタンスにコピーするデータを定義
するデータマッピングの作成に使用するプロセス定義のIDが含まれます。
・ 入力データマッピングでは、新しいプロセスインスタンスのUDAを親プロセスインスタンスのUDAの値で初期化します。Chained-Process
ノードでは、実行のフローが親プロセスインスタンスに戻ることはないので、入力データマッピングだけを使用します。新しいプロセ
スインスタンスにコピーするデータがない場合、データマッピングを指定する必要はありません。
留意事項: 内向き矢印からイベントを受け取ると、Chained-Processノードは開始アクションを評価し、次に指定されたIDのプロセス定義
を使用してプロセスインスタンスを作成します。入力データマッピングが指定されている場合は、チェインプロセスのUDAを初期化しま
す。チェインプロセスは親プロセスインスタンスから独立しています。
- 18 -
Compound Activityノード
Compound Activityノードはプロセスとフェイズの終わりを意味するマイルストーンを含みます。
Compound Activityの中にはノードと矢印を、入れ子にすることができます。 したがって、各Compound Activityはフェイズを表します。
サポートしている機能:
Compound Activityノード:
・ グループ
・ ワークアイテムモード
・ 開始アクション、終了アクション、中止時アクション、一時停止時アクション、再開時アクション
・ タイマー
・ 期限
・ フォーム
・ 優先順位
Compound Activityノードからワークアイテムを作成:
・ 選択
・ 再割当て
・ 優先順位
留意事項:
あるプロセスがCompound Activityノードに達すると、子のStartノードは活性中、Compound Activityノードはサブプロセスで待機中とな
ります。子ノードが完了し、子のExitノードに達すると、Compound Activityノードは閉じられ、子のExitノードと同じ名前のCompound
Activityノードから出ている矢印は活性となります。
Compound Activityノードに期限タイマーを付加することによって、マイルストーンの日付を定義できます。このため、フェイズは強制的
に完了される必要があります。また、担当者はCompound Activityノードのワークアイテムを選択し、以降のプロセスを続行させることが
でき、活性中の子ノードを強制的に中止することができます。
Compound Activityノードの作成と使用方法については、「6.18 Compound Activityノードの使い方」を参照してください。
3.2.11 プロセス定義の変更
プロセス定義の操作はプロセス定義をどのように変更することができるかに関連します。プロセス定義を変更するには、以下の必須条
件を満たす必要があります。
プロセス定義はドラフト状態で、編集モードである必要があります。
・ プロセス定義のインスタンスがあってはいけません。
・ 操作を行うのはプロセス定義の所有者または管理者でなければなりません。
・ Interstage BPMサーバでプロセス定義をロックする必要があります。
プロセス定義の変更点は、すべてコミットするか、すべて破棄するかのいずれかとなります。編集をキャンセルまたはロールバックする
場合は、何も変更されません。
3.3 プロセスインスタンス
プロセス定義は、ワークフローエレメントを使用してビジネスプロセスを表現した、一般的なモデルです。プロセスインスタンスは、この
プロセス定義に基づく実行状態の1つを表しています。実行中のプロセスインスタンスは、ビジネスプロセス内のイベントの流れを、プロ
セス定義に基づき開始から完了まで実行します。
プロセスインスタンスが作成されると、Interstage BPMサーバ(ワークフローエンジンとも呼ばれます)はプロセスインスタンスをプロセス定
義のデザインに従って実行します。Interstage BPMサーバによるプロセスインスタンスの実行を確立と呼びます。
- 19 -
プロセスインスタンスは、イベントモデルメカニズムを使用してInterstage BPMサーバで生成されます。イベントとは、Interstage BPMサー
バが生成したプロセスインスタンス内のワークフローエレメントに送られるメッセージのようなものです。このイベントはワークフローエレ
メントに作用します。ノードと矢印はこれらのイベントに反応して、そのタイプや定義に応じてタスクを実行します。
注意
現在のモデルでは、矢印はワークフローの進行役としてだけ使用されます。矢印が始点のノードからイベントを受け取ると、終点のノー
ドにイベントを送ります。説明を簡略化するために、以下では矢印イベントの参照を省略してあります。
プロセスインスタンスには、一般的に1つのStartノードと1つ以上のExitノードがあります。プロセスインスタンスの実行はStartノードがイ
ベントを受け取ったときに開始されます。ノードは、そのタイプや定義に応じて、イベントに対して異なった反応をします。
プロセスインスタンスには、StartノードからExitノードまでのパスの数に応じて、コントロールフローの1つ以上の分岐があります。ただし、
プロセスインスタンスは1つのExitノードがイベントを受け取ったときに完了します。その場合、すべての活性中のスレッドがキャンセル
されます。
プロセスインスタンス属性
プロセスインスタンスの構造は、そのインスタンスの基となるプロセス定義の構造とまったく同じです。プロセスインスタンス内のオブジェ
クトと属性は、プロセスインスタンスの生成基となるプロセス定義より反映されます。さらに、プロセスインスタンスには、プロセス定義か
ら直接マッピングされない「プロセス関連データ」と呼ばれる属性があります。
プロセスインスタンスは、その発生元のプロセス定義と同じ属性をもつことができますが、特定の例外があります。たとえば、プロセス定義の
IDと、そのプロセス定義から作られたプロセスインスタンスのIDには何の関係もありません。また、プロセスインスタンスは、ベースになっ
ているプロセス定義と同じ名前、タイトル、および説明をもつことも、独自の識別子をもつこともできます。
さらに、プロセスインスタンスにはプロセス定義と共有しない(またはプロセス定義から反映されない)多くの追加属性があります。これに
は、添付文書やUDAのほか、実行前には意味のない属性(プロセスの優先順位など)があります。
プロセスインスタンスの属性は、永続的なデータエレメントか、文書のような外部情報ソースへのリンクです。プロセスインスタンスの属
性には以下のものが含まれます(ただし、以下のものに限定はされません)。
・ プロセスインスタンスの状態
・ プロセスインスタンスの識別子
・ プロセスID
- プロセスインスタンス名
- プロセスインスタンスの説明
- プロセスインスタンスのタイトル
・ フローコントロール
- ノードインスタンス
- 矢印インスタンス
- Java Actionセット
・ プロセスインスタンスの所有権
- ロール(プロセス所有者)
- プロセス起案者
・ 変数データ
- データアイテム定義
- 作成時刻
- 優先度
- 添付文書参照一式
- 20 -
・ Java Actionセットを含むタイマー
3.3.1 プロセスインスタンスの状態
プロセスインスタンスは、Interstage BPMサーバに保存されている以下の状態のいずれかになっています。初期、実行中、一時停止、
または完了。プロセスインスタンスが作成されると、開始されるまでは初期状態となっています。プロセスインスタンスがExitノードに到
達すると、完了状態になります。
図3.2 プロセスインスタンスの状態
プロセスインスタンスを作成して開始を行わないことも可能ですが、実際の処理では、ほとんどのプロセスインスタンスは作成と開始が
同時に行われます。ただし、プロセスインスタンスの作成と開始は、2つの別々のアクションです。
プロセスインスタンスを一時停止すると、実行中の状態から一時的にプロセスインスタンスを削除します。この一時的な非活性状態を
一時停止状態と呼びます。プロセスインスタンスにワークアイテム、または実行中のサブプロセスがある場合は、それらも一時停止状態
になります。また、一時停止中のプロセスインスタンスは変更することができません。
ただし、一時停止中のプロセスインスタンスは、完了状態の中には存在しません。一時停止中のプロセスインスタンスを作成したプロセ
ス定義を変更することや、一時停止中のプロセスインスタンスを再割当てすることはできません。一時停止中のプロセスインスタンスを
再開すると、プロセスインスタンスは、そのプロセスインスタンスが保持していたワークアイテムやサブプロセスと共に活性化されます(実
行中の状態に戻ります)。
プロセスインスタンスの一時停止や再開は、Model APIを使用して行うことができます。APIの一時停止、または再開のメソッドを使用す
るには、管理者である必要があります。suspend()メソッドおよびresume()メソッドの使用方法については、「7.5.4 プロセスインスタンスの
一時停止」を参照してください。
永続性と状態
Interstage BPMサーバはプロセスインスタンスの状態の永続性を保障しない場合があります。たとえば、プロセスインスタンスがロック状
態の場合にInterstage BPMサーバが停止した場合、ロック状態は失われてしまいます。
Interstage BPMはワークフロープロセストランザクションのACID特性(原子性、一貫性、分離性、持続性)をサポートしていますが、Model API
を使用したアプリケーション側の処理は含まれません。アプリケーションからワークフロー処理を分離し、アクティビティと同期を取ること
を推奨します。同期を取るには、ワークフロー処理が何らかの異常でロールバックした場合、アプリケーション側の処理も同じポイントで
ロールバックする必要があります。
3.3.2 ノードインスタンスと矢印インスタンス
ノードインスタンスと矢印インスタンスは、プロセス定義ノードおよび矢印と一対一で対応しています。ノードインスタンスは基本的に特
定のノードの状態を保持するものです。ノードインスタンスと矢印インスタンスは、作成済、実行中、完了、およびエラーのいずれかの
状態となります。
ノードタイプについての詳細は、「3.2.10 ノードタイプ」を参照してください。
- 21 -
3.3.3 プロセスインスタンスの所有権
プロセスインスタンスは、そのプロセスインスタンスを開始した人(プロセス起案者)が所有しています。プロセス所有者がプロセスインス
タンスの作成に関わる必要はありませんが、プロセス所有者が自分に属するプロセスインスタンスを誰が作成したかを知っておくと便利
です。
3.3.4 添付文書
添付文書とは、ほかのソフトウェアで作成されたり、アクセスされたりした文書の参照です。参照先は、画像、スプレッドシート、ワードプ
ロセッサファイルのほか、ビジネスプロセスを完了するためにアクセスまたは修正する必要があるファイルなどです。
添付文書はその文書のパスとファイル名の参照だけで構成されています。
添付文書は、ワークアイテムよりアクセスすることができ、追加、削除することができます。ただし、添付文書は、ワークフローで枝分か
れしたほかのActivityノードを含む、プロセスインスタンス全体に属します。
デフォルトでは、ワークアイテムでユーザがほかのファイルタイプを開くために使用するプログラムを指定することができます。
3.4 ワークアイテム
Activityノードは、割り当てられたタスクの評価を終えると、割り当てられたそれぞれのユーザまたはグループに対して、ワークアイテム
を生成します。ワークアイテムは、プロセスインスタンス上のユーザとの接点です。つまり、ワークアイテムは、ユーザがプロセスインスタ
ンスのすべての属性にアクセスすることができるメカニズムです。
ワークアイテムの属性
・ 識別子
- プロセスインスタンスID
- プロセスインスタンス名
- プロセスインスタンスの説明
- プロセスインスタンスのタイトル
- ワークアイテム名
- ワークアイテムのタイトル
- ワークアイテムの説明
- 矢印一式
・ 担当者
・ 変数データ
- 添付文書参照一式
- フォーム情報
- データアイテム
3.4.1 ワークアイテムモード
Activityノードが活性化されると、関連する担当者とロールアクションによってワークアイテムが生成されます。
生成されるワークアイテム数は、Activityノードが個人またはグループのどちらで生成されたかによって決まります。
グループワークアイテムモード
このモードでは、Activityノードに割り当てられたユーザグループ全体に対して1つのワークアイテムが生成されます。グループワーク
アイテムは、グループのメンバーが頻繁に変わる場合やグループの最新のメンバーが、グループの変更前に作成されたワークアイテ
ムにもアクセスできるようにしたい場合に、(パフォーマンス面で)有益です。
- 22 -
注意
ワークアイテムがVoting Activityノードに関連づけられている場合やロールアクションが使用されている場合は、このモードは適用され
ません。
Voting Activityノードまたはロールアクションを使用する場合は、グループのワークアイテムは生成されません。代わりに、グループ内
のそれぞれのユーザのワークアイテムが生成されます。
個別ワークアイテムモード
このモードでは、Activityノードに割り当てられたグループ内のユーザごとに1つのワークアイテムが生成されます。それぞれのユーザ
は、自分のワークアイテムについて作業します。
タスクを変更したユーザやほかの人に割り当てる事のできるワークアイテムを調べたい場合に、個々のワークアイテムが必要となりま
す。
ワークアイテムモードの変更
Activityノードで生成されるワークアイテムのタイプは、Activity_node.markForExpandGroupsパラメータによって制御されます。trueは
個々のワークアイテムが作成されたことを、falseはグループレベルのワークアイテムが作成されたことを示します。
デフォルトでは、個別ワークアイテムが生成されます。さらに、Interstage BPMサーバには、動作が設定されていないプロセス定義を生
成させるSupportGroupWorkItemパラメータがあります。これは、プロセス定義が製品の古いバージョンによって作成された場合にだ
け、使用することができます。
プロセス定義がサーバにインストールされた際、ActivityノードでmarkForExpandGroupsパラメータを指定していない場合は、サーバは
これらのパラメータに動作のための逆のフラグを設定します。とくに、古いプロセス定義がシステムにインポートされた場合、
SupportGroupWorkItemパラメータがtrueであれば、逆にmarkForExpandGroupsパラメータにはfalseが設定されます。
例については、「5.1.3 プロセス定義の新規デザイン」を参照してください。
3.4.2 ワークアイテムの状態
Activityノードが活性化されると、Interstage BPMで1つ以上のワークアイテムが作成され、定義されたロールのユーザグループまたは
ロールの1人以上のメンバーに割り当てられます。デフォルトでは、個別ワークアイテムがユーザグループの各メンバーに割り当てられ
ます。ただし、各Activityノードで割り当てられたグループ全体に対して1つのグループワークアイテムを作成するように変更することが
できます。デフォルトでは、ユーザはタスクを受理したり、予約したりすることで、複数のユーザ間で互いの作業が重複しないようにする
ことができます。
ワークアイテムの状態は、活性、読取り、受理、拒否、非活性(個別ワークアイテムのみ)、一時停止、または完了です。
・ 活性: Activityノードが活性化されると、担当者の割り当てがロールアクションによって変更されないかぎり、Interstage BPMはActivity
ノードで割り当てられたユーザグループに対して1つの活性ワークアイテムを作成するか、またはロールの各メンバーに対して複数
の活性ワークアイテムを作成します。活性ワークアイテムは、すべての担当者または割り当てられたロールのメンバーが閲覧、受
理、一時停止、再割当て、または拒否できます。
・ 読取り: 担当者や割り当てられたロールのメンバーがワークアイテムを閲覧すると、そのワークアイテムは「読取り」状態となります。
すべての担当者またはグループメンバーが同一のワークアイテムを閲覧できます。「活性」状態のワークアイテムと同様、この状態
のワークアイテムを後で、受理、一時停止、再割当て、または拒否できます。
・ 受理:担当者または割り当てられたユーザグループのメンバーがワークアイテムを受理すると、そのワークアイテムは「受理」状態に
なります。このアクティビティに関連付けられた他の個別ワークアイテムは、「非活性」状態となります。これにより、業務の重複を防
ぐことができます。
ワークアイテムを受理したユーザは、後で拒否することもできます。この場合、そのワークアイテムは再び活性化されます。さらに、
標準再割当てモードでは、ワークアイテムを受理していた人が、それを他の人に割り当てることができます。
可能なモードについての詳細は、「3.8.2 再割当てモード」を参照してください。
- 23 -
・ 拒否: 「拒否」状態のワークアイテムとは、ユーザが拒否したワークアイテムです。拒否されたワークアイテムは、ユーザの活性ワー
クアイテムのリストには表示されず、非活性のワークアイテムのリストに表示されます。ユーザは拒否したあとでもそのワークアイテム
を閲覧または受理することができます。
すべての担当者またはロールの全メンバーが個別ワークアイテムを拒否した場合、活性ワークアイテムが各プロセスインスタンス所
有者に1つずつ作成されます。ただし、すべての所有者がワークアイテムを拒否することはできません。すべてのプロセスインスタ
ンス所有者が個別ワークアイテムを拒否した場合、そのワークアイテムは再び所有者全員に対して活性化されます。
全員がグループワークアイテムを拒否した場合、どのプロセスインスタンス所有者にもワークアイテムは作成されません。グループ
メンバーは、受理後、そのグループワークアイテムについて作業を行うことができます。そのグループに追加された新メンバーも直
接そのワークアイテムについて作業を行うことができます。
ユーザは以前拒否したワークアイテムを、他の人が受理していないかぎり、受理することができます。
・ 非活性: 他の人が受理したワークアイテムは、非活性になります。
非活性のワークアイテムは拒否または受理できませんが、後で活性化された場合は、再び受理または拒否できるようになります。
・ 完了: ユーザがワークアイテム上で適切な選択を行うと、ワークアイテムは完了状態になり、同じアクティビティに該当する他のワー
クアイテムは、すべてシステムから削除されます。つまり、ワークアイテムのリストから消えます。
3.4.3 矢印
ユーザは、ワークアイテムに指定されたタスクを完了すると、アクティビティを完了するために1つ以上のコミットオプションを選択し、プ
ロセスインスタンス内の次のノードを活性化することができます。
3.4.4 将来のワークアイテム
将来のワークアイテムは、ユーザが将来割り当てられるかも知れないワークアイテムです。将来のワークアイテムは、あとで割り当てら
れるかもしれないワークアイテムを意識することで、ユーザがあらかじめ自分の作業を計画するのを支援します。
将来のワークアイテムはプロセスの実行中に変化するので、発生した作業は正確ではないかも知れません。
注意
将来のワークアイテムは、ステータスがWorkItem.STATE_FUTUREである、通常のワークアイテムとして作成されます。これらは、特定
のユーザのリストに表示されます。読取り専用リストとして表示されるため、ユーザは実際に可決したり否決したりといったアクションをこ
れらに対して行うことはできません。
以下は、将来のワークアイテムのプロパティです。
・ 将来のワークアイテムはNode.markForFutureWorkItemsにtrueをセットしたアクティビティノード上にだけ作成されます。デフォルト
値は、falseです。
注意
将来のワークアイテムは、Compoundノード内部のActivityに対しても生成することができます。
・ 将来のワークアイテムは、プロセスインスタンスの非活性(初期状態)のアクティビティノードインスタンスにだけ作成されます。
・ 将来のワークアイテムは、少なくとも1つのノードインスタンスが活性化されているときにだけ、プロセスインスタンス内に作成されま
す。
・ アクティビティノードインスタンスが活性化されると、現在のノードに対するワークアイテムが作成され、将来のワークアイテムは削除
されます。そして、ほかのアクティビティノードインスタンスに対する将来のワークアイテムが初期状態で作成されます。
・ 将来のワークアイテムは、担当者とロールアクションを使って作成されます。
- 24 -
注意
将来のワークアイテムの担当者を判定している間に、ロールアクションで行われたプロセスの更新処理が実行されます。将来のワー
クアイテムは、プロセスインスタンス内のほかのアクティビティノードインスタンスが活性化されるときに、常に作成されます。したがっ
て、これらのロールアクションは、複数回実行されます。また、ロールアクションは、通常のワークアイテムを作成する間にも実行さ
れます。これらのアクションが複数回実行されることによって、予期せぬ結果をもたらさないことを確実にしておく必要があります。
・ ロールアクションまたはロールスクリプトがアクティビティノードにセットされているとき、ロールアクションまたはロールスクリプトによっ
て、将来のワークアイテムは、指定されたロールや担当者の置換えが行われます。通常のワークアイテムは、置き換える値がない
場合、プロセスインスタンスの所有者にワークアイテムが割当てられますが、将来のワークアイテムが割当てられることはありませ
ん。
・ 将来のワークアイテムはプロセスが存在する間、作成されたり削除されたりします。つまり、アクティビティノードインスタンスAが活
性化状態で、ユーザによる矢印の選択を待っているとき、初期状態のほかのアクティビティノードインスタンスBで将来のワークアイ
テムフラグをtrueにセットした場合、BはAの矢印の選択が行われるまで将来のワークアイテムは作成されません。
・ エージェントが定義されているアクティビティノードに対して、将来のワークアイテムは作成できません。
・ Iteratorノードとして扱われているアクティビティノードに対して、将来のワークアイテムは作成できません。
・ Voting Activityノードに対して、将来のワークアイテムを設定することはできません。
・ グループレベルのワークアイテムを持つアクティビティノードに対して、将来のワークアイテムを設定することはできません。
・ 初期化状態のアクティビティノードに設定した将来のワークアイテムは、アクティビティノードがいったん活性化されると削除されま
す。
・ 将来のワークアイテムを作成している途中に失敗した場合、通常のワークアイテム作成の失敗と同じように処理されます。トランザ
クションはロールバックされ、ユーザに例外を返すか、フォアグラウンド/バックグラウンドの処理によって、エラー状態になります。ま
た、補償およびエラーアクションは、通常どおり実行されます。
3.5 フィルタ
Interstage BPMのフィルタは、SQLのSELECTステートメント同じように機能します。特定の抽出条件に従って、データベース内のテー
ブルの列にアクセスすることができます。言い換えると、プロセス定義、プロセスインスタンス、またはワークアイテムのテーブルからリス
トを作成し、そのリストを担当者、起案者、または所有者でフィルタしたり、優先順位でのフィルタ、状態でのフィルタ、または識別子で
のフィルタを行うことができます。
注意
詳細なフィルタとソートの機能は、Model APIを使用して行うことができます。これらの高度な機能の使用方法については、「6.4 フィル
ターとソートのAPI」を参照してください。
3.6 構造的プロセス編集の目的
プロセス編集は、柔軟にワークフローのルートを変更するために必要な機能です。
ワークフローユーザは、以下の場合に構造的プロセス編集を必要とします。
・ デザインエラー: プロセスインスタンスが一定期間実行された後、それが誤った前提または論理に基づいていることに気づくことが
あります。
・ メンテナンス: 長い間実行されているプロセスインスタンスは、プロセスインスタンスを最新状態に保ち、滞りなく実行するために、定
期的な微調整が必要となります。
・ プロセスの発見: 現実の世界では、多くのビジネスプロセスは、プロセスプランが完全に固まる前に開始しています。構造的プロセ
ス編集では、プロジェクトチームがそれぞれの経験に基づいて、プロジェクトチームが受け取ったフィードバックに基づいてプロセ
ス定義を変更したり、プロセスインスタンスを後で複製できるように記録したりすることができます。
・ 実験結果を取得する: 構造的プロセス編集では、途中で新しい手順を試すことができ、正確に記録されている複数の手法を使っ
た結果を後で分析することができます。
- 25 -
・ 新しい要求に適応する: 構造的プロセス編集では、新しい政府規制や市場情勢の変化などに応じて、プロセス定義を変更するこ
とができます。
・ やり直す: プロセスが計画に従って進んでいても結果が思わしくない場合、構造的プロセス編集では変更を行ってもう一度やり直
すことができます。
3.7 サブプロセス機能の目的
サブプロセスは、以下の理由から、重要な要素といえます。
・ サブプロセスは、プロジェクトやプロセスを扱いやすい作業単位に分解します。言い換えれば、複雑なプロセス定義は膨大な数の
ノードによって構成されていて、プロセス定義が読めない状態になっている可能性があります。このプロセスインスタンスを単純な
サブプロセスの階層に再構築すると、それぞれのレベルのプロセス定義を、プロセス定義全体に簡単に適合する個別のタスクとし
てデザインすることができます。
・ サブプロセスを使用することによって、別々のプロセスを扱う別々の部署が、これらのプロセスを簡単に、適切にリンクすることがで
きるようになります。たとえば、購買部、経理部、および新製品開発部がそれぞれの内部要求に応えるため、完全に個別のプロセ
ス定義が必要だったとします。Interstage BPMのサブプロセスでは、この3つの部署間の情報交換や連携作業の調整を緊密に行う
ために、各部署のプロセス定義を作成することができます。
・ サブプロセスを使用すると、個人、部署、または企業が、モジュラコンポーネントのライブラリ、プロセス定義、タスクを後になってか
らさまざまな方法で貼り合わせることができるようになります。
ユーザは2つの方法でサブプロセスを作成できます。正式な方法としてはデザイン時に作成しますが、実行時に作成することもできま
す。これら2つの実装方法では、API内の構造が若干違っています。
・ デザイン時にサブプロセスを実装する場合、たとえば、この目的のために特別に作成されたノードタイプであるSubprocessノードを
使用する必要があります。このノードは、ユーザがデザイン時に親プロセスのインスタンスと子プロセスのインスタンスとの間でやり
取りされるデータをマッピングするためのプロパティを設定するインタフェースを提供します。このSubprocessノードは、ほかのノード
が特定のプロセス定義のメンバーであるのと同様に、プロセス定義のメンバーとなります。
活性中のプロセスインスタンスのフローがSubprocessノードに到達すると、ノードはすぐにサブプロセスをインスタンス化し、実行を
開始します。サブプロセスが完了するまで待機している間、Subprocessノードは一時停止状態になります。
・ 実行時にサブプロセスを実装する場合、Activityノードクラスのメソッドを使用します。他のユーザにタスクを委任する必要がある人
に、タスクが割り当てられた場合、その人は実行時サブプロセスをActivityノードから呼び出すことができます。委任する人は、新し
いプロセス定義を作成するか、または既存のプロセス定義を使用して、デザイン時と同じ方法で元のプロセスインスタンスのデータ
をサブプロセスにマップすることができます。親プロセスのワークアイテムは、サブプロセスが呼び出されるとは一時停止状態となり
ます。サブプロセスが完了し、ワークフローがワークアイテムに戻されると、呼び出し元のノードは完了状態に変更されます。
サブプロセスの実装を実行時に行う場合と、デザイン時に行う場合の違いは、実行時のサブプロセス実装がその場かぎりであることで
す。元のプロセス定義は元の状態のままとなります。プロセス定義が次にプロセスの作成に使用されるときは、元のActivityノードはActivity
ノードのままです。
3.8 セキュリティモードと再割当てモード
セキュリティモードおよび再割当てモードは、ワークアイテムの状態とは少し違った問題に対応します。ただし、これらのモードや状態
はワークアイテムのアクセスを制御するため、すべて一緒に対応する必要があります。デフォルトでは、システムはOpen Securityモード
および標準再割当てモードでインストールされます。
3.8.1 セキュリティモード
セキュリティモードは、Interstage BPMサーバのSecuritySwitchパラメータを設定して変更できます。Interstage BPMサーバの設定の変
更方法の詳細については、『Interstage BPMサーバ 管理者ガイド』を参照してください。
Open SecurityモードとSecureモードの最も大きな違いは、Open SecurityモードではすべてのInterstage BPMユーザがワークアイテムを
表示できる(読取り専用)という点です。Secureモードでは、ワークアイテムの担当者とプロセス所有者だけがそのワークアイテムを表示
できます。両方のセキュリティレベルとも、プロセスの詳細を変更したり、ワークアイテムを選択したりする前に、ワークアイテムを承認す
る必要があります。
- 26 -
3.8.2 再割当てモード
再割当てモードは、Interstage BPM サーバのServerReassignModeパラメータを設定して変更できます。Interstage BPMサーバの設定
の変更方法の詳細については、『Interstage BPMサーバ 管理者ガイド』を参照してください。
再割当てでは、ユーザグループで最初に指定された人とは違う人にアクティビティを割り当てることができます。再割当てに対して設定
されているアクセス制御は、ワークアイテムの状態によって実装されたアクセス制御とは異なります。再割当てはアクティビティに対して
行われ、ワークアイテムに対しては行われません。
ワークアイテムを再割り当てすると、アクティビティに関連付けられた、活性、非活性のすべてのワークアイテムが削除されます。その
後、サーバは、再割り当てで指定されたメンバーに対して、新しい活性ワークアイテムを生成します。
アクティビティは個人に対して再割当てされる必要があり、グループに対して行うことはできません。割当ては、主に、一定期間内で再
利用されるプロセス定義に適しています。そのため、再割当てで指定された人が有効なユーザかどうかは検証されません。
Interstage BPMには、3つの再割当てモードがあります。標準モード、プロセス所有者限定モード、または再割当て禁止モードです。こ
れらは、ServerReassignModeパラメータをregular、owner、またはnoneに設定することで設定されます。
・ 標準モード(regular): このモードでは、現在アクティビティの担当者となっている人またはプロセス所有者が、アクティビティを新しい
ユーザ群に再割当てできます。
・ プロセス所有者限定モード(owner): このモードでは、プロセス所有者だけがアクティビティを別のユーザ群に再割当てできます。
ワークアイテムを別のユーザに再割当てするために、プロセス所有者がそのワークアイテムの担当者である必要はありません。
・ 再割当て禁止モード(none): このモードでは、再割当ては完全に不可となっています。アクティビティの再割当てができるユーザは
いません。
- 27 -
第4章 Model API
ここでは、Model APIアプリケーション開発のシステム環境について説明し、基本的なModel APIのアーキテクチャーを紹介します。
4.1 システム環境
Model APIを使用したアプリケーションの開発と配置は、Interstage BPM Flowがサポートするすべてのオペレーティングシステムで行
えます。サポート対象のオペレーティングシステムについては、『ソフトウェア説明書』を参照してください。
Model APIを使用してアプリケーションを開発するシステムは、以下の要件を満たしている必要があります。
・ Interstage Application ServerのJDK5.0(推奨)またはJ2SE Development Kit (JDK) 5.0 update10以上が正しくインストールされてい
ること。
・ iFlow_api.jarおよびjs.jarが使用可能であること。このJARファイルがModel APIを構成します。JARファイルのパスをCLASSPATH
環境変数に追加してください。標準のインストールでは、次の場所にファイルがインストールされます。
Windowsの場合
C:\Fujitsu\InterstageBPM\client\lib\iFlow.jar
SolarisまたはLinuxの場合
/opt/FJSVibpm/client/lib/iFlow.jar
注意
iFlow.jarファイルは、Interstage BPMが内部で使用するメソッドが含まれています。これらのメソッドは、アプリケーション開発ではサ
ポートされておらず、Javadocに記述されていません。このため、開発目的で、内部で使用されているメソッドを含まない、代わりのjar file
であるiFlow_api.jarが、提供されています。アプリケーションが内部メソッドを使用しないようにするため、iFlow_api.jarライブラリで
そのアプリケーションをコンパイルすることを推奨します。
iFlow_api.jarをのぞく、C:\Fujitsu\InterstageBPM\client\libディレクトリや、/opt/FJSVibpm/client/libディレクトリに含まれている他
すべてのライブラリは、Model APIの実装により使用されているため、CLASSPATHに追加する必要があります。
現在、ランタイムで必要とされるclient/libディレクトリには、以下2つのライブラリがあります。
- js.jar
- log4j-1.2.15.jar
・ 要求されるアプリケーションサーバ規定のjarファイルのパスをCLASSPATHに追加、定義してください。
4.1.1 Interstage Application Server(ローカル)の環境設定
必須条件:「4.1 システム環境」の説明に従い、システム環境を設定します。
Interstage Application ServerのModel APIを使用してアプリケーションを開発する場合、以下の設定を行います。
1. 以下のJARファイルをCLASSPATH 環境変数に追加します。
Windowsの場合
<Interstage Application Serverのインストールディレクトリ>\J2EE\var\deployment\ijserver\<Interstage BPM サーバのワークユ
ニット名>\distribute\fujitsu-ibpm-engine.ear\fujitsu-ibpm-engine-ejb.jar\fujitsu- ibpm-engine-ejb_jar_client.jar
UNIXまたはLinuxの場合
<Interstage Application Serverのインストールディレクトリ>/FJSVj2ee/var/deployment/ijserver/<Interstage BPM サーバのワークユ
ニット名>/distribute/fujitsu-ibpm-engine.ear/fujitsu-ibpm-engine- ejb.jar/fujitsu-ibpm-engine-ejb_jar_client.jar
2. 以下のJARファイルをCLASSPATH 環境変数に追加します。
Windowsの場合
- 28 -
C:\Interstage\J2EE\lib\isj2ee.jar
C:\Interstage\ODWin\etc\class\ODjava4.jar
C:\Interstage\jms\lib\fjmsprovider.jar
C:\Interstage\EJB\lib\fjcontainer94.jar
C:\Interstage\eswin\lib\esnotifyjava4.jar
Solarisの場合
/opt/FJSVj2ee/lib/isj2ee.jar
/opt/FSUNod/etc/class/ODjava4.jar
/opt/FJSVjms/lib/fjmsprovider.jar
/opt/FJSVes/lib/esnotifyjava4.jar
/opt/FJSVejb/lib/fjcontainer94.jar
Linuxの場合
/opt/FJSVj2ee/lib/isj2ee.jar
/opt/FJSVod/etc/class/ODjava4.jar
/opt/FJSVejb/lib/fjcontainer94.jar
/opt/FJSVes/lib/esnotifyjava4.jar
/opt/FJSVjms/lib/fjmsprovider.jar
3. 以下のディレクトリをPATH環境変数に追加します。
Windowsの場合
C:\Interstage\bin
UNIXまたはLinuxの場合
/opt/FJSVj2ee/bin
/opt/FJSVjms/bin
4. 以下のディレクトリをLD_LIBRARY_PATH環境変数に追加します。
Solarisの場合
/opt/FSUNod/lib
/opt/FJSVjms/lib
Linuxの場合
/opt/FJSVod/lib
/opt/FJSVjms/lib
5. <JDKのインストールディレクトリ>/jre/libディレクトリに移動し、orb.propertiesファイルを開いて、以下の値を追加します。
org.omg.CORBA.ORBClass=com.fujitsu.ObjectDirector.CORBA.ORB
org.omg.CORBA.ORBSingletonClass=com.fujitsu.ObjectDirector.CORBA.SingletonORB
javax.rmi.CORBA.StubClass=com.fujitsu.ObjectDirector.rmi.CORBA.StubDelegateImpl
- 29 -
javax.rmi.CORBA.UtilClass=com.fujitsu.ObjectDirector.rmi.CORBA.UtilDelegateImpl
javax.rmi.CORBA.PortableRemoteObjectClass= com.fujitsu.ObjectDirector.rmi.CORBA.PortableRemoteObjectDelegateImpl
4.1.2 Interstage Application Server (リモート) の環境設定
必須条件:「4.1 システム環境」の説明に従い、システム環境を設定します。リモートコンピュータ(Interstage Application Serverのホスト
コンピュータと異なるコンピュータ)でModel APIが使用できます。
リモートコンピュータでModel APIを使用するには、以下の手順に従います。
1. お使いのリモートコンピュータでInterstage Application Server Client Packageをインストールします。
詳細については『Interstage Application Server インストールガイド』を参照してください。
2. ホストコンピュータの以下のJARファイルをリモートコンピュータにコピーして、CLASSPATH 環境変数に追加します。
Windowsの場合
<Interstage Application Serverのインストールディレクトリ>\J2EE\var\deployment\ijserver\<Interstage BPM サーバのワークユ
ニット名>\distribute\fujitsu-ibpm-engine.ear\fujitsu-ibpm-engine-ejb.jar\fujitsu- ibpm-engine-ejb_jar_client.jar
UNIXまたはLinuxの場合
<Interstage Application Serverのインストールディレクトリ>/FJSVj2ee/var/deployment/ijserver/<Interstage BPM サーバのワークユ
ニット名>/distribute/fujitsu-ibpm-engine.ear/fujitsu-ibpm-engine- ejb.jar/fujitsu-ibpm-engine-ejb_jar_client.jar
3. 以下のJARファイルをCLASSPATH環境変数に追加します。
Windowsの場合
C:\Interstage\J2EE\lib\isj2ee.jar
C:\Interstage\ODWIN\etc\class\ODjava4.jar
C:\Interstage\jms\lib\fjmsprovider.jar
C:\Interstage\ODWIN\etc\class\esnotifyjava4.jar
C:\Interstage\EJBCL\lib\fjcontainer94.jar
Solarisの場合
/opt/FJSVj2ee/lib/isj2ee.jar
/opt/FSUNod/etc/class/ODjava4.jar
/opt/FJSVjms/lib/fjmsprovider.jar
/opt/FJSVes/lib/esnotifyjava4.jar
opt/FJSVejb/lib/fjcontainer94.jar
Linuxの場合
/opt/FJSVj2ee/lib/isj2ee.jar
/opt/FJSVod/etc/class/ODjava4.jar
/opt/FJSVejb/lib/fjcontainer94.jar
/opt/FJSVes/lib/esnotifyjava4.jar
/opt/FJSVjms/lib/fjmsprovider.jar
4. 以下のディレクトリをPATH環境変数に追加します。
Windowsの場合
- 30 -
C:\Interstage\bin
UNIXまたはLinuxの場合
/opt/FJSVj2ee/bin
/opt/FJSVjms/bin
5. 以下のディレクトリをLD_LIBRARY_PATH環境変数に追加します。
Solarisの場合
/opt/FSUNod/lib
/opt/FJSVjms/lib
Linuxの場合
/opt/FJSVod/lib
/opt/FJSVjms/lib
6. <JDKのインストールディレクトリ>/jre/libディレクトリに移動して、orb.propertiesファイルを開き、以下の値を追加します。
org.omg.CORBA.ORBClass=com.fujitsu.ObjectDirector.CORBA.ORB
org.omg.CORBA.ORBSingletonClass=com.fujitsu.ObjectDirector.CORBA.SingletonORB
javax.rmi.CORBA.StubClass=com.fujitsu.ObjectDirector.rmi.CORBA.StubDelegateImpl
javax.rmi.CORBA.UtilClass=com.fujitsu.ObjectDirector.rmi.CORBA.UtilDelegateImpl
javax.rmi.CORBA.PortableRemoteObjectClass= com.fujitsu.ObjectDirector.rmi.CORBA.PortableRemoteObjectDelegateImpl
7. 以下のコマンドを実行して、Interstage Application Serverで作動するCORBA servicesのためのサーバホストを設定します。
odsethost -a -h MyServer -p 8002
注意
複数のサーバホストを本コマンドで登録する場合、Model APIは、最初に登録されているサーバに接続しようとします。もし、他の
サーバに接続する場合は -a または -dオプションでサーバホストを指定して、odsethostコマンドを実行してください。
8. 以下のコマンドを実行して、JMS connection factoryの定義を登録します。
jmsmkfact -t -i IflowClient TopicConnectionFactory
注意
jmsinfofactコマンドを実行すると、connection factory定義のリストを表示できます。
9. 以下のコマンドを実行して、JMS destinationsの定義を登録します。
jmsmkdst -t -g IflowECG2 -c IflowECNotify NotificationTopic
jmsmkdst -t -g IflowECG2 -c IflowSQNotify SQNotificationTopic
注意
jmsinfofactコマンドを実行すると、JMS destination定義のリストを表示できます。
- 31 -
10. Interstage BPMのJMSインタフェースを使用する場合は、以下のコマンドを実行して、JMS destinationsの定義を登録します。
jmsmkdst -t -g IflowECG2 -c IflowECCommand CommandTopic
jmsmkdst -t -g IflowECG2 -c IflowECResponse ResponseTopic
JMSインタフェースの詳細は、「A.3 /client/samples/examples/bin」を参照してください。
4.1.3 WebSphere Application Server スタンドアロンアプリケーション配備(ローカ
ル)の環境設定
必須条件:「4.1 システム環境」の説明に従い、システム環境を設定します。
WebSphere Application ServerのModel APIを使用してスタンドアロンアプリケーションを開発する場合、以下のJARファイルを
CLASSPATH環境変数に追加します。
注意
以下のJARファイルがある<WAS インストールディレクトリ>\IBM\WebSphere\AppServerを<WAS AppServer ホームディレクトリ>と記
述します。
・ <WAS AppServer ホームディレクトリ>\plugins\com.ibm.ws.runtime_6.1.0.jar
・ <WAS AppServer ホームディレクトリ>\plugins\com.ibm.ws.sib.server_2.0.0.jar
・ <WAS AppServer ホームディレクトリ>\plugins\com.ibm.ws.sib.utils_2.0.0.jar
・ <WAS AppServer ホームディレクトリ>\runtimes\com.ibm.ws.webservices.thinclient_6.1.0.jar
・ <WAS AppServer ホームディレクトリ>\deploytool\itp\plugins\com.ibm.websphere.v61_6.1.200\ws_runtime.jar
・ オペレーションシステムにより:
- Windowsの場合
<IBPMServer_インストールディレクトリ>\server\deployment\InterstageBPMServer.ear\fujitsu-ibpm-engine-ejb.jar
- UNIXまたはLinuxの場合
<IBPMServer_インストールディレクトリ>/server/deployment/InterstageBPMServer.ear/fujitsu-ibpm-engine-ejb.jar
4.1.4 WebSphere Application Serverクライアント J2EE アプリケーション配備
(ローカル)の環境設定
必須条件:マシンにシステム要件に記載されているバージョンのWebSphere Application Serverをインストールして、正しく動作するよう
設定します。
Interstage BPM Serverおよび、Interstage BPM Enterprise EditionのインストールでインストールしたWebSphere Application Serverと同
一のマシンにユーザのアプリケーションを配備します。
WAS クライアント J2EEアプリケーションの配備:
1. ユーザのWebアプリケーションおよび、fujitsu-ibpm-engine-model-ejb.jarを含むJ2EEアプリケーション(EAR)を以下のように作成
します。
a. コンピュータに新しいフォルダ(例:My Application)を作成し、以下のファイルやフォルダをコピーします。
- ユーザのアプリケーションのWARファイル(例:myapp.war)
- IBPMサーバインストールディレクトリ(<IBPMServer_インストールディレクトリ>\client\lib\)にあるfujitsu-ibpm-enginemodel-ejb.jar
- ユーザのJ2EEアプリケーションのデプロイメント・ディスクリプタが含まれるMETA-INFフォルダ
- 32 -
b. ユーザのJ2EEアプリケーションのデプロイメント・ディスクリプタ(application.xml)のモジュールにfujitsu-ibpm-engine-modelejb.jarを記述します。
例:
<module id=" module id="EjbModule_1187608318108">
<ejb>fujitsu-ibpm-engine-model-ejb.jar</ejb>
</module>
注意
EjbModule_1187608318108をカスタマイズします。
サンプルのデプロイメント・ディスクリプタは、Interstage BPM CDイメージのconsole\ibpmconsole-ear\を参照してください。
c. My Applicationから以下のコマンドを実行します:
<java_home>¥jar.exe cvfm myapp.ear META-INF\MANIFEST.MF .
2. 単一クラスローダーオプションにより、WebSphere Application Serverで前ステップで作成した、J2EEアプリケーション(EAR)を配
備します。
a. WASコンソールでアプリケーション>エンタープライズ・アプリケーションを選択します。
エンタープライズ・アプリケーションのリストが表示されます。
b. ユーザのアプリケーションのリンクをクリックします。
アプリケーションの設定ページが表示されます。
c. 「クラス・ロードおよび更新の検出」リンクを選択します。
クラス・ローダーの詳細画面が表示されます。
d. WAR クラス・ローダー・ポリシーセクションの「アプリケーションの単一クラス・ローダー」を選択します。
[適用]をクリックして変更を保存します。
3. fujitsu-ibpm-engine-ejb.jar を <IBPM_ イ ン ス ト ー ル デ ィ レ ク ト リ > \ server \ deployment \ InterstageBPMServer.ear \ か ら
<J2EE_APP_HOME>\WEB-INF\libにコピーします。
4. iFlow.jarおよびjs.jarを<IBPM_インストールディレクトリ>\client\lib\から<J2EE_APP_HOME>\WEB-INF\libにコピーします。
5. J2EEアプリケーションを起動します。
注意
<WAS_APPSERVER_HOME> \ profiles \ AppSrv01 \ installedApps<cell
\<web_application_name>.war\.を<J2EE_APP_HOME>と記述します。
Name> \ <application_
name>.ear
4.1.5 WebSphere Application Server スタンドアロンアプリケーション配備(リモー
ト)の環境設定
必須条件:「4.1 システム環境」の説明に従い、システム環境を設定します。
リモートコンピュータ(WebSphere Application Serverのホストコンピュータと異なるコンピュータ)でModel APIが使用できます。
1. リモートコンピュータにWebSphere Application Clientをインストールします。
a. インストール時のセットアップ・タイプは、「カスタム-J2EEおよびシン・クライアント」を選択してください。
b. Web サービス・シン・クライアントフィーチャーを選択してください。
2. iFlow.jarおよび、fujitsu-ibpm-engine-ejb.jarをリモートコンピュータにコピーして、CLASSPATH環境変数に追加します。
3. 以下のWebSphere Application ClientのJARファイルをCLASSPATH環境変数に追加します。
- 33 -
注意
<WAS AppServer ホームディレクトリ> は、<WAS インストールディレクトリ>\IBM\WebSphere\AppServerを表し、以下のJARファ
イルがあります。
<WAS AppClient ホームディレクトリ>\plugins\com.ibm.ws.runtime_6.1.0.jar
<WAS AppClient ホームディレクトリ>\plugins\com.ibm.ws.emf_2.1.0.jar
<WAS AppClient ホームディレクトリ>\plugins\com.ibm.ws.wccm_6.1.0.jar
<WAS AppClient ホームディレクトリ>\plugins\com.ibm.ws.sib.client_2.0.0.ja
<WAS AppClient ホームディレクトリ>\plugins\com.ibm.ws.sib.utils_2.0.0.jar
<WAS AppClient ホームディレクトリ>\runtimes\com.ibm.ws.webservices.thinclient_6.1.0.jar
4. WebSphere Application ClientのJDKを使い、クライアントプログラムを実行します。
4.1.6 WebSphere Application Serverクライアント J2EE アプリケーション配備(リ
モート)の環境設定
必須条件:例として、2台のマシン(マシンA、マシンB)があり、マシンAにInterstage BPMとWebSphere Deployment managerを、マシンB
にWebSphere Application Serverをインストールします。両方のマシンのWebSphere Application Serverがシステム要件に記載されてい
るバージョンでであることを確認します。
WAS クライアント J2EEアプリケーションの配備:
1. マシンBで、ユーザのWebアプリケーションおよび、fujitsu-ibpm-engine-model-ejb.jarを含むJ2EEアプリケーション(EAR)を以下
のように作成します。
a. コンピュータに新しいフォルダ(例:My Application)を作成し、以下のファイルやフォルダをコピーします。
- ユーザのアプリケーションのWARファイル(例:myapp.war)
- IBPMサーバインストールディレクトリ(<IBPMServer_インストールディレクトリ>\client\lib\)にあるfujitsu-ibpm-enginemodel-ejb.jar
- ユーザのJ2EEアプリケーションのデプロイメント・ディスクリプタが含まれるMETA-INFフォルダ
b. ユーザのJ2EEアプリケーションのデプロイメント・ディスクリプタ(application.xml)のモジュールにfujitsu-ibpm-engine-modelejb.jarを記述します。
例:
<module id=" module id="EjbModule_1187608318108">
<ejb>fujitsu-ibpm-engine-model-ejb.jar</ejb>
</module>
注意
EjbModule_1187608318108をカスタマイズします。
サンプルのデプロイメント・ディスクリプタは、Interstage BPM CDイメージのconsole\ibpmconsole-ear\を参照してください。
c. My Applicationから以下のコマンドを実行します:
<java_home>¥jar.exe cvfm myapp.ear META-INF\MANIFEST.MF .
2. 単一クラスローダーオプションにより、マシンBのWebSphere Application Serverで前ステップで作成した、J2EEアプリケーション
(EAR)を配備します。
a. WASコンソールでアプリケーション>エンタープライズ・アプリケーションを選択します。
エンタープライズ・アプリケーションのリストが表示されます。
- 34 -
b. ユーザのアプリケーションのリンクをクリックします。
アプリケーションの設定ページが表示されます。
c. 「クラス・ロードおよび更新の検出」リンクを選択します。
クラス・ローダーの詳細画面が表示されます。
d. WAR クラス・ローダー・ポリシーセクションの「アプリケーションの単一クラス・ローダー」を選択します。
[適用]をクリックして変更を保存します。
3. マシンAのDeployment ManagerのJMS 関連の設定で以下のように設定します。
a. マシンAとマシンBの管理ノードをDeployment Managerに追加します。詳細はInterstage BPM Server and Console Installation
Guide(WebSphere Application Server)の「Adding Managed Nodes」を参照してください。
b. マシンAにIBPMをインストールすると、SIバスmachineANode01IBPMBussが作成されます。このSIバスのメンバーとして
サーバBを追加します。
注意
マシンAのSIバスにサーバAはすでに存在しています。
1. バスページでmachineANode01IBPMBussの名前をクリックします。
2. 構成タブの[バス・メンバー]をクリックします。
3. [追加]をクリックします。
4. ドロップダウンリストから、machineANode01:server1を選択して[次へ]をクリックします。
5. メッセージスト・アのタイプの選択でファイル・ストアがとして選択されているとをを確認して[次へ]をクリックします。
6. メッセージ・ストア項目をデフォルト値にして[次へ]をクリックします。
7. [終了]をクリックします。
8. ページの先頭に表示されるメッセージの[検討]をクリックします。ノードの同期を選択し、[保管]をクリックして設定を
保存します。
c. ユーザのJ2EEアプリケーション(EAR)のため、SQNotificationTopicおよび、NotificationTopicを以下のように追加します。
1. リソース>JMSタブに移動し、[トピック]を選択します。
2. 有効範囲に「ノード=machineBNode01,サーバ=server1」を選択します。
3. [新規作成]をクリックして、デフォルトが選択されているままで[OK]をクリックします。
4. SQNotificationTopicのフィールドの詳細を以下のように設定します。
名前を「iFLowSQNotificationTopic」にします。
JNDI 名を「iFlow/jms/sq/SQNotificationTopic」にします。
トピック名を「SQNotification_MDB_TOPIC」にします。
バス名に「machineANode01IBPMBuss」を選択します。
トピック・スペースに「SQNotification.Topic.Space」を選択します。
JMS デリバリー・モードに「非・パーシスタント」を選択します。
ほかの項目はそのままにします。
5. 「適用」を選択し、設定を確認、保管します。
6. NotificationTopic の設定を行うため、1.から5.を繰り返します。フィールドの詳細を以下のように設定します。
名前を「iFLowNotificationTopic」にします。
JNDI 名を「iFlow/jms/NotificationTopic」にします。
トピック名を「JmsNotification_MDB_TOPIC」にします。
- 35 -
バス名に「machineANode01IBPMBuss」を選択します。
トピック・スペースに「JmsNotification.Topic.Spac」を選択します。
JMS デリバリー・モードに「非・パーシスタント」を選択します。
ほかの項目はそのままにします。
d. SQNotificationTopicおよび、NotificationTopicに以下のようにアクティベーション・スペック追加します。
1. リソース>JMSタブに移動し、[アクティベーション・スペック]を選択します。
2. 有効範囲に「ノード=machineBNode01,サーバ=server1」を選択します。
3. [新規作成]をクリックして、デフォルトが選択されているままで[OK]をクリックします。
4. SQNotificationTopicのフィールドの詳細を以下のように設定します。
名前を「SQNotificationTopic」にします。
JNDI 名を「eis/SQNotificationTopic」にします。
宛先タイプに「トピック」を選択します。
宛先 JNDI名を「iFlow/jms/sq/SQNotificationTopic」にします。
バス名に「machineANode01IBPMBuss」を選択します。
ほかの項目はそのままにします。
5. 「適用」を選択し、設定を確認、保管します。
6. NotificationTopic の設定を行うため、1.から5.を繰り返します。フィールドの詳細を以下のように設定します。
名前を「NotificationTopic」にします。
JNDI 名を「eis/NotificationTopic」にします。
宛先タイプに「トピック」を選択します。
宛先 JNDI名を「iFlow/jms/NotificationTopic」にします。
バス名に「machineANode01IBPMBuss」を選択します。
ほかの項目はそのままにします。
4. fujitsu-ibpm-engine-ejb.jar を <IBPM_ イ ン ス ト ー ル デ ィ レ ク ト リ > \ server \ deployment \ InterstageBPMServer.ear \ か ら
<J2EE_APP_HOME>\WEB-INF\libにコピーします。
5. iFlow.jarおよび、js.jarを<IBPM_インストールディレクトリ>\client\lib\から<J2EE_APP_HOME>\WEB-INF\libにコピーします。
6. サーバA、サーバBそれぞれ再起動します。
注意
<WAS_APPSERVER_HOME> \ profiles \ AppSrv01 \ installedApps<cell
\<web_application_name>.war\.を<J2EE_APP_HOME>と記述します。
Name> \ <application_
name>.ear
4.1.7 WebLogicの環境設定
必須条件:「4.1 システム環境」の説明に従い、システム環境を設定します。
1. WebLogic Application ServerのModel APIを使用してアプリケーションを開発する場合、以下のJARファイルをCLASSPATH環
境変数に追加します。
<BEA WebLogicのインストールディレクトリ>/weblogic92/server/lib/wlclient.jar
<BEA WebLogicのインストールディレクトリ>/weblogic92/server/lib/wljmsclient.jar
- 36 -
4.1.8 JBossの環境設定
必須条件:「4.1 システム環境」の説明に従い、システム環境を設定します。
1. JBoss Application ServerのModel APIを使用してアプリケーションを開発する場合、必要なJARファイルを含む以下のディレクトリを
CLASSPATH環境変数に追加します。
<JBossのインストールディレクトリ>/client
例
/opt/jboss-4.0.5.GA/client/jbossall-client.jar
4.2 Model APIアプリケーションの実行
前提条件:
・ Interstage BPMがインストールされたサーバへのRMIアクセスが可能であること。
・ Interstage BPMサーバが起動していること。
以下で、Interstage BPM Flowが提供するサンプルのModel APIアプリケーションを実行する方法について説明します。
・ Interstage BPMサーバのインストールディレクトリにある、サンプルプログラム開始用のスクリプトを実行します。標準のインストール
では、次の場所にファイルがインストールされます。
Windowsの場合:C:\Fujitsu\InterstageBPM\client\samples\examples\bin\StartSamples.bat
SolarisまたはLinuxの場合: /opt/FJSVibpm/client/samples/examples/bin/StartSamples.sh
・ クライアントアプリケーションを実行する前に、毎回必ずこのスクリプトの"Start the Sample"で指定されたコマンドを実行しなければ
なりません。このスクリプトはアプリケーションのJaveクラス名の入力を必要とします。サンプルの使用手順については▽付録 A Using
the Interstage Business Process Manager Samples△を参照してください。
4.3 プロパティファイルの格納
Model APIアプリケーション内からプロパティファイルにアクセスできます。次の部分的なコードは、iFlowClientの読み込み方法の例で
す。
Properties iflowProps = new Properties();
try {
FileInputStream fin = new FileInputStream("iFlowClient. properties");
iflowProps. load(fin);
}
finally {
fin. close();
}
デフォルトでは、プロパティファイルは実行時のカレントディレクトリから読み込まれます。プロパティファイルがディレクトリに格納されて
いることを確認してください。サンプルのiFlowClient.propertiesファイルは以下のディレクトリに位置しています。
<Interstage BPM Server Installation Directory>/client
プロパティファイルを異なるディレクトリに格納したい場合、そのファイルの絶対パスまたは実行時のカレントディレクトリからの相対パス
で指定する必要があります。以下に例を示します。
Properties iflowProps = new Properties();
try {
FileInputStream fin = new
FileInputStream("C:\\Fujitsu\\InterstageBPM\\iFlowClient.properties");
iflowProps.load(fin);
}
finally {
fin.close();
}
- 37 -
注意
Interstage Application Serverでは、iflow. propertiesに記載されている以下のプロパティは利用できません。
・ NamingProviderURL
・ JMSNamingProviderURL
4.4 Model APIアーキテクチャー
Model APIを使用すると、Interstage BPM Flowとその管理機能にアクセスし、操作することができます。さらに、独自のアプリケーション
を作成して、独自のグラフィカルユーザインタフェースに組み込むことができます。
Model APIには、以下のパッケージが含まれます。詳細については、『API Javadocマニュアル』を参照してください。
・ com.fujitsu.iflow.model.event:プロセス定義やプロセスインスタンスの変更が通知されるEventを受け取るためのインスタンスとクラ
スが含まれています。
・ com.fujitsu.iflow.model.util: 他のクラスやインタ-フェースで一般的に使用される、低レベルのユーティリティクラスが含まれていま
す。ModelクラスによるExceptionsも含まれています。
・ com.fujitsu.iflow.model.wfadapter: 文書管理システム(DMS)を管理するインタフェースが含まれています。DMS内のフォルダや添
付文書に関する情報の取得および更新、DMSに対するオブジェクトのチェックイン/チェックアウトを行うクラスが含まれます。
・ com.fujitsu.iflow.model.workflow: プロセス定義やプロセスインスタンスで必要な情報を管理するインタフェースが含まれていま
す。また、ノード、矢印、添付文書、ワークアイテム、および許可レベルを表すオブジェクトも含みます。このマニュアルで説明する
プログラミングの例は、以下のインタフェースが使用されます。
- Arrowインタフェース: 矢印を作成し、操作するために使用されます。
- ArrowInstanceインタフェース: プロセスインスタンス内で矢印の属性にアクセスするために使用されます。
- AttachmentRefインタフェース: DMS内のプロセスインスタンスの添付文書にアクセスするために使用されます。プロセスインス
タンスに関連付ける添付文書の数に制限はありません。また、追加できる添付文書のタイプにも制限はありません。
- DataItemRefインタフェース: プロセス定義で定義されるUDAの名前、タイプ、および初期値を格納するために使用されます。
- JavaActionSetインタフェース: プロセス定義内でJava Actionを使用するためのメソッドを提供します。
- Nodeインタフェース: プロセス定義に含まれるノードに関する情報を取得するために使用されます。
- Planインタフェース: プロセス定義を作成し、操作するために使用されます。
- ProcessInstanceインタフェース: プロセスインスタンスを作成し、開始するためのオペレーションを提供します。
- WFAdminSessionインタフェース: 管理者が使用するメソッドを提供します。 WFSessionインタフェースを拡張します。
- WFDetailsListインタフェース:一度に複数のオブジェクトの情報を回収できます。
- WFObjectListインタフェース:プロセス定義、プロセスインスタンス、またはワークアイテムを詳細ソートおよびフィルターできま
す。
- WFSessionインタフェース: Interstage BPM Flowサーバにユーザがログインしている間、このサーバへのアクセスを確立し、維
持するためのメソッドを提供します。
- WorkItemインタフェース: ワークアイテム、つまり特定のユーザに割当てられたアクティビティのあらゆる状態へのアクセスを提
供します。
・ com.fujitsu.iflow.server.intf: ワークフローデータへのアクセスを提供するインタフェースが含まれています。このインタフェースを
ServerEnactmentContextと呼びます。このインタフェースには、アクションエージェントを実装するクラスが含まれています。
4.5 例外処理
Model APIが返す例外は、スーパークラスであるModelExceptionクラスとそのサブクラス群があります。いくつかのサブクラスがあります
が、将来互換性の問題が発生する可能性があるため、ModelExceptionを使用してください。
- 38 -
第5章 プロセス定義のデザイン
ここでは、プロセス定義のデザインおよびプロセスインスタンスを開始するための、Model APIを使用したプログラミングの例を示しま
す。
プログラミングの例には以下のものがあります。
・ 一般ユーザのログインとログアウト
・ Startノード、Activityノード、およびExitノードのあるプロセス定義を作成する
・ プロセスインスタンスを開始する
・ ワークアイテムを実行する
プロセス定義が作成済みの場合、「5.1.1 一般ユーザのログインとログアウト」、「5.3 プロセスインスタンス」をお読みください。
5.1 基本的なプロセス定義のデザイン
はじめに、Model APIを使用して、Startノード、Activityノード、およびExitノードがある基本的なプロセス定義を構築します。
この節で紹介するプログラミング例のすべてのコードは、SimplePlan.javaサンプルファイル内にあります。
プロセス定義を作成する前に、ユーザはログインし、ワークフローアプリケーションを選択する必要があります。
その後、Startノードが1つだけあり、Activityノードおよび少なくとも1つのExitノードがある、基本的なプロセス定義を作成します。ユー
ザがログインするには、セッション、つまりWFSessionオブジェクトを作成する必要があります。このセッションは、ユーザがログアウトする
と終了します。
以下の図は、Model APIを使用してプロセス定義をデザインするために必要な手順を示しています。
- 39 -
図5.1 Model APIを使用したプロセス定義のデザイン
- 40 -
5.1.1 一般ユーザのログインとログアウト
プロセス定義を作成する前に、テナントユーザはInterstage BPMサーバにログインする必要があります。また、プロセス定義での作業が
終了したら、再びログアウトする必要があります。
テナントユーザのログイン/ログアウトする方法について説明します。
1. WFSessionオブジェクトのlogIn()を使用して、サーバにログインします。
WFSession session;
session = WFObjectFactory.getWFSession();
ワークフローオブジェクトを割り当てるには、WFObjectFactoryクラスを使用します。次に、getWFSession()でWFSessionオブジェ
クトを作成します。
2. 適切な環境設定ファイルを使用して、セッションを初期化します。
<Interstage BPMサーバインストールディレクトリ>/clientにあるデフォルトのiFlowClient.propertiesファイルを使用することができま
す。このファイルを使用するか、もしくは、カレントディレクトリに位置する必要のある新しいファイルに、設定パラメータを設定しま
す。
使用するプロパティファイルに、ログインするテナント名を指定してください。テナント名は、
WFObjectFactory.TENANT_NAME( テ ナ ン ト 名 ) の 値 と し て 指 定 し ま す 。 Default テ ナ ン ト へ ロ グ イ ン す る 場 合 は 、
TenantName=Defaultを指定します。
iFlowClient.properties ファイルの中でバックスラッシュ"¥"またはコロン":"を使用する場合は、バックスラッシュでエスケープする
必要があります。たとえば、サーバのアドレスは以下のように指定します。
ibpmhost\:49950
java.util.Propertiesを使い、iFlowClient.propertiesファイルをロードするとき、load() メソッドは、エスケープ文字を自動的に考慮さ
れます。他の方法でプロパティをロードする場合は、エスケープ文字を正しく扱うようにしてください。iFlowClient.propertiesファイ
ルで使用するエスケープシーケンスの詳細については、java.util.Properties.store()メソッドのJAVAドキュメントを参照してくださ
い。
カレントディレクトリの位置については、「4.3 プロパティファイルの格納」を参照してください。
そのセッションの設定ファイルiFlowClient.propertiesを読み込みます。
Properties sessionProps = new Properties();
sessionProps.load(new
FileInputStream("./classes/iFlowClient.properties"));
以下のとおり、セッションを初期化します。
session.initForApplication(null, sessionProps);
3. WFSessionオブジェクトのlogIn()を使用して、サーバにログインします。
String server = sessionProps.getProperty("HostName") + "Flow";
session.logIn(server, userName, password);
接続サーバ名には、"Flow"という文字列を追加してください。
4. すべての作業が終了したら、ユーザはWFSessionのlogOutを使用して、サーバからログアウトします。
if (session != null ) {
session.logOut();
}
5.1.2 ワークフローアプリケーションを選択する
ログインしたあと、WFSession.chooseApplication()を使って、操作するワークフローアプリケーションを選択します。
session.chooseApplication(myApplicationID);
- 41 -
注意
ApplicationModeSecurityパラメータにRelaxが設定されている場合は、ワークフローアプリケーションの選択を省略できます。選択を省
略した場合の動作については、『Interstage BPMサーバ 管理者ガイド』の「4.4 ApplicationSecurityMode」を参照してください。
5.1.3 プロセス定義の新規デザイン
ユーザはログイン後に新しいプロセス定義をデザインすることができます。基本的なプロセス定義は、1つのStartノード、1つ以上のActivity
ノード、および1つ以上のExitノードで構成されます。
注意
プロセス定義を作成する前に、選択したアプリケーションを確認してください。
Startノードは、プロセスの開始を示すノードです。1つのプロセス定義はStartノードを1つしか持つことができません。Activityノードは、
ユーザによるアクションや意志決定のタスクを表しています。プロセス定義には、任意の数のActivityノードを指定できます。Exitノード
は、プロセスの終了を示すノードです。1つのプロセス定義には1つ以上のExitノードが必要です。
各ノードは矢印で連結することができます。矢印の基本的な目的は、プロセス内のフローを制御することです。ノードが完了すると、プ
ロセスインスタンスは矢印の起点から終点に向かって移動します。ノードが出入りする矢印の数には制限がありません(ただし、Startノー
ドは出力矢印、Exitノードは入力矢印のみ設定可能です)。
プロセス定義をデザインする方法について説明します。
1. WFObjectFactory.getPlan()を使用して、空のプロセス定義オブジェクトを作成します。
Plan plan = null;
plan = WFObjectFactory.getPlan();
plan.setWFSession(session);
2. ノードや矢印をプロセス定義に追加する前に、PlanインタフェースのstartEdit()を使用して、プロセス定義のモードを編集モード
に変更します。
plan.startEdit();
3. PlanインタフェースのsetName()、setTitle()、およびsetDesc()を使用して、いくつかの一般的な情報をプロセス定義に追加するこ
とができます。
plan.setName("プラン");
plan.setTitle("プラン1");
plan.setDesc("サンプルのプロセス定義の作成");
4. Startノード、Activityノード、およびExitノードをプロセス定義オブジェクトに追加します。
ノードを追加するには、PlanインタフェースのaddNode(name, nodeType)を使用します。定数nodeTypeは、追加するノードタイプ
を定義します。この定数に使用可能な値は、Nodeインタフェースで定義されています。
NodeインタフェースのsetPosition()は、ノードの位置を定義します。各ノードには、グラフィカル表示するために、キャンバス上の
位置を示すX座標とY座標の情報があります。位置情報は、各ノードの位置により異なります。ノードの正しい位置を確認のうえ、
パラメータを設定してください。
a. Startノードを追加します。
Node startNode = plan.addNode("Start", Node.TYPE_START);
startNode.setPosition(new Point(100, 150));
b. Activityノードには、NodeインタフェースのsetRole()を使用してユーザグループを割り当てることができます。さらに、Activity
ノードが活性化された際にグループワークアイテムを生成するか、または、Activityノードに割り当てられたグループのメン
バーごとに個別ワークアイテムを生成するかを定義できます。この設定は、SupportGroupWorkItem パラメータの値にも依
存します。 デフォルトでは、このInterstage BPMサーバのパラメータはfalseに設定されています。デフォルトで、このパラメータは
- 42 -
falseに設定されています。SupportGroupWorkItemの詳細については、『Interstage BPMサーバ 管理者ガイド』を参照して
ください。Activityノードを追加する手順は以下のとおりです。
Node activityNode = plan.addNode("Activity",Node.TYPE_ACTIVITY);
activityNode.setPosition(new Point(200, 250));
activityNode.setRole("SampleGroup");
activityNode.markForExpandGroups(false);
グループの割り当てをサポートしているのは、ActivityノードとVoting Activityノードだけです。
c. Exitノードを追加します。
Node exitNode = plan.addNode("Exit", Node.TYPE_EXIT);
exitNode.setPosition(new Point(300, 350));
5. NodeインタフェースのaddArrow()を使用して、ノードを矢印で連結します。矢印を追加する場合は、その矢印の名前、始点、お
よび終点を指定します。
Arrow goArrow = plan.addArrow("go", startNode, activityNode);
Arrow stopArrow = plan.addArrow("stop", activityNode, exitNode);
6. ノードと矢印をプロセス定義オブジェクトに追加したら、PlanインタフェースのvalidatePlan()を使用して検証する必要があります。
plan. validatePlan();
7. PlanインタフェースのcreateProcessDef()を使用して、プロセス定義を作成します。
plan = plan.createProcessDef();
注意
・ プロセス定義は、createProcessDef()を使用するまで、Interstage BPMサーバには作成されません。プロセス定義オブジェクトが
Interstage BPMサーバに登録されると、Interstage BPMサーバはプロセス定義IDをそのオブジェクトに割り当てます。
・ SaaSモードの場合、プロセス定義を作成する前に、アプリケーションを選択する必要があります。非SaaSモードの場合は、プロセス
定義を作成する前に、アプリケーションを選択していなくてもかまいません(作成中のプロセス定義は除きます)。
下の図は、作成されるプロセス定義を示しています。
- 43 -
図5.2 Startノード、Activityノード、およびExitノードのある基本的なプロセス定義
5.2 応用的なプロセス定義のデザイン
ここでは、ほぼすべてのコンポーネントを含んだ応用的なプロセス定義を作成するための、プログラミングの手順を説明します。この節
で紹介しているプログラミング例のすべてのコードは、ComplexPlan.javaサンプルファイル内にあります。 以下の図は、サンプルファイ
ルで定義しているワークフローエレメントがどのように作用しあうかを示しています。
- 44 -
図5.3 様々なノードタイプのある応用的なプロセス定義
前の節で、Startノード、Exitノード、Activityノードなどの基本的なワークフローエレメントを追加する方法を説明しました。以降の各節で
は、UDAを追加する方法や、Voting Activityノード、ANDノード、ORノードなど、そのほかのノードの追加方法を説明します。
応用的なプロセス定義をデザインする方法について説明します。
1. サーバにログインします。
ユーザのログインおよびログアウトする方法については、「5.1.1 一般ユーザのログインとログアウト」を参照してください。
2. PlanインタフェースのstartEdit()を使用して、プロセス定義を編集モードに設定します。
編集モードになると、Interstage BPMサーバはそのプロセス定義をロックするので、編集中は、ほかのユーザがそのプロセス定義
を変更することはできません。編集できるのは、ドラフト状態またはプライベートのプロセス定義だけです。ドラフト状態のプロセス
定義は、それに属するプロセスインスタンスがすでに完了している場合だけ編集可能です。
3. Startノード、1つ以上のExitノード、および必要なActivityノードを追加します。
これらのノードの追加方法については、「5.1.3 プロセス定義の新規デザイン」を参照してください。
4. UDAをプロセス定義に追加します。Voting Activityノード、ANDノードなど、ほかのノードタイプを追加します。
詳細については、以下の節を参照してください。
5. ノードに矢印を接続します。
詳細については、「5.1.3 プロセス定義の新規デザイン」を参照してください。
- 45 -
6. プロセス定義を検証して、作成します。
詳細については、「5.1.3 プロセス定義の新規デザイン」を参照してください。
7. ビジネスプロセスをエンハンスするため、Java Action、Extended attribute、エージェント、タイマー、エラー処理とった拡張を使用
するかどうか、確認してください。
詳細については、「第6章 Interstage BPMの強化」を参照してください。
5.2.1 ユーザ定義属性の追加
DataItemRefインタフェースは、プロセス定義で定義されたUDAの識別子、名前、タイプ、および初期値を保持します。
UDAはプロセスインスタンスに対してグローバルな変数なので、プロセスインスタンス内のすべてのノードは、すべてのUDAにアクセス
することができます。UDAは、ノードの動作や、プロセス実行用のデータを保存します。
UDAは以下のデータタイプ、BIGDECIMAL、BOOLEAN、DATE、FLOAT、INTEGER、LONG、STRING、XMLのうち、1つを保有し
ています。
注意
UDAには、名前と識別子がついています。
UDAの名前
・ UDAの名前は、ユーザ定義です。
・ UDAの名前は、最高64文字の文字列を含む場合があります。
・ UDAの名前は、システムにより作成、維持されるUDAのプレフィックスとして使用されるため、2つのアンダースコア(__)から始める
ことはできません。
UDAの識別子
・ UDAの識別子は、ユーザ定義、もしくは、システムにより作成されます。UDAの作成時に識別子を指定しなかった場合には、識別
子は自動的に以下のように生成されます。入力として名前が作成されます。特殊文字はすべて排除されます。その「サニタイズさ
れた名前」(識別子)が32文字を超える場合、空の場合、もしくは、固有のものでない場合には、識別子は、プレフィックス'uda<数字
>'として構成され、、たとえば、'uda1'のようになります。
・ 最高32文字の文字列から構成される場合があります。
・ プロセス定義全体で、固有のものでなければなりません。
・ 各ユーザの相互作用で、UDAの名前は使用されます。必要時には、UDAの名前は、その識別子にマッピングされます。いったん
作成されると、UDAの識別子は、変更することはできませんが、UDAの名前は、いつでも変更することができます。
プロセス定義にUDAを追加する方法について説明します。
1. プロセス定義の現在のモードが編集モードであることを確認してください。プロセス定義のモードを変更するには、Planインタ
フェースのstartEdit()を使用します。
2. UDAを追加するには、PlanインタフェースのaddDataItemRef()、もしくは、addDataItemRefWithId()を使用します。1つ目のメソッ
ドを使用するとUDAの識別子は生成されます。2つ目のメソッドを使用すると、独自の識別子を定義することができます。
例
protected final static String WLUDA_PRICE = "Price";
protected final static String WLUDA_QTY = "Qty";
protected final static String WLUDA_TOTAL = "Total";
DataItemRef udaPrice = plan.addDataItemRef(WLUDA_PRICE,
DataItemRef.TYPE_FLOAT, "0.0");
DataItemRef udaQty = plan.addDataItemRef(WLUDA_QTY,
DataItemRef.TYPE_INTEGER, "0");
DataItemRef udaTotal = plan.addDataItemRef(WLUDA_TOTAL,
- 46 -
DataItemRef.TYPE_FLOAT, "0.0");
DataItemRef udaJavaActionTest = plan.addDataItemRefWithId(
"JavaActionTest", "My JA Test", DataItemRef.TYPE_STRING, "0");
DataItemRef udaMapping = plan.addDataItemRefWithId(
("MapUDAParent", "Mapping UDA Parent",
DataItemRef.TYPE_STRING,
"This value is from parent process");
DataItemRef udaCondition = plan.addDataItemRef("Condition",
DataItemRef.TYPE_STRING, "");
DataItemRef udaSec = plan.addDataItemRef("SEC",
DataItemRef.TYPE_STRING, "sec");
注意
ユーザ定義された識別子が、プロセス定義全体で、固有のものであるかを確認する場合は、PlanインタフェースのisIdentifierUnique(String
ID)メソッドを使用してください。
5.2.2 Voting Activityノード
Voting Activityノードは、投票ルールを使用して、投票の結果勝ちとなった矢印(アクティビティの外向き矢印)を選択します。すべての
Voting Activityノードについて、投票のルールを設定します。
Voting Activityノードを追加する方法について説明します。
1. addNode()を使用してノードを作成します。定数nodeTypeにTYPE_VOTING_ACTIVITYを設定します。
Node directorApproveNode = plan.addNode("Approve", Node.TYPE_VOTING_ACTIVITY);
directorApproveNode.setRole(userGroup);
directorApproveNode.setPosition(new Point(290, 350));
2. NodeインタフェースのsetVotingRule()を使用して、Voting Activityノードのルールおよび閾値を定義します。投票ルールの詳細
については、『API Javadocマニュアル』を参照してください。
ルールのタイプを以下の中から選択します。
- NUMBER
- PERCENTAGE
- MAJORITY
閾値は、投票が成立する値を定義します。
directorApproveNode.setVotingRule("Reject", VotingRule.TYPE_NUMBER, 1);
directorApproveNode.setVotingRule("Approve", VotingRule.TYPE_NUMBER, 1);
サンプルコードでは、NUMBERタイプの投票ルールで、両方の外向き矢印の閾値に1を指定しています。つまり、1人のユーザ
が矢印の選択を行うと、その矢印に関連付けられているアクションが実行されます。
3. setEvaluateRulesMode()を使用して、投票をチェックする時期を指定します。以下のいずれかを選択できます。
- Node.ON_EVERY_VOTE: 状況は、投票されるごとにチェックされます。
- Node.WHEN_ALL_VOTES_ARE_CAST: 状況は、割り当てられたグループのすべてのユーザが投票した後にチェックされ
ます。
directorApproveNode.setEvaluateRulesMode(Node.ON_EVERY_VOTE);
4. setDefaultChoice()を使用して、 投票ルールのデフォルトの選択を定義します。
directorApproveNode.setDefaultChoice("Reject");
- 47 -
5.2.3 ANDノードとORノードの追加
ANDノードは、複数のアクティビティに分岐しているプロセスを、同期するためのステップを表しています。プロセス定義は、任意の数の
ANDノードを指定できます。
ORノードは、プロセス内で複数のアクティビティに分岐するステップを表しています。プロセス定義は、任意の数のORノードを指定で
きます。
・ ANDノードを追加する方法について説明します。
addNode()を使用して、定数nodeTypeをTYPE_ANDに設定します。
Node andNode = plan.addNode("And Node", Node.TYPE_AND); andNode.setPosition(new Point(440, 460));
・ ORノードを追加する方法について説明します。
addNode()を使用して、定数nodeTypeをTYPE_ORに設定します。
Node orNode = plan.addNode("Or Node", Node.TYPE_OR); orNode.setPosition(new Point(430, 230));
5.2.4 Conditionalノード
Conditionalノードは開始アクションを使用するActivityノードです。Conditionalノードをプロセス定義に追加した後、まず開始アクション
を定義し、次にそのノードの分岐条件を定義します。
Conditionalノードを追加する方法について説明します。
1. addNode()を使用して、定数nodeTypeをTYPE_CONDITIONに設定します。
Node CondNode = plan.addNode("Conditional Node",
Node.TYPE_CONDITION);
CondNode.setPosition(new Point(430, 140));
2. 開始アクションを定義します。詳細については、「第6章 Interstage BPMの強化」を参照してください。
3. NodeインタフェースのgetConditionSpec()、およびsetCondBranchSpecInfo()を使用して、Conditionalノードの分岐条件を定義し
ます。
例
以下の例では、Conditionalノードの外向き矢印に3つの分岐条件を定義しています。UDA Totalの値は、与えられた予算の上限を示
しています。
・ PRの変更(Modify PR): Total <= 0.0 (規定値)
・ 上司の承認が必要( Manager Approval Required): Total > 0.0かつTotal < 1000.0
・ 複数の承認が必要( Multiple Approvals Required): Total > 1000.0
UDA Totalは2つの分岐条件を含みますが、分岐毎に1つの分岐条件しか定義できないので、UDA Totalを使用してどの分岐を使用
するかを決定することはできません。そこで、UDA Conditionの値を追加します。UDA Totalの値に依存して、UDA Conditionに3つの
固有の値のうち、1つが設定されます。これらの値は、どの矢印を使用するかを制御するために必要となります。Conditionalノードは、
SampleJavaActionsという名前のサンプルで示すように、現在の値であるUDA TotalとUDA Conditionの比較のような条件判定ロジック
を提供しています。
判定ロジックの内容は以下のとおりです。
if (Total <= 0.0) {
Condition = Modify PR;
} else if (Total > 0.0 && Total <= 1000.0) {
Condition = "Manager Approval Required";
} else if (Total > 1000.0) {
Condition = "Multiple Approvals Required";
} else {
Condition = "Modify PR";
- 48 -
Conditionalノード用に定義されたNodeインタフェースのgetConditionSpec()は、このUDAを使用して、選択する矢印の情報を取得しま
す。ConditionSpecインタフェースのsetCondBranchSpecInfo()を使用して、新しい分岐をConditionSpecオブジェクトに追加することがで
きます。
ConditionSpec conditionSpec = condNode.getConditionSpec();
conditionSpec.setConditionAttribute("Condition");
conditionSpec.setCondBranchSpecInfo("Modify PR",
BranchSpec.EQUAL_OP, "Modify PR", true );
conditionSpec.setCondBranchSpecInfo("Multiple Approvals Required",
BranchSpec.EQUAL_OP,
"Multiple Approvals Required", false );
conditionSpec.setCondBranchSpecInfo("Manager Approval Required",
BranchSpec.EQUAL_OP, "Manager Approval Required", false );
condNode.setConditionSpec(conditionSpec);
setConditionSpec(conditionSpec)について、説明します。
Interstage BPM Model APIは、XML要素の値setConditionAttribute(String udaName, String xPath)にアクセスするためのメソッドです。
また、getConditionAttributeXPath()メソッドを呼出して、xPathの値を検索します。
詳細については、『API Javadocマニュアル』を参照してください。
5.2.5 Subprocessノード
Subprocessノードは、ほかのプロセス定義を呼出してタスクを完了し、その結果が返ってくるのを待ち合わせるノードです。このノードは
様々な目的に使用されますが、特に、既存のプロセス定義を新しいプロセス定義内で再利用するために使用されます。
Subprocessノードは、デザイン済みのプロセス定義の持つ、ノード、矢印、その他すべての情報にアクセスして、そのプロセス定義全体
を表すことができます。Subprocessノードは、既存のプロセス定義をその名前で呼び出すことができます。
ComplexPlan.javaサンプルファイル内では、Subprocessノードがプロセス定義をCxPD_Approvalという名前で呼び出す方法を示してい
ます。以下の図は、このプロセス定義を示しています。
- 49 -
図5.4 Subprocessノードから呼び出された様々なノードタイプのあるプロセス定義
Subprocessノードを使用する方法について説明します。
1. Subprocessノードをプロセス定義に追加します。そのためには、addNode()を使用して、定数nodeTypeをTYPE_SUB_PROCESS
に設定します。
Node subProcessNode = plan.addNode("Multiple Approvals",
Node.TYPE_SUB_PROCESS);
subProcessNode.setPosition( new Point(406, 237));
2. Subprocessノードが呼び出されたときに、生成されるプロセスインスタンスが使用する既存のプロセス定義の名前を指定します。
そのためには、NodeインタフェースのsetSubPlanName()を使用します。
subProcessNode.setSubPlanName(subPlan.getName());
このサブプロセス定義の最新バージョンから、新しいプロセスインスタンスが自動的に生成されます。
- 50 -
注意
親プロセス定義と同じバージョンのサブプロセス定義を使用する必要がある場合、com.fujitsu.iflow.model.workflow.Planのイン
タフェースにあるsetSameSubPlanVersion(boolean)メソッドを使用してください。例えば、バージョン2の親プロセス定義'A'には、す
べてのサブプロセスのバージョン2(最新版ではない)だけを設定するために、前記のメソッドを使用できます。親プロセス定義に
このような機能を設定するサンプルコードは、以下のとおりです。
plan.startEdit();
plan.setSameSubPlanVersion(true);
plan.commitEdit();
これを親プロセスに設定する場合、親プロセス定義のバージョンと、同じバージョンを持つサブプロセス定義が存在することを確
認してください。親プロセスのインスタンスが、存在しないバージョン番号のサブプロセス定義を呼び出そうとすると、エラーとなり
ます。
WFSession.updateApplication()メソッドを使用してアプリケーションをアップデートする際、サブプロセス定義の同じバージョンを
使用したい場合は、子プロセス定義と同様に、親プロセス定義もアップデートする必要があります。
3. addDataMappingElement()を使用して、親プロセス定義のUDAと、サブプロセス定義のUDAの間での情報をマッピングします。
DataItemMappingElementは、「入力データマッピングエレメント」と呼ばれ、サブプロセス定義のUDAにマッピングされる親プロ
セス定義のUDAを含みます。
subProcessNode.addDataMappingElement("MappingUDAParent",
"MappingUDAChild", DataItemMappingElement.INOUT);
注意
再帰的なサブプロセスがあるプロセス定義をデザインする場合は、注意が必要です。関連するプロセス定義をすべてチェックし、無限
ループが起きないことを確認してください。
5.2.6 Delayノード
Delayノードは、一定の時間、プロセスの実行を停止することができるステップを表しています。
Delayノードを使用する方法について説明します。
1. Delayノードをプロセス定義に追加します。そのためには、addNode()を使用して、定数nodeTypeをTYPE_DELAYに設定します。
Node delayNode = plan.addNode("Delay Node", Node.TYPE_DELAY);
delayNode.setPosition(new Point(434, 500));
2. Delayノードにタイマーを追加して、プロセスの実行をどのくらい一時停止するかを指定します。
この例については、「6.16.1 タイマーの定義」を参照してください。
5.2.7 Chained-Processノード
Chained-Processノードは、親プロセスインスタンスから独立した新しいプロセスインスタンスの呼び出しを表します。このノードでは、独
立したプロセスインスタンスを親プロセスインスタンスの一部として実行します。Chained-Processノードは、既存のプロセス定義をその名
前でだけ呼び出すことができます。
ComplexPlan.javaサンプルファイル内では、Chained-Processノードがプロセス定義をCxPD_Sendという名前で呼び出す方法を示して
います。以下の図は、このプロセス定義を示しています。
- 51 -
図5.5 Chained-Processノードから呼び出されたプロセス定義
Chained-Processノードを使用する方法について説明します。
1. Chained-Process ノ ー ド を プ ロ セ ス 定 義 に 追 加 し ま す 。 そ の た め に は 、 addNode() を 使 用 し て 、 定 数 nodeType を
TYPE_CHAINED_PROCESSに設定します。
Node chainedProcessNode = plan.addNode("Send Purchase Order", Node.TYPE_CHAINED_PROCESS);
chainedProcessNode.setPosition( new Point(212, 391));
2. Chained-Processノードが呼び出されたときに、生成されるプロセスインスタンスが使用する既存のプロセス定義の名前を指定し
ます。そのためには、NodeインタフェースのsetChainedPlanName()を使用します。
chainedProcessNode.setChainedPlanName(chainedPlan.getName());
このChained-Process定義の最新バージョンから、新しいプロセスインスタンスが自動的に生成されます。
注意
親プロセス定義と同じバージョンのChained-Process定義を使用する必要がある場合、com.fujitsu.iflow.model.workflow.Planの
インタフェースにあるsetSameSubPlanVersion(boolean)メソッドを使用してください。例えば、バージョン2の親プロセス定義'A'に
は、すべてのChained-Processのバージョン2(最新版ではない)だけを設定するために、前記のメソッドを使用できます。親プロセ
ス定義にこのような機能を設定するサンプルコードは、以下のとおりです。
plan.startEdit();
plan.setSameSubPlanVersion(true);
plan.commitEdit();
これを親プロセスに設定する場合、親プロセス定義のバージョンと、同じバージョンを持つサブプロセス定義が存在することを確
認してください。親プロセスのインスタンスが、存在しないバージョン番号のChained-Process定義を呼び出そうとすると、エラーと
なります。
WFSession.updateApplication()メソッドを使用してアプリケーションをアップデートする際、Chained-Process定義の同じバージョン
を使用したい場合は、子プロセス定義と同様に、親プロセス定義もアップデートする必要があります。
3. addDataMappingElement()を使用して、親プロセス定義のUDAと、チェインプロセス定義のUDAの間での情報のフローをマッピ
ングします。
DataItemMappingElementは、「入力データマッピングエレメント」と呼ばれ、チェインプロセス定義のUDAにマッピングされる親プ
ロセス定義のUDAを含みます。
- 52 -
chainedProcessNode.addDataMappingElement("MappingUDAParent",
"MappingUDAChild", DataItemMappingElement.INOUT);
5.3 プロセスインスタンス
ここでは、プロセス定義を取得し、そのプロセス定義からプロセスインスタンスを開始する手順について説明します。さらに、プロセスイ
ンスタンス内で生成されるワークアイテムの実行についても解説しています。これらの節で紹介しているプログラミング例のすべての
コードは、ProcessExecution.javaサンプルファイル内にあります。
プロセスインスタンスやワークアイテム上で何か作業をする前に、ユーザはログインする必要があります。ユーザのログインおよびログ
アウトの方法に関する情報は、「5.1.1 一般ユーザのログインとログアウト」を参照してください。
SaaSモードの場合、プロセスインスタンスを開始する前に、アプリケーションを選択する必要があります。
以下の図は、プロセスインスタンスを操作する場合に必要な手順を示しています。
図5.6 Model APIを使用したプロセスインスタンスの操作
- 53 -
5.3.1 プロセス定義の最新バージョンの取得
プロセス定義の最新バージョンを取得する方法について説明します。
1. Interstage BPMサーバで使用可能なすべてのプロセス定義のリストを表示します。そのためには、com.fujitsu.iflow.model.workflow
パッケージのWFObjectListインタフェースを使用して、Interstage BPMサーバから既存のWFObjectsオブジェクトのリストを取得し
ます。
WFObjectFactoryクラスは、ワークフローオブジェクトへの定型的なアクセス手段を提供します。
Plan plan = null;
WFObjectList wfObjectList =
WFObjectFactory.getWFObjectList(session);
Object[] planList = null;
2. プロセス定義を、プロセス定義の名前でフィルタリングします。そのためには、WFObjectsListインタフェースのaddFilter()を使用
して、取得するプロセス定義リストのフィルタ条件を追加します。
wfObjectList.addFilter(WFObjectList.LISTFIELD_PLAN_NAME,
WFObjectList.SQLOP_EQUALTO, "\'" + planName + "\'");
注意
プロセス定義の名前は、生成されるデータベースクエリにそのまま含まれるので、二重引用符(") で囲みます。
3. プロセス定義を、目的の条件でソートします。addSortOrder()を使用して、取得するプロセス定義のリストにフィールドベースのソー
ト順を追加します。
wfObjectList.addSortOrder(WFObjectList.LISTFIELD_PLAN_ID,
WFObjectList.SORTORDER_DESCENDING);
wfObjectList.openBatchedList(Filter.AllPlans);
planList = wfObjectList.getNextBatch(1);
サンプルコードでは、プロセス定義をIDでソートしています。 openBatchedList()は、Interstage BPMサーバから取得したフィルタ
条件に一致するプロセス定義のリストを返します。 ここでは最新バージョンのプロセス定義だけを検索しているので、getNextBatch(1)
は、最初のエントリだけ取得します。
4. 最新バージョンのプロセス定義を使用します。
if (planList != null && planList.length > 0) { plan = (Plan) planList[0]; } return plan;
返却されたリストで最初のエントリが、検索したプロセス定義の最新バージョンです。
5.3.2 プロセスインスタンスの作成と開始
プロセス定義を取得した後、その定義からプロセスインスタンスを作成し、開始することができます。
新しいプロセスインスタンスを作成して開始する方法について説明します。
1. PlanインタフェースのcreateProcessInstance()を使用して、プロセスインスタンスを作成します。
processInst = WFObjectFactory.createProcessInstance(plan.getId(),session);
createProcessInstance()は、プロセス定義の構造と属性を実行中のプロセスインスタンスにコピーすることで、新しいプロセスイン
スタンスを作成します。
プロセス定義が新しいプロセスインスタンスにコピーされると、プロセス定義のコンポーネントも新しいプロセスインスタンスのコン
ポーネントとしてコピーされます。たとえば、プロセス定義のStartNodeオブジェクトは、新しいプロセスインスタンスのStartNodeInstance
オブジェクトにコピーされます。
2. startEdit()を使用してプロセスインスタンスを編集モードに設定すると、プロセスインスタンスのパラメータを編集することができま
す。
- 54 -
3. 編集が終了したら、commitEdit()を使用して、編集モードを終了します。
編集モードを終了しない場合、プロセスインスタンスは以降の操作からロックされます。
4. プロセスインスタンスを開始します。
processInst.start();
5.3.3 ワークアイテムリストの作成
ワークアイテムリストを作成するには、com.fujitsu.iflow.model.workflowパッケージのWFObjectsListインタフェースを使用します。この
インタフェースは、Interstage BPMサーバから既存のWFObjectsのリストを取得します。
ワークアイテムリストを作成する方法について説明します。
1. Filterクラスを使用して、フィルタを作成します。
ワークアイテムのフィルタには以下の条件を使用することができます。
- AllWorkItems: すべてのワークアイテムを取得します。
- MyAcceptedWorkItems: ログイン中のユーザに属する、すべての承認済のワークアイテムを取得します。
- MyActiveWorkItems: ログイン中のユーザに属する、すべての活性中のワークアイテムを取得します。
- MyCompletedWorkItems: ログイン中のユーザに属する、すべての完了したワークアイテムを取得します。
- MyDeclinedWorkItems: ログイン中のユーザが拒否したすべてのワークアイテムを取得します。
- MyWorkItems: ログイン中のユーザに属する、すべてのワークアイテムを取得します。
2. openBatchedList()を使用します。
3. getNextBatch()を呼び出します。
getNextBatch()は、openBatchedList()で設定したフィルタ条件に一致するワークフローオブジェクトの配列を返します。
例
WorkItem[] workItemList = null;
if (filter == Filter.AllWorkItems
|| filter == Filter.MyAcceptedWorkItems
|| filter == Filter.MyActiveWorkItems
|| filter == Filter.MyCompletedWorkItems
|| filter == Filter.MyDeclinedWorkItems
|| filter == Filter.MyWorkItems) {
WFObjectList wfObjectList =
WFObjectFactory.getWFObjectList(session);
wfObjectList.openBatchedList(filter);
int batchSize = 50;
Object[] elements = wfObjectList.getNextBatch(batchSize);
}
グループワークアイテムは、Filter.MyActiveWorkItemsフィルタをサポートしません。Interstage BPMサーバのSupportGroupWorkItem
パラメータが、 trueに設定されている場合、このフィルタを使用してワークアイテムを取得することはできません。その代わり、
Filter.AllWorkItemsフィルタを使用してワークアイテムを取得します。グループワークアイテムが属するグループの名前による詳細な
フィルタを使用するには、LISTFIELD_WORKITEM_ASSIGNEEをSQL演算子と共に使用します。SupportGroupWorkItemパラメータ
の詳細については、『Interstage BPMサーバ 管理者ガイド』を参照してください。
グループワークアイテムのフィルタリングの例
UserXが2グループ(GroupAとGroupB)のメンバーの場合:
シナリオ1: UserXがGroupAに割り当てられたすべてのグループワークアイテムを取得したい場合:
...
wfObjectList.addFilter (WFObjectList.LISTFIELD_WORKITEM_ASSIGNEE, WFObjectList.SQLOP_EQUALTO, "GroupA");
- 55 -
wfObjectList.openBatchedList(Filter.AllWorkItems);
...
シナリオ2: UserXが、GroupAとGroupBの両方のグループに割り当てられたすべてのグループワークアイテムを取得したい場合:
...
wfObjectList.addFilter (WFObjectList.LISTFIELD_WORKITEM_ASSIGNEE, WFObjectList.SQLOP_IN, "GroupA,GroupB");
wfObjectList.openBatchedList(Filter.AllWorkItems);
...
シナリオ3: UserXが、GroupAとGroupBの両方のグループに割り当てられたすべてのグループワークアイテムと、自分に割り当てられた
すべての個別ワークアイテムを取得したい場合:
...
wfObjectList.addFilter (WFObjectList.LISTFIELD_WORKITEM_ASSIGNEE, WFObjectList.SQLOP_EQUALTO, "GroupA,GroupB,UserX");
wfObjectList.openBatchedList(Filter.AllWorkItems);
...
5.3.4 ワークアイテムの実行
活性中のワークアイテムだけ、実行することができます。
ワークアイテムを実行する方法について説明します。
・ 活性中のワークアイテムのリストを作成します。
wfObjectList.addFilter(WFObjectList.LISTFIELD_WORKITEM_ASSIGNEE,
WFObjectList.SQLOP_IN, "User,Group");
WorkItem[] workItemList = listWorkItems(Filter.MyActiveWorkItems);
・ WorkItemインタフェースのgetChoices()を使用して、ワークアイテムの選択肢を取得します。
choices = workItem.getChoices();
この戻り値choicesは、ワークアイテムを表すActivityノードに接続された外向き矢印の名前です。
・ WorkItemインタフェースのaccept()を使用して、ワークアイテムを承認します。
if (choices != null ) { workItem.accept(); int choiceIdx = 0; ... }
accept() は、ワークアイテムの状態をSTATE_ACCEPTEDに変更し、このアクティビティに関連付けられているその他すべてのワー
クアイテムをSTATE_DEACTIVEに変更します。
・ ワークアイテムを実行します。つまり、WorkItemインタフェースのmakeChoice()を使用して選択を行います。
workItem.makeChoice(choices[choiceIdx]);
makeChoice()は、このワークアイテムで指定した選択肢をパラメータから取得します。makeChoice()は、ワークアイテムを完了しま
す。
5.3.5 ワークアイテムの取戻し
取戻しを実行できるのは、完了状態のワークアイテムのみです。
取戻し対象のアクティビティを、取戻しターゲットと呼びます。取戻しを行う前に活性化していたアクティビティは、取戻しソースと呼びま
す。
取戻しが実行されたあとのアクティビティは、以下のような状態になります。
・ ワークアイテムを取り戻すことで、ターゲットアクティビティは非活性され、終了状態になります。
・ 取戻しソースは活性状態になります。
- 56 -
注意
取戻しができるのは、1つ前のアクティビティの完了状態のワークアイテムのみです。取戻しソースと取戻しターゲットの間に複数のアク
ティビティが存在する場合、取戻しはできません。
以下の図は、ワークアイテムが成功した場合、取戻しの実行前と実行後の状態を示しています。
図5.7 取戻し前のアクティビティの状態
図5.8 取戻し後のアクティビティの状態
並列に並んでいるアクティビティから、ANDやORノードにつながっていたり、共通のアクティビティに両方のアクティビティが接続され
ている場合、並列なそれぞれのアクティビティからワークアイテムを同時に取り戻すことはできません。ワークアイテムの取戻しは、一度に
1つのアクティビティでだけ可能です。取り戻されたアクティビティのワークアイテムはコミットされなければなりません。その後、2番目の
アクティビティを取り戻すことができるようになります。
以下の図では、Activity2はすでに取り戻されています。Activity1は、Action 4がコミットされるまで、Activity2のワークアイテムを取り戻
すことができません。
図5.9 並列なアクティビティからANDノードに接続されている場合
- 57 -
図5.10 並列なアクティビティが共通のアクティビティに接続されている場合
ワークアイテムが取り戻されたとき、取戻しが実行される前に実行されたJavaActionをロールバックするために、補償JavaActionが実行
されます。
ワークアイテムの取戻しのための条件
ワークアイテムを取り戻すためには、取戻しをサポートしているノード種別である必要があります。また、ターゲットアクティビティが条件
を満たしている必要があります。
以下の表は、取戻しをサポートしているノード種別を示しています。ターゲットノードとして取戻し機能がサポートされる条件について説
明しています。
ノードタイプ
Activityノード
取戻しソース
対応
取戻しターゲット
条件
・ エージェントアクティビティでないこと
対応
・ アクティビティが受理されていないこと
・ 活性状態であり、エラーや終了の状態ではないこと
・ プロセスインスタンスが一時停止や中止の状態ではないこ
と
Votingノード
非対応
・ 1つも投票が行われていないこと
対応
・ プロセスインスタンスが一時停止や中止の状態ではないこ
と
Routeノード (AND
ノード、ORノード、
Conditionalノード、
Complex
Conditionalノード、
Emailノード、DBノー
ド、WebServiceノー
ド、カスタムノード)
非対応
非対応
-
Subprocessノード、
Chained-processノー
ド、
RemoteSubprocess
ノード
非対応
非対応
-
Delay ノード
非対応
対応
・ 活性状態であり、エラーや終了の状態ではないこと
- 58 -
ノードタイプ
取戻しソース
取戻しターゲット
条件
・ プロセスインスタンスが一時停止や中止の状態ではないこ
と
Triggerノード
非対応
・ 活性状態で、エラーまたは終了状態ではないこと
対応
・ プロセスインスタンスが一時停止または中止の状態ではな
いこと
Exitノード
非対応
非対応
-
Startノード
非対応
非対応
-
Iteratorノード
対応
対応
・ 繰り返しノードに含まれているのが、アクティビティノードだ
けの場合
つまり、サブプロセスやエージェントノードが含まれていない
場合
・ 繰り返しノードに含まれているすべてのアクティビティノード
インスタンスが活性状態である場合
・ 繰り返しノードに含まれているアクティビティノードが受理さ
れていない場合
・ プロセスインスタンスが一時停止や中止の状態ではないこ
と
注意
ルートノードであるANDノード、ORノード、Conditionalノード、 Complex Conditionalノード、Emailノード、DBノード、WebServiceノード、
およびカスタムノードは、取戻しターゲットにはなりません。しかし、取戻しソースと取戻しターゲットの間に存在する場合は、これらでも
取り戻すことができます。
アクティビティで取戻しをサポートするかしないかを示す取戻しフラグを使用することができます。取戻しフラグがfaleの場合、取戻し可
能です。取戻しフラグがtrueの場合、取戻しはできません。取戻しフラグの状態を判定するためには、isRecallDisabled()メソッドを使い
ます。デフォルト値はfalseです。値をセットするには、setRecallDisabled(boolean)メソッドを使います。
ワークアイテムを取り戻すには
1. 完了したワークアイテムのリストを取得します。
wfObjList.openBatchedList(Filter.MyCompletedWorkItems);
2. 取り戻したいワークアイテムを選択します。
Object[] elements = wfObjectList.getNextBatch(100);
workItem =(WorkItem)elements[n];
3. ソースワークアイテムから取戻しを実行します。
workItem.recall();
選択したワークアイテムが取り戻されます。
5.3.6 添付文書
プロセスインスタンスが保持する情報から、AttachmentRefインタフェースを使用して、指定した文書管理システム(DMS)の添付文書に
アクセスすることができます。
- 59 -
注意
DMSは、Interstage BPMの設定で指定したDMSディレクトリにする必要があります。
添付文書は、名前とパスという、2つの属性によって参照されます。名前の属性は、識別子として使用する簡潔な名前です。パスの属
性は、添付文書への完全修飾パスです。
プロセスインスタンスに関連付ける添付文書の数に制限はありません。また、追加できる添付文書のタイプにも制限はありません。
添付文書は、プロセスインスタンスに対してグローバルです。プロセスインスタンス内のすべてのアクティビティは、添付文書にアクセス
できます。
・ 添付文書を追加する方法について説明します。
プロセスインスタンスが、実行編集モード、または構造的編集モードであることを確認します。次に、ProcessInstance.addAttachment
を使用して、新しいAttachmentRefオブジェクトを構築します。
procInst.startEdit();
procInst.addAttachment(ATTACHMENT_NAMES[attachIdx],
ATTACHMENT_FILES[attachIdx]);
procInst.commitEdit();
・ すべての添付文書を取得します。
ProcessInstance.getProcessAttachmentsを使用します。
currentAttachments = procInst.getProcessAttachments();
getProcessAttachments()は、プロセスインスタンスに関連付けられているすべての添付文書への参照を返します。添付文書は、プ
ロセスインスタンスが実行されている間であれば、追加できます。
・ 特定の添付文書を取得する方法について説明します。
ProcessInstance.getAttachmentを使用します。
newAttachment = procInst.getAttachment(ATTACHMENT_NAMES[attachIdx]);
getAttachmentは、プロセスインスタンスに関連付けられている添付文書のAttachmentRefオブジェクトを返します。
ProcessExecution.javaサンプルには、添付文書を取り扱う例が含まれています。詳細は、サンプルのソースコード、および『API Javadoc
マニュアル』を参照してください。
- 60 -
第6章 Interstage BPMの強化
この章では、Interstage BPMの機能を十分に引き出せるよう、機能強化、拡張方法について解説します。
詳細は、以下を参照してください。
・ 6.1 Interstage BPMと外部アプリケーションの統合
・ 6.3 Java Action
・ 6.4 フィルターとソートのAPI
・ 6.7 特別なユーザ定義属性のプロパティ
・ 6.8 拡張属性の使用
・ 6.9 トランザクション制御
・ 6.10 トリガ
・ 6.12 File Listenerファイルリスナ
・ 6.15 エージェントの使用
・ 6.16 タイマーの使用
・ 6.17 リモートサブプロセスのモデル化
・ 6.21 決定表
6.1 Interstage BPMと外部アプリケーションの統合
Interstage BPMは、ほかのアプリケーションとの統合を考えて設計されています。Java Action、エージェント、またはJavaScriptを使用し
て、Interstage BPMサーバ外のクラスのメソッドを呼び出すことができます。ただし、これを行うには、いくつかの簡単な統合の手順を行
う必要があります。
注意
アクション、エージェント、JavaScriptは、ServerEnactmentContextインタフェースを呼び出す必要があります。Model APIでのインタフェー
スでは、アクション、エージェント、JavaScriptにアクセスすることはできません。
Interstage BPMを外部アプリケーションと統合する方法について説明します。
1. Interstage BPMで外部のライブラリを利用できるようにするには、外部クラスまたはJARを、以下のディレクトリにコピーします。
- テナント同士でファイルを使用できるようにする
- クラスを個別に使用する場合は、<Interstage BPMサーバインストールディレクトリ>/server/instance/default/classesに、クラ
スファイルをコピーしてください。
- カスタムライブラリを使用する場合は、Interstage BPM ライブラリ拡張ディレクトリ<Interstage BPMサーバインストールディ
レクトリ>/server/instance/default/lib/extに、JARファイルをコピーします。
- 特定のテナントでファイルを使用できるようにする
- クラスを個別に使用する場合は、/<Interstage BPMサーバインストールディレクトリ>/server/instance/default/tenants/<テナ
ント名>クラスに、クラスファイルをコピーしてください。
- カスタムライブラリを使用する場合は、<Interstage BPMサーバインストールディレクトリ>/server/instance/default/tenants/<
テナント名>/lib/extに、JARファイルをコピーしてください。
- 特定のアプリケーションでファイルを使用できるようにする
- クラスを個別に使用する場合は、<DMSRoot>/apps/<application ID>/engine_classesに、クラスファイルをコピーしてくだ
さい。
- 61 -
- カスタムライブラリを使用する場合は、<DMSRoot>/apps/<application ID>/engine_libに、JARファイルをコピーしてくださ
い。
- JavaScriptファイルを使用する場合は <DMSRoot>/apps/<application ID>/engine_jsに、JavaScriptファイルをコピーして
ください。
2. JavaScriptの独自のカスタムクラスを使用する場合には、そのカスタムクラスをJARファイルに追加し、そのJARファイルを手順1で
述べたディレクトリにコピーします。それから、Packageからクラスを指定します。
JavaScriptのカスタムクラスを使用する場合
特別な目的のカスタムJavaクラスであるtest.classを使用するとします。test.classを、test.jarと呼ばれるJARファイルに追加し、そのJARファ
イルを<Interstage BPMサーバインストールディレクトリ>/server/instance/default/lib/extにコピーします。それから、ご使用のJavaScript
に、test.classを以下のように例示化します。
var test = new Packages.test();
クラスSalaryCommissionは、以下のどちらかのパスに設定します。
・ グローバルクラスパス(<ServerRoot>/classes、またはライブラリの<ServerRoot>/lib/ext)
・ テナントクラスパス(<ServerSharedRoot>/tenants/<テナント名>/classes、またはライブラリの<ServerSharedRoot>/tenants/<テナント名
>/lib/ext)
・ アプリケーションクラスパス(<DMSRoot>/apps/<アプリケーションID>/engine_lib、またはライブラリの<DMSRoot>/apps/<アプリケー
ションID>/engine_lib)
しかし、Javascriptでは、そのクラスローダーが実行されているServerEnactmentContextインスタンスのクラスローダーを使用します。この
インスタンスは、アクションクラスパスの認識なく作成されます。
JavaScriptUtilは、このクラスローダーを使用して、そのグローバルと、必要時には、そのアプリケーションクラスパスを追加します。
そのテストを修正して、SalaryCommissionをロードしたクラスパスのうちの1つに追加してください。
6.2 アプリケーション変数を使用する
アプリケーション変数は、ワークフローアプリケーションのすべてのユーザに、ワークフローアプリケーションのプロセスインスタンス間で
データを共有させます。この機能により、プロセスインスタンスで、よりダイナミックな振る舞いとそれに関連している様々な操作が可能
になります。例えば、Webサービス Javaアクションは、Webサービスの場所を指定するのにアプリケーション変数を使用できます。これ
により、プロセス定義のJavaアクションを変えずに、ユーザはダイナミックにWebサービスの場所を変えることができます。
これらの変数は、アプリケーション開発の間、Interstage BPM Studioでワークフローアプリケーションの一部として定義され、ワークフロー
アプリケーションと共に利用可能です。Appvariable.xmlに、すべてアプリケーション変数が定義されます。Appvariable.xmlは、アプリ
ケーションに含まれるapplicationフォルダの直下に格納されます。Appvariable.xmlは、変数名と値を含んでいます。
以下に例を示します。
<properties>
<entry key="VariableName1">Value1</entry>
<entry key="VariableName2">Value2</entry>
…
</properties>
アプリケーション変数は、Interstage BPM Studioでのみ定義できます。アプリケーション変数の変更は、Interstage BPM コンソールでで
きます。しかし、アプリケーション変数の値を変更できるのは、そのワークフローアプリケーションの管理者だけです。
アプリケーション変数は、ワークフローアプリケーション内のすべてのプロセスインスタンスで、共通の値を使用する場合に、特に有効
です。アプリケーション変数は、ユーザ定義属性(UDA)と同じような方法で使うことができます。UDAとの唯一の違いは、UDAが特定
プロセスインスタンスにおけるデータを共有するのに制限されるということです。
Model API
アプリケーション変数を操作するため、以下のメソッドが、WFSessionクラスにあります。
- 62 -
public java.util.Properties getApplicationVariables (String appId) throws ModelException;
このメソッドは、アプリケーション変数の名前と値を対にしたPropertiesオブジェクトを返します。
public void setApplicationVariables(String appId, java.util.Properties properties) throws ModelException;
このメソッドは、アプリケーション変数を更新します。
注意
アプリケーション変数を更新できるのは、管理者ユーザまたはワークフローアプリケーションの管理者だけです。
6.3 Java Action
Java Actionは、ワークフローエンジンの拡張機能です。根本的に、Java Actionは、Interstage BPMがプロセス実行の一部として呼び出
すことができるよう構成されている、静的なJavaメソッドにすぎません。
一般的に、これらのJava Actionは、外部のプログラムやサービスと接続して情報をやり取りするために使用されます。データを外部プ
ログラムやサービスからInterstage BPMに移動したり、その逆を行うことができます。Java Actionは、外部のプログラムやサービスにアク
セスするときに標準のプロトコルを活用するためにも使われます。
さらに、特定のエラー状況の処置、または、たとえば、Interstage BPM管理者により、プロセスインスタンスが破棄や一時停止された場
合などの対処に、Java Actionを使用することができます。
com.fujitsu.iflow.model.workflow のJavaActionSetインタフェースは、JavaActionsのコンテナです。設計時に、Java Action、すなわち、
1つ以上のJavaメソッドのセットを、プロセス定義に追加します。
Java Action、すなわち、1つ以上のJavaメソッドのセットを、デザイン時にプロセス定義自体、ノード、およびタイマーに追加することがで
きます。また、Error Java Action、もしくは、Compensate Java Actionを他のJava Actionに追加することもできます。
Java Actionは、プロセス実行の以下のポイントで呼び出すことができます。
・ プロセスの初期化時(初期化アクションおよびプロセスインスタンス所有者アクション)
・ プロセスの完了時(完了アクション)
・ アクティビティの開始前(開始アクションおよび役割アクション)
・ アクティビティの完了時(終了アクション)
・ タイマーの有効期限が切れるとき(タイマーアクション)
・ プロセスインスタンスが、破棄、一時停止、もしくは再開された場合(中止時アクション、一時停止時アクション、もしくは、再開時ア
クション)
・ プロセス実行に、エラーが発生した場合(エラーアクション)
・ Java Actionの実行時にエラーが発生した場合(エラーアクション、補償アクション)
・ リモートサブプロセスの起動に失敗した場合(Remote Subprocessノードのエラーアクション)
詳細については、「6.3.1 Java Actionsのタイプ」を参照してください。
Java Actionは、プロセスインスタンスが保持する情報内で実行されます。つまり、Java Actionは、UDAおよび特定のプロセスインスタン
スのそのほかの埋込み属性を読み込んだり、更新することができます。
注意
Java Actionでプロセスフローを操作するのであれば、Java Actionはプロセスインスタンスが保持する情報にServer Enactment Context API
からアクセスする必要があります。Model APIのインタフェースにはアクセスできません
例えば、以下の操作が可能です。
- 63 -
・ Interstage BPMが保持する情報の読取りだけの機能(値を比較するためなど)を拡張する。
この場合、Server Enactment Context APIを使用せずに、独自のJavaクラスを実装し、そのメソッドをJava Actionとして追加します。
この例は、「6.3.3 開始アクションの割当て」を参照してください。
・ 外部プログラム、または外部サービスからプロセスフローを操作する。
この場合、Server Enactment Context APIを使用して、独自のJavaクラスを実装し、そのメソッドをJava Actionとして追加します。
「6.3.2 Server Enactment Contextインタフェースを使用するワークフローデータへのアクセス」に、この例があります。
・ 既存のInterstage BPMの機能(built-in Java Action)からプロセスフローを操作する。
この場合、いずれかの組込みJava Actionを使用でき、新しいJavaクラスを実装する必要はありません。詳細については、「6.3.5 組込み
Java Action」を参照してください。
・ Java Actionの実行中にエラーが発生した場合の特定のエラー処理を定義する。詳細については、「6.3.9 Java Actionのエラー処
理」を参照してください。
・ リモートサブプロセスが起動しない場合の特定のエラーアクションを定義する。詳細については、「6.3.8 エラーJava Actionの使用」
を参照してください。
・ プロセスインスタンスが、破棄、一時停止、もしくは、再開された場合の処置をする。この例は、「6.3.5 組込みJava Action」を参照し
てください。
6.3.1 Java Actionsのタイプ
Java Actionインタフェースではプロセス定義におけるJavaメソッドを統合できます。統合されたJavaメソッドは、プロセスの実行中に実行
されます。Java Actionをプロセス定義の設計時に、プロセス定義に追加することができます。Java Actionは、初期化、所有者、完了、
中止時、再開時、一時停止時またはエラーアクションといったプロセス定義レベル、またはロール、開始、終了、中止時、再開時、一時
停止時、エラーまたはタイマーアクションといったノードレベルにおいて追加できます。さらに、補償アクションとエラーアクションは、Java
Actionレベルで追加できます。
Interstage BPMは、以下のJava Actionタイプを提供します。
・ 初期化アクションと所有者アクションは、プロセスの初期化時に実行されます。これらのJava Actionは、最初のアクティビティが実行
される前にユーザ定義属性データを初期化します。
・ 完了アクションは、プロセスの完了時に実行されます。これらのアクションを使用して、プロセスインスタンス全体のデータをクリーン
アップまたは分析できます。
・ 開始アクション。開始アクションは、アクティビティが開始される前に評価されます。したがって、このJava Actionを使用すると、特定
のノードが実行される前に、そのノードに関連付けられている値を設定または初期化できます。
・ 終了アクション。終了アクションは、ノードでの作業が終了し、プロセスインスタンスが別のノードに移動する前に実行されます。し
たがって、このJava Actionを使用すると、目的の作業が終了した後で、そのノードに関連付けられている値をクリーンアップまたは
分析できます。
・ ロールアクション。ロールアクションは、担当者が解決された後、タスクが割り当てられる前に評価されます。したがって、このJava Action
を使用すると、ユーザグループに関連付けられているタスクの担当者のリストを動的に計算できます。
・ タイマーアクションは、タイマーの日時や期限に到達したときに実行されます。
・ エラーアクション。エラーアクションを使用すると、プロセスの実行中に特定のエラー状態を処理できます。エラーアクションは、プ
ロセス定義全体、個別のノード、および他のJava Action(別のJava Actionの実行中に発生したエラーに対応する場合)に対して定
義できます。
・ 補償アクション。補償アクションは、Interstage BPM以外のシステム(外部データベースなど)にアクセスする別のJava Actionに対し
て定義できます。補償アクションは、トランザクションのクリーンアップおよびロールバック(外部データベースに新しく追加された行
を削除する場合など)を行い、トランザクションに参加している全システムを一貫した状態に保つために役立ちます。
・ 管理者がプロセスインスタンスの処理を中止、一時停止、または再開するコマンドを発行したときに、特別なタイプのアクションを直
ちに活性化することができます。このようなアクションは、以下のいずれかのアクションセットに属します。
- 一時停止時アクション
- 再開時アクション
- 64 -
- 中止時アクション
*時アクションは、プロセスインスタンスの状態が変更される前に実行されます。これらのアクションは、プロセス定義内の個別ノードまた
はプロセス定義全体に対する個別のアクティビティについて定義できます。
注意
Java Actionプログラムの際、プロセス定義、ノードまたは他のJava Actionを設定するときのみ、タイプを指定します。Java Actionインタ
フェースから使えるメソッドはどのタイプのJava Actionにも使うことができますが、Java Actionのタイプはランタイムにどのメソッドが実行
されるかを決定することを覚えておく必要があります。
6.3.2 Server Enactment Contextインタフェースを使用するワークフローデータへの
アクセス
Java Actionを使用してプロセスフローの処理ができます。その場合、Java ActionからServer Enactment Contextインタフェースを通じて
プロセスインスタンスコンテクストにアクセスする必要があります。
Server Enactment Contextインタフェースはワークフローデータへのアクセスを可能にし、サーバインタフェースとして実行されます
(com.fujitsu.iflow.server.intf.ServerEnactmentContext)。例として、以下のメソッドがあります。
・ addAttachment()
・ getAttachment()
・ getProcessOwners()
・ setProcessDescription()
有効なクラスやメソッドについての詳細は『API Javadocマニュアル』を参照してください。
Server Enactment Contextを使用するワークフローデータにアクセスするためには、以下の手順に従います。
1. お使いのJavaクラスを起案する場合は、以下の操作を行います。
a. ServerEnactmentContextインタフェースをインポートします。
b. Java Actionから呼び出したいメソッドのパラメータがServerEnactmentContextのタイプであることを確認します。
2. Java Actionを定義する場合は、お使いのメソッドに渡す値を指定します。ServerEnactmentContextパラメータの値としてsec ICを
使用します。
ランタイム時、Interstage BPMはこのインタフェースを含むオブジェクトをお使いのメソッドに渡します。
例
これはワークフローデータにアクセスする必要性を書き込む可能性のあるJavaメソッドの例です。太字はServer Enactment Contextイン
タフェースをインポートし使用する方法を示しています。
import com.fujitsu.iflow.server.intf.ServerEnactmentContext;
public class MyClass {
public void reassignIfTooExpensive(ServerEnactmentContext sec,
int amount) {
String[] employee = {"Employee1", "Employee2"};
String[] managers = {"Manager1", "Manager2"};
if (amount <= 5000)
sec.setActivityAssignees(employee);
else
sec.setActivityAssignees(managers);
}
}
これはJava Actionの定義方法です。太字は、コンテクストデータをお使いのメソッドに渡す方法を示しています。
JavaAction[] myAction = MyActionSet.createJavaActions(1);
myAction[0].setActionDescription("Decide on purchase requisition");
- 65 -
myAction[0].setActionName("RoutePurchaseRequisition");
myAction[0].setClassName("MyPackage.MyClass");
myAction[0].setMethodName("reassignIfTooExpensive(ServerEnactmentContext,
int)");
String[] args = new String[2];
args[0] = "sec";
args[1] = "uda.amount";
String params = Utils.combineParametersToXML(args);
myAction[0].setArgumentsUDANames(params);
MyActionSet.setJavaActions(myAction);
6.3.3 開始アクションの割当て
ここでは、開始アクションをActivityノードに割当てる方法の例を挙げます。使用するJava Actionは、サンプルクラスComplexPlanの一
部です。JavaActionインタフェースのsetClassPath()を使用して、サンプルクラスComplexPlanを参照します。
この例では、SampleJavaActionsが、UDA QtyとPriceの初期値を返す、開始アクションが定義されています。
これは、独自のJavaクラスを実装し、Server Enactment Context APIを使用せずに、Java Actionとしてのそのメソッドを追加します。
注意
Java Actionをプログラミングする場合、プロセス定義、ノード、もしくは、その他のJava Actionにタイプを設定する場合にのみ、タイプを
指定します。
JavaActionインタフェースで有効なメソッドはどのタイプのJavaActionにも使用することができますが、JavaActionのアクションは、ランタ
イム時に、どのメソッドを実行するかを決定するものであることに注意してください。
詳細については、『API Javadocマニュアル』を参照してください。
開始アクションをActivityノードに割当てる方法について説明します。
1. Activityノードを追加します。プロセス定義での1つ目のアクティビティ名は、protected final static String NODE_FILL_OUT_PR
= "Fill out Purchase Request"です。
protected final static String NODE_FILL_OUT_PR =
"Fill out Purchase Request";
Node fillOutNode = plan.addNode(NODE_FILL_OUT_PR,
Node.TYPE_ACTIVITY);
fillOutNode.setRole(SampleGroup);
fillOutNode.setPosition(new Point(450, 40));
2. WFObjectFactoryクラスのgetJavaActionSet()を使用して、新しいJavaActionSetオブジェクトを作成します。
JavaActionSet foPJavaActionSet =
WFObjectFactory.getJavaActionSet();
3. JavaActionSetに必要な数のJava Actionを生成します。
以下の例は、3つのJava Actionが生成されます。
JavaAction[] foPJavaActions =
foPJavaActionSet.createJavaActions(3);
4. Java Actionを定義します。
ここで定義するJava Actionは、初期量と金額を設定するJava Actionになります。
foPJavaActions[0].setActionDescription("Qtyの初期値を設定");
foPJavaActions[0].setActionName("load initial qty");
foPJavaActions[0].setMethodName("getInitialQty");
foPJavaActions[0].setClassName(CLASS_NAME_JAVA_ACTION);
- 66 -
foPJavaActions[0].setReturnValueUDAName("Qty");
...
foPJavaActions[1].setActionDescription("Priceの初期値を設定"
);
foPJavaActions[1].setActionName("load initial price");
foPJavaActions[1].setMethodName("getInitialPrice");
foPJavaActions[1].setClassName(CLASS_NAME_JAVA_ACTION);
foPJavaActions[1].setReturnValueUDAName("Price");
...
foPJavaActionSet.setActionSetDescription("UDA QtyとPriceの初期値を"
+ "設定する操作");
foPJavaActionSet.setActionSetName("Qty and Price Setter");
この例では、添付文書を作成するために、他の開始アクションが定義されています。発生する可能性のあるエラーの処置のた
め、エラーアクションはそのJava Actionで定義されています。詳細については、「6.3.9 Java Actionのエラー処理」を参照してくだ
さい。
5. JavaActionSetをActivityノードの開始アクションに割当てます。
foPJavaActionSet.setJavaActions(foPJavaActions);
fillOutNode. .setJavaActionSet(foPJavaActionSet,JavaActionSet.NODE_PROLOGUE);
Java Actionセットの内部コピーが作成され、Activityノードに保存されます。この先、Java Actionセットを変更しても、Activityノードに割
当てられたJava Actionには何の影響もありません。Activityノードを変更する場合は、Java Actionセットを修正し、再びActivityノードに
割当てる必要があります。
6.3.4 終了アクションの割当て
前提条件: 「6.3.3 開始アクションの割当て」に解説されているとおりにActivityノードが定義されている。
この例では、ComplexPlanが、UDA QtyとPriceから計算したTotalの金額を返す、終了アクションを定義します。終了アクションは、Activity
ノードに追加されます。
注意
Java Actionをプログラミングする場合、プロセス定義、ノード、他のJava Actionに設定するときのみJava Actionのタイプを指定します。
Java Actionのインタフェースで利用できるメソッドは、どのタイプのJava Actionでも使用できますが、Java Actionのタイプによって実行
中に実行されるメソッドは異なります。詳細については『API Javadocマニュアル』を参照してください。
終了アクションをActivityノードに追加する方法について説明します。
1. WFObjectFactoryクラスのgetJavaActionset()を使用して、新しい JavaActionSetオブジェクトを作成します。
JavaActionSet foEJavaActionSet =
WFObjectFactory.getJavaActionSet();
2. JavaActionSetに必要な数のJava Actionを生成します。
以下の例では、1つのJava Actionが生成されます。
JavaAction[] foEJavaActions =
foEJavaActionSet.createJavaActions(1);
3. Java Actionを定義します。CLASS_NAME_JAVA_ACTIONとCLASS_PATH_JAVA_ACTIONは、サンプルで定義している定
数です。
foEJavaActions[0].setActionDescription("Sets calculated total amount to UDA 'Total'");
foEJavaActions[0].setActionName("calculate Total");
foEJavaActions[0].setClassName(CLASS_NAME_JAVA_ACTION);
foEJavaActions[0].setClassPath(CLASS_PATH_JAVA_ACTION);
foEJavaActions[0].setMethodName("getTotal(float,int)");
foEJavaActions[0].setArgumentsUDANames("<E>uda.Price</E><E>uda.Qty</E>");
foEJavaActions[0].setReturnValueUDAName("Total");
- 67 -
foEJavaActionSet.setActionSetDescription("Operation to calculate total");
foEJavaActionSet.setActionSetName("Total Setter");
4. JavaActionSetをActivityノードのエピローグ部分に割当てます。
foEJavaActionSet.setJavaActions(foEJavaActions);
fillOutNode.setJavaActionSet(foEJavaActionSet,JavaActionSet.NODE_EPILOGUE);
6.3.5 組込みJava Action
Interstage BPMは、プロセスフローを操作するために、様々なJavaメソッドを提供しています。これらのメソッドは、実装する必要はなく、
Java Actionから直接呼び出すことができます。これらのメソッドは、組込みJava Actionと呼ばれています。
例えば、以下のような事前定義済Java Actionがあります。
・ JavaScriptを評価できるJava Action
具体例については、「6.3.6 JavaScript Java Action」を参照してください。
・ 外部データベースのデータを取得、更新するJava Action
・ Webサービスから情報を呼び出し、取得するJava Action
組込みJava Actionは、IflowActionsクラス(com.fujitsu.iflow.actions.IflowActions)で使用できます。
このクラスには、たとえば以下のメソッドがあります。
・ escalateActivity()
・ makeChoiceAction()
・ sendEmail()
使用可能なメソッドの詳細については、『API Javadocマニュアル』を参照してください。
Java ActionのIflowActionsは、適切なクラス名を指定して使用します。クラスパスは必要ありません。
例
太字のテキストは、IflowActionsクラスのメソッドを指定する方法を示しています。
JavaAction[] myAction = MyActionSet.createJavaActions(1);
myAction[0].setActionDescription("Decide on purchase requisition");
myAction[0].setActionName("MakeChoice");
myAction[0].setClassName("com.fujitsu.iflow.actions.IflowActions");
myAction[0].setMethodName("makeChoiceAction(String, long, ServerEnactmentContext)");
String[] args = new String[3];
...
Java Actionの定義の詳細については、「6.3.2 Server Enactment Contextインタフェースを使用するワークフローデータへのアクセス」を
参照してください。
6.3.6 JavaScript Java Action
JavaActionは、Javaができることであれば、何をするのも許可してくれる柔軟性がありますが、プロセスエンジンにアクセスするクラスは、
Javaプログラムをコンパイルする必要があるという難点があります。このため、JavaScriptを評価できる、特別なJavaScript JavaActionを
使用できます。JavaScriptでは、Javaでできることがすべて可能です。ただし、JavaScriptは実行するまでコンパイルされません。JavaScript
はプロセス定義内のソースフォームに保存されるので、外部に保存されている関連付けられたクラスファイルはありません。
JavaScriptは、Javaと非常に類似した構文を使用しますが、いくつかの違いがあります。たとえば、スクリプト環境では意味のある動的に
型付けされている変数などです。JavaScriptは、実際は、ソフトウェアに同梱されている“ECMA-262.PDF”(印刷可能ファイル)で説明さ
れている、ECMA標準です。同じServer Enactment Context APIをJavaScriptで使用できます。
さらに、特定の状況で繰り返し使用するスクリプト様式を実行する、カスタムJavaScriptExtentionを作成することもできます。
- 68 -
注意
メソッドがJavaScriptに使用したサイズは、Java Virtual Machine (JVM)によって制限される場合があります。現在、メソッドバイトコードサ
イズは65535バイト(64KBytes)に制限されています。より大きいサイズのメソッドを使用するとJVMはエラーを示し、再びJavaScriptを実
行する前にメソッドのサイズを減らす必要があります。
JavaメソッドをJavaScript内で呼び出す
標準のJavaScriptは、任意のJavaメソッドを呼び出すことができます。また、必要であれば、Javaオブジェクトを作成して、そのオブジェク
トでメソッドを呼び出し、ほかのJavaオブジェクトをパラメータとして渡すこともできます。
静的メソッドの呼び出しの例は、ScriptPlugIn.classにあります。
Packages.ScriptPlugIn.createFile(“C:¥¥temp¥¥test.txt”);
メンバーメソッドの呼出しの例は、JDBCPlugIn.classにあります。
x = new Packages.JDBCPlugIn();
var customer = uda.Customer;
var finish = x.findCustomer(customer);
6.3.7 アクティビティの作業者と関連
アクティビティの作業者
アクティビティがロールに割当てられたあと、ロールに含まれる人はそのアクティビティを操作することができるようになります。インスタ
ンスに対し、アクティビティがマネージャーロールに割当てられた場合、マネージャーグループのすべてのメンバーが、そのアクティビ
ティを操作することができます。しかし、実際には、一人のマネージャーだけがそのアクティビティを実行することになります。マネー
ジャーは、そのアクティビティの作業者と呼ぶことができます。
アクティビティが実行されたあと、作業フローによっては、誰がアクティビティで作業するかを決定したい場合があるかも知れません。そ
して、その情報に基づいた対応をとりたいと考えるでしょう。
例えば、“カスタマーサポートの幹部社員”ロールに割当てられた“カスタマー案件の記録”というアクティビティを考えます。まず、ど
の“カスタマーサポートの幹部社員”が、“カスタマー案件の記録”というアクティビティを実際に行ったかを確認する必要があります。次
に、プロセスインスタンス中の“案件のエスカレート”という次のアクティビティに、同じ作業者を割当てることが求められるでしょう。
アクティビティの作業者の決定
com.fujitsu.iflow.server.intfパッケージのServerEnactmentContextインタフェースには、アクティビティの作業者を決定するために使用する
getActivityActor()というメソッドが含まれています。
getActivityActor()メソッドは、パラメータとしてアクティビティノードの名前を与えることで、完了したアクティビティノードの作業者を取得
することができます。Voting Activityノードは、このメソッドをサポートしていません。
注意
プロセスインスタンスの中のすべてのアクティビティノードに一意な名前を設定することをお勧めします。通過したノードに同じ名前のも
のが存在する場合、このメソッドは例外を返します。
次のサンプルは、Activity A の作業者を取得し、現在のアクティビティにその作業者を割当てています。
public void assignActivityActor(ServerEnactmentContext sec){
String[] actor = new String[1];
actor[0] = sec.getActivityActor("Activity A");
sec.setActivityAssignees(actor);
}
- 69 -
注意
JavaScriptの一部として定義されたJavaActionで、このメソッドを呼ぶ必要があります。(「6.3.2 Server Enactment Contextインタフェース
を使用するワークフローデータへのアクセス」を参照してください。)。このメソッドの詳細は、『API Javadocマニュアル』を参照してくださ
い。
関連
ある作業フローでは、アクティビティの作業者に対する階層関係やUDAの値を参照して、作業を割当てることがあります。例えば、“会
社名”というUDAに、“富士通”という値が設定されている場合、富士通というキーの“経営者”であることを確かめて、経営者だけを、特
定のアクティビティに割当てることができます。また、あるアクティビティに、Jimと呼ばれる作業者が割当てられているとき、Jimのマネー
ジャーが誰か探し出し、特定のアクティビティにそのマネージャーを割当てることができます。
関連の決定
com.fujitsu.iflow.server.intfパッケージに含まれるServerEnactmentContextのresolveRelationship()メソッドを使用して、関係を決定しま
す。
resolveRelationship()メソッドは、パラメータとして基になる値と関連を使うことによって目標の値を返します。このメソッドは、ソースの値、
関連、ターゲットの値をあらかじめ定義しておくことで、機能します。これにより、このメソッドは適切な値を返すことができます。
ソースの値
関連
ターゲットの値
Jim
manager
Robert
Jim
assistant
Arthur
Fujitsu
executive
Bob
例えば、resolveRelationship("assistant", "Jim")はArthurを返します。
ソースの値 - 関連 - ターゲットの値のマッピングは、ディレクトリサービスまたはローカルユーザストアのユーザプロファイルとして格納し
なければなりません。ここで、ソースの値はユーザID、関連はユーザ属性の名、ターゲットの値はユーザ属性の値となります。ユーザプ
ロファイルを作成するためには、『API Javadocマニュアル』のcom.fujitsu.iflow.model.workflowパッケージに含まれるDirectoryServices
インタフェースを参照してください。
ソースの値には、人および人以外のもの(会社名やグループ名)を設定することができます。人以外のオブジェクトのユーザプロファイ
ルをディレクトリサーバやローカルユーザストアに追加する場合は、ログインする目的で使用されないことに注意してください。
次のサンプルでは、"Activity A"の作業者とその作業者のManagerを取得して、現在のアクティビティにそのManagerを割当てます。
public void assignManagerOfActivityActor(ServerEnactmentContext sec){
String[] managers =
sec.resolveRelationship("Manager",sec.getActivityActor("Activity A"));
sec.setActivityAssignees(managers);
}
注意
JavaScriptの一部として定義されたJavaActionで、このメソッドを呼ぶ必要があります。(「6.3.2 Server Enactment Contextインタフェース
を使用するワークフローデータへのアクセス」を参照してください。)このメソッドの詳細は、『API Javadocマニュアル』を参照してくださ
い。
6.3.8 エラーJava Actionの使用
エラーJava Actionはエラーが起こったときにプロセスインスタンスの動作の決定や特定のエラーを処理するのに使われます。エラー処
理の定義をしないと、プロセスインスタンスはどこで発生したかに関わらず、例外が起こるとすぐにエラー状態になります。例:リモートサ
ブプロセスの開始が失敗した場合、メール送信ができない場合など。
エラーJava Actionはいろいろなレベルで定義されます。
- 70 -
・ プロセス定義レベル:これらのエラーJava Actionセットはいかなるエラーの場合でもエラーの度合いやエラーが発生するアクティビ
ティにかかわらず実行されます。プロセス定義レベルで定義されたエラーJava Actionセットはプロセスインスタンスがエラー状態に
入る直前に実行されます。そのようなエラーアクションはプロセスインスタンスの動作に影響できないことに注意してください。プロ
セス定義レベルのエラーアクションは、例えば通知メールの送信やログファイルに追加情報を書くのに使用される可能性がありま
す。
・ ノードレベル(Remote Subprocessノード):リモートサブプロセスが開始に失敗すると、このレベルのエラーJava Actionセットは活性
化されます。例:「6.17.3 リモートサブプロセスのエラー処理」を参照してください。
・ Java Actionレベル:このレベルのエラーJava Actionセットは関連する「通常」のJava Actionで例外が起こると実行されます。エラー
Java ActionはすべてのJava Actionsのタイプに定義できます。(例:Java Actionの開始、終了、タイマー、中止)ただし、エラーまた
は補償アクション自体を除きます。Java Actionsへのエラーアクションの割当てについては、「6.3.9 Java Actionのエラー処理」を参
照してください。
以下は、プロセス定義にエラーJava Actionを割り当てる例です。使用されているJava Actionsは、ComplexPlanクラスの一部です。
以下は、プロセス定義に中止時アクションの割り当てる例です。使用されているJava Actionは、例のクラスComplexPlanの一部です。
プロセス定義レベルでエラーJava Actionセットを定義するためには、以下の手順に従います。
1. WFObjectFactoryクラスからgetJavaActionSet()を使い、新しいJavaActionSetオブジェクトを作成します。
JavaActionSet plErrorJavaActionSet =
WFObjectFactory.getJavaActionSet();
2. Java ActionセットのJava Actionsの必要数を生成します。
以下の例では1つのJava Actionが生成されています。
JavaAction[] plErrorJavaAction =
plErrorJavaActionSet.createJavaActions(1);
3. Java Actionを定義します。
plErrorJavaAction[0]
.setActionName("WriteLogEntryWithException");
plErrorJavaAction[0]
.setActionDescription("Writes a log entry with exception");
plErrorJavaAction[0]
.setMethodName("writeLogEntryWithException(String,ServerEnactmentContext)");
plErrorJavaAction[0]
.setClassName(CLASS_NAME_JAVA_ACTION);
plErrorJavaAction[0]
.setClassPath(CLASS_PATH_JAVA_ACTION);
plErrorJavaAction[0]
.setArgumentsUDANames("<E>uda.ProcessLevelErrorLogEntry</E><E>sec</E>");
plErrorJavaActionSet.setJavaActions(plErrorJavaAction);
4. プロセス定義にJava Actionセットを割り当てます。
plan.setJavaActionSet(plErrorJavaActionSet,
JavaActionSet.PLAN_ERROR);
6.3.9 Java Actionのエラー処理
Java Actionの実行中にエラーが発生した場合は、例外がスローされます。Interstage BPMでは、Java Actionのエラーに対して独自の
エラー処理を定義できます。これにより、例外がスローされたときにプロセスインスタンスがエラー状態になることを防止できます。
また、トランザクションがロールバックされてプロセスインスタンスがエラー状態に設定される前に「クリーンアップ」を実行するJava Action
を定義することもできます。これには、Java Actionセット内のすべてのJava Actionのロールバックが含まれます。プロセスインスタンスが
エラー状態に設定される前に、エラー発生時の通知メールの送信などの一般的なアクションを実行したり、何らかの特別なアクション
を実行することができます。
Interstage BPMには、Java Actionのエラーを処理する以下のオプションが用意されています。
- 71 -
・ 補償アクション:補償アクションは、システムをクリーンアップし、トランザクションに関連するすべてのシステム(外部データベースや
メールサーバなど)を一貫した状態に保ちます。補償アクションは、外部システムが関係する場合に特に役立ちます。
Java Actionに対してエラー処理を定義しない場合、このJava Actionで例外がスローされたときは、トランザクションがロールバックさ
れます。ただし、ロールバックは、Interstage BPMアプリケーションサーバのコンテキストでの変更に対してのみ実行されます。外部
システムでのすべてのトランザクション(外部データベースに行が追加されるなど)は、ロールバックされません。このため、場合に
よっては、トランザクションで使用されたすべてのシステムを一貫した状態に保つために、外部システムを手動でクリーンアップす
る必要があります。必要な場合は、補償アクションセットを使用できます。
アクションセット内の任意のJava Actionに対して補償アクションを指定できます。補償アクションは、たとえば新しくデータベースに
追加された行を削除したり、追加のメールを送信するような場合に役立ちます。通常のJava Actionセットで例外が発生した場合
は、例外がスローされる前に、正常に実行されたすべてのJava Actionに対して定義されているすべての補償アクションが逆の順序
で呼び出されます。
注意
補償アクションを別の補償アクションに埋め込むことはできません。補償アクションが例外をスローした場合、プロセスインスタンス
は直ちにエラー状態になり、残りの補償アクションの実行は中止されます。
詳細については、以下のサンプルを参照してください。
・ エラーアクション:Java Actionレベルで、関係する通常のJava Actionから例外がスローされると、エラーアクションセットが活性化し
ます。エラーアクションは、他のすべてのアクションセットと同様に、アクションセット内にまとめられています。エラーアクションは、ア
クションセット内の任意のアクションに対して指定できます。ただし、エラーアクションで発生した例外を処理するためのエラーアク
ションは定義できません。
詳細について「6.3.8 エラーJava Actionの使用」と以下のサンプルを参照してください。
続行設定
エラーアクションはエラーが見つかると、プロセス実行を続けるかどうかの決定をします。この動作は続行設定「対象とする
Exception」によって定義されます。
正しく設定されると例外は見つかり、定義されたエラーアクションが実行された後にプロセスインスタンスの実行を続行します。
誤って設定されると、定義されたすべての補償アクションが実行され、その後プロセスインスタンスはエラー状態になります。
異なった「catchException」を設定された複数のエラーアクションがあった場合、falseがtrueを上書きし、一つのエラーアクションが
「catchException」をfalseに設定されると即座にプロセスインスタンスがエラー状態になります。
例外クラス
続行設定に加えて、ActivityノードレベルとJava Actionレベルでのエラーアクションは、どの例外にエラーアクションが反応するか
を決定します。具体的な例外クラスを特定することができます(デフォルトは、java.lang.Exception。起こった例外がこの特定の例外
クラスのインスタンスかサブクラスであるときにだけ、エラーアクションが実行されます。
注意
エラーアクションが例外をスローした場合、トランザクションは直ちにロールバックされ、プロセスインスタンスはエラー状態になりま
す。このような場合に対するエラーアクションを定義することはできません。
いかなるJava Actionセットも複数のJava Actionsを含むことができます。それぞれのJava Actionに関しては、エラーアクションおよび補
償アクションを定義できます。詳細については「6.3.10 エラーの場合のJava Action構造と実行プラン」を参照してください。
補償アクションのJava Actionへの定義および割当て
以下のサンプルは別のJava Actionの実行が失敗した場合に実行される補償Java Actionを定義します。管理者にはメールで初期量の
取得が失敗した場合に通知されます。この取得はFillOutActivityノードのための開始アクションとして実行される別のJava Actionで定
義されます。ComplexPlan.javaサンプルの中にこのサンプルの全体コードがあります。メール送信で初期量を取得するメソッドは
SampleJavaActionsのサンプルで定義します。
補償Java Actionセットを定義、割り当てるには、以下の操作を行います。
- 72 -
1. WFObjectFactoryクラスからgetJavaActionSet()を使用し、新しいJavaActionSetオブジェクトを作成します。
JavaActionSet compensateJavaActionSet =
WFObjectFactory.getJavaActionSet();
2. JavaActionSetにJava Actionsの必要な数を生成します。以下の例では、一つのJava Actionが生成されています。
JavaAction[] compensateJavaAction =
compensateJavaActionSet.createJavaActions(1);
3. Java Actionを定義します。sendEmail()メソッドがSampleJavaActionsのサンプルで定義されることに注意します。
compensateJavaAction[0].setActionName("Send a notification mail");
compensateJavaAction[0]
.setActionDescription("Send notification mail to administrator");
compensateJavaAction[0].setMethodName
("sendEmail(String, String, String, String, String, String,
ServerEnactmentContext)");
compensateJavaAction[0].setClassName(CLASS_NAME_JAVA_ACTION);
compensateJavaAction[0].setArgumentsUDANames
("<E>uda.MailTo</E><E>uda.MailFrom</E>
<E>uda.MailCc</E><E>uda.MailBcc</E><E>uda.MailSubject</E>
<E>uda.MailBody</E><E>sec</E>");
4. 初期量を取得するJava Actionに補償JavaActionを追加します。このJava ActionはFillOutActivityノードの開始Java Actionセット
の一部です。ComplexPlan.javaのサンプル内にすべての定義があります。
....
JavaActionSet foPJavaActionSet = WFObjectFactory.getJavaActionSet();
JavaAction[] foPJavaActions = foPJavaActionSet.createJavaActions(3);
foPJavaActions[0]
.setActionDescription("Sets initial value for Qty");
foPJavaActions[0].setActionName("load initial qty");
foPJavaActions[0].setMethodName("getInitialQty");
foPJavaActions[0].setClassName(CLASS_NAME_JAVA_ACTION);
foPJavaActions[0].setReturnValueUDAName("Qty");
foPJavaActions[0].setJavaActionSet(compensateJavaActionSet,
JavaActionSet.ACTION_COMPENSATE);
....
Defining and Assigning Error Actions to a Java Action
以下のサンプルは関連するJava Actionの実行が失敗した場合に実行されるエラーアクションセットを定義します。 エントリはログファイ
ルに書き込まれ、プロセスインスタンスの処理は添付を追加できない場合に続行されます。添付追加のメソッドはSampleJavaActionsサ
ンプルで定義されます。このJava ActionはFillOutActivityノードの開始アクションとして実行されます。ComplexPlan.javaサンプル内に
このサンプルの全体コードがあります。
エラーJava Actionセットを定義、割り当てするには、以下の操作を行います。
1. WFObjectFactoryのクラスからgetJavaActionSet()を使用して、新しいJavaActionSetオブジェクトを作成します。
JavaActionSet errorJavaActionSet =
WFObjectFactory.getJavaActionSet();
2. JavaActionSetのJava Actionsの必要数を生成します。以下の例では、二つのJava Actionsが生成しています。
JavaAction[] errorJavaActions =
errorJavaActionSet.createJavaActions(2);
3. Java Actionを定義します。addAttachment()メソッドがSampleJavaActionsのサンプルで定義されることに注意します。
errorJavaActions[0]
.setActionDescription("Writes a log entry with exception");
errorJavaActions[0]
- 73 -
.setMethodName("writeLogEntryWithException(String,ServerEnactmentContext)");
errorJavaActions[0].setClassName(CLASS_NAME_JAVA_ACTION);
errorJavaActions[0]
.setArgumentsUDANames("<E>uda.ProcessLevelErrorLogEntry</E><E>sec</E>");
errorJavaActions[0].setCatchException(true);
errorJavaActions[1].setActionName("Continue process");
errorJavaActions[1].setActionDescription("Catches FileNotFoundExceptions
and continues the execution of the process");
errorJavaActions[1].setMethodName("noop()");
errorJavaActions[1]
.setClassName("com.fujitsu.iflow.actions.IflowActions");
errorJavaActions[1]
.setEditorClassName("com.fujitsu.iflow.actions.IflowActions");
errorJavaActions[1]
.setCatchException(true);
4. 添付を追加するJava Actionに上のエラーJava Actionセットを追加します。このJava ActionはFillOutActivityノードの開始Java Action
セットの一部です。ComplexPlan.javaのサンプル内の全体の定義があります。
....
foPJavaActions[2].setJavaActionSet(errorJavaActionSet,
JavaActionSet.ACTION_ERROR);
...
6.3.10 エラーの場合のJava Action構造と実行プラン
ここでは補償アクションセット、エラーアクションセットを含むJava Actionセットで可能な構造について説明します。さらに、Java Actionに
発生するどんなエラーにどのアクションがどのオーダーで実行されるかを示します。
「通常」のJava Actionセットは複数のJava Actionsから成り立っています。さらに、Java Actionセット (例:開始Java Actionセット)で「通常」
のJava Actionによって起きた例外処理にエラーJava Actionを定義できます。「通常」のJava Actionセットの実行が例外を起こし、外部
のシステムのロールバックが必要な場合にアクティブになる「通常」のJava Actionセットの補償アクションセットを定義できます。
- 74 -
図6.1 Java Actionセットの構造
通常のJava Actionセットの例
2つのJava Actions(JA_1とJA_2)を包括する開始Java Actionセットを定義したと仮定します。
・ JA_1: 一つのエラーJava ActionとエラーJava Actionセット (EJA_JA_1)と二つの補償Java Actionsと補償Java Actionセット
(CJA_1_JA_1とCJA_2_JA_2)が定義されています。
- 75 -
・ JA_2: 二つのエラーJava Action(EJA_1_JA_2とEJA_2_JA_2)とエラーJava Actionセットは定義されていますが、補償Java Action
セットも利用可能ではありません。
図6.2 通常のJava Actionセット
エラーの場合の実行プラン
以下の表は複数のエラー状態のリストです。エラーの場合にどのJava Actionsが実行されるかを説明しています。
状態
結果
JA_1が、FileNotFoundExceptionをスロー。
この状態ではエラーアクションが定義されていないため、プロセスインスタンス
はエラー状態に入ります。
JA_1が、NullPointerExceptionをスロー。
例外が見つかり、EJA_JA_1が実行されます。プロセスインスタンスが続行し、
すなわち、JA_2が実行されます、その後、トランザクションがコミットされます。
JA_1が、正しく実行。
NullPointerExceptionがjava.lang.Exceptionのサブクラスなので、EJA_1_JA_2
は実行されます。例外が見つかりトランザクションはコミットされプロセスインス
タンスは続行されます。
JA_2が、NullPointerExceptionをスロー。
JA_1が、正しく実行。
FileNotFoundExceptionがjava.lang.Exceptionとjava.io.IOException
JA_2が、NullPointerExceptionをスロー。
のサブクラスなので、EJA_1_JA_2とEJA_2_JA_2は実行されます。 しかし、
EJA_2_JA_2でエラー状態へ遷移するを設定しています。 この設定は
EJA_1_JA_2の設定をオーバーライドします。
よって、二つのエラーアクションの実行後、プロセスインスタンスがエラー状態
になる前に補償アクションCJA_1_JA_1とCJA_2_JA_1が実行されます。
JA_1とJA_2が正しく実行。
エラーも補償アクションも実行されません。プロセスインスタンスは通常状態の
ままです。
- 76 -
詳細は、「6.3.9 Java Actionのエラー処理」および「6.3.8 エラーJava Actionの使用」を参照してください。
6.3.11 中止時、一時停止時、および再開時アクションの使用
Interstage BPM管理者が一時停止、再開、中止コマンドを呼び出し、プロセスインスタンスの状態が変わる前に一時停止時、再開時、
および中止時アクションは特定のアクション実行に使用します。
他のJava Actionセット同様、中止時、再開時、および一時停止時アクションセットは複数のJava Actionを含むことができます。それぞ
れのセットはノードレベル上およびプロセス定義レベル上で定義できます。中止、一時停止、再開コマンドが出たときに、それぞれのア
クティビティが活性化している場合のみ、最初にノードレベルアクションセットがいつも実行されます。プロセス定義レベルアクションセッ
トはコマンドが出されるときに活性化したアクティビティに関わらず実行されます。
以下は、プロセス定義に中止時アクションの割り当てる例です。使用されているJava Actionは、ComplexPlanクラスの一部です。例のクラス
ComplexPlanを参照するにはJavaActionインタフェースからsetClassName()を使用します。
中止Java Actionセットをプロセス定義レベルに設計して、割り当てるには、以下の手順に従います。
1. WFObjectFactoryクラスからgetJavaActionSet()を使用し、新しいJavaActionSetオブジェクトを作成します。
onAbortJavaActionSet = WFObjectFactory.getJavaActionSet()
2. JavaActionSetのJava Action必要数を生成します。
以下の例では、一つのJava Actionが発生しています。
JavaAction[] onAbortJavaAction =
onAbortJavaActionSet.createJavaActions(1);
3. Java Action Setを定義します。
onAbortJavaAction[0].setActionName("WriteLogEntry");
onAbortJavaAction[0].setActionDescription("Writes a log entry if process is aborted");
onAbortJavaAction[0].setMethodName("writeLogEntry(String)");
onAbortJavaAction[0].setClassName(CLASS_NAME_JAVA_ACTION);
onAbortJavaAction[0] .setArgumentsUDANames("<E>uda.OnAbortLogEntry</E>");
onAbortJavaActionSet.setJavaActions(onAbortJavaAction);
4. プロセス定義にJavaActionSetを割当てます。
plan.setJavaActionSet(onAbortJavaActionSet,
JavaActionSet.PLAN_ABORT);
6.4 フィルターとソートのAPI
プロセス定義、プロセスインスタンス、およびワークアイテムのリストを、プロセス定義名、プロセスの起案者、ワークアイテム名、および
そのほかの様々なフィールドでフィルターすることができます。この機能を使用して、特定のフィルター条件に一致するリストを取得す
ることができます。たとえば、起案者が「ユーザX」のすべてのプロセスインスタンスを取得する、または「注文」というタイトルのプロセス
インスタンスから作成されたすべてのワークアイテムを取得する、といったフィルター条件を設定できます。複数のフィールドでフィル
ターすることもできます。フィールドのテーブルおよび有効なリストについては、次の節で解説します。
6.4.1 WFObjectListインタフェース
このインタフェースは、有効なフィルターを使用してリストをフィルターおよびソートするために使用することができるフィールドを識別す
る定数を提供します。以下にその例を示します。
フィルター
Filter.AllPlans
Filter.MyPlans
リストのフィールド
LISTFIELD_APPLICATION_IDENTIFIER
LISTFIELD_PLAN_ID
LISTFIELD_PLAN_NAME
LISTFIELD_PLAN_OWNER
- 77 -
説明
アプリケーションID
プロセス定義ID
プロセス定義名
プロセス定義の所有者
フィルター
リストのフィールド
説明
LISTFIELD_PLAN_STATE
LISTFIELD_PLAN_IDENTIFIER
プロセス定義の状態
プロセス定義の識別子
Filter.AllProcesses
Filter.AllActiveProcesses
Filter.MyProcesses
Filter.MyActiveProcesses
Filter.MyInactiveProcesses
Filter.AllInactiveProcesses
Filter.AllProcessesInErrorState
LISTFIELD_APPLICATION_IDENTIFIER
LISTFIELD_PLAN_ID
LISTFIELD_PLAN_NAME
LISTFIELD_PLAN_IDENTIFIER
LISTFIELD_PROCESSINSTANCE_ID
LISTFIELD_PROCESSINSTANCE_STATE
LISTFIELD_PROCESSINSTANCE_INITIA
TOR
LISTFIELD_PROCESSINSTANCE_PRIORI
TY
LISTFIELD_PROCESSINSTANCE_NAME
LISTFIELD_PROCESSINSTANCE_TITLE
LISTFIELD_PROCESSINSTANCE_PAREN
TID
LISTFIELD_PROCESSINSTANCE_CREAT
EDTIME
LISTFIELD_PROCESSINSTANCE_CLOSE
DTIME
LISTFIELD_PROCESSINSTANCE_OWNE
R
アプリケーションID
プロセス定義ID
プロセス定義名
プロセス定義ID
プロセスインスタンスID
プロセスインスタンスの状態
プロセスインスタンスの開始
プロセスインスタンスの優先度
プロセスインスタンス名
プロセスインスタンスタイトル
プロセスインスタンスの親プロセスID
プロセスインスタンスの作成日
プロセスインスタンスの終了日
プロセスインスタンスの所有者
Filter.AllWorkItems
Filter.AllInactiveWorkItems
Filter.MyWorkItems
Filter.MyAcceptedWorkItems
Filter.MyActiveWorkItems
Filter.MyDeclinedWorkItems
LISTFIELD_APPLICATION_IDENTIFIER
LISTFIELD_PLAN_ID
LISTFIELD_PLAN_NAME
LISTFIELD_PLAN_IDENTIFIER
LISTFIELD_PROCESSINSTANCE_ID
LISTFIELD_PROCESSINSTANCE_STATE
LISTFIELD_PROCESSINSTANCE_NAME
LISTFIELD_PROCESSINSTANCE_TITLE
LISTFIELD_PROCESSINSTANCE_INITIA
TOR
LISTFIELD_PROCESSINSTANCE_PRIORI
TY
LISTFIELD_PROCESSINSTANCE_CREAT
EDTIME
LISTFIELD_WORKITEM_ID
LISTFIELD_WORKITEM_ASSIGNEE
LISTFIELD_WORKITEM_STATE
LISTFIELD_WORKITEM_CREATEDTIME
LISTFIELD_WORKITEM_DUEDATE
LISTFIELD_WORKITEM_PRIORITY
LISTFIELD_WORKITEM_NAME
LISTFIELD_WORKITEM_ACTIVITYINST
ANCEID
アプリケーションID
プロセス定義ID
プロセス定義名
プロセス定義識別子
プロセスインスタンスID
プロセスインスタンス状態
プロセスインスタンス名
プロセスインスタンスタイトル
プロセスインスタンスの開始
プロセスインスタンスの優先度
プロセスインスタンスの作成日
ワークアイテムID
ワークアイテムの割当て
ワークアイテムの状態
ワークアイテムの作成日
ワークアイテムの期限
ワークアイテムの優先度
ワークアイテム名
ワークアイテムアクティビティインスタ
ンスID
Filter.AllArchivedPlans
LISTFIELD_PLAN_ID
LISTFIELD_PLAN_NAME
プロセス定義ID
プロセス定義名
Filter.AllArchivedProcesses
LISTFIELD_PLAN_ID
LISTFIELD_PROCESSINSTANCE_ID
LISTFIELD_PROCESSINSTANCE_NAME
プロセス定義ID
プロセスインスタンスID
プロセスインスタンス名
Filter.MyFutureWorkItems
Filter.AllFutureWorkItems
LISTFIELD_APPLICATION_IDENTIFIER
LISTFIELD_PLAN_ID
LISTFIELD_PLAN_NAME
LISTFIELD_PLAN_IDENTIFIER
アプリケーションID
プロセス定義ID
プロセス定義名
プロセス定義識別子
- 78 -
フィルター
リストのフィールド
説明
LISTFIELD_PROCESSINSTANCE_ID
LISTFIELD_PROCESSINSTANCE_STATE
LISTFIELD_PROCESSINSTANCE_NAME
LISTFIELD_PROCESSINSTANCE_TITLE
LISTFIELD_PROCESSINSTANCE_INITIA
TOR
LISTFIELD_PROCESSINSTANCE_PRIORI
TY
LISTFIELD_PROCESSINSTANCE_CREAT
EDTIME
LISTFIELD_WORKITEM_ID
LISTFIELD_WORKITEM_ASSIGNEE
LISTFIELD_WORKITEM_PRIORITY
LISTFIELD_WORKITEM_NAME
LISTFIELD_WORKITEM_ACTIVITYINST
ANCEID
プロセスインスタンスID
プロセスインスタンス状態
プロセスインスタンス名
プロセスインスタンスタイトル
プロセスインスタンスの開始
プロセスインスタンスの優先度
プロセスインスタンスの作成日
ワークアイテムID
ワークアイテムの割当て
ワークアイテムの優先度
ワークアイテム名
ワークアイテムアクティビティインスタ
ンスID
以下の定数は、ソート順を示します。
・ SORTORDER_ASCENDING(昇順)
・ SORTORDER_DESCENDING(降順)
以下の定数は、SQLの演算子を示します。
・ SQLOP_EQUALTO (一致する)
・ SQLOP_GREATERTHAN(以上)
・ SQLOP_LESSTHAN(以下)
・ SQLOP_GREATERTHANOREQUALTO(より大きい)
・ SQLOP_LESSTHANOREQUALTO(より小さい)
・ SQLOP_NOTEQUALTO(一致しない)
・ SQLOP_LIKE(部分一致)
・ SQLOP_NOTLIKE(部分一致しない)
・ SQLOP_IN(含む)
フィルターを使用した例は、「5.3.3 ワークアイテムリストの作成」、「7.4.1 プロセス定義リストの作成」、および「7.5.1 プロセスインスタンス
リストの作成」を参照してください。
6.4.2 フィルターとソートのメソッド
フィルターおよびソートを行うには、以下のメソッドを利用します。これらのメソッドの利用方法を次節で示しています。
・ addFilter(): 取得するリストに対するフィールドを識別する定数のフィルター条件を追加します。パラメータに渡される値は、“where <
リストのフィールドの列名> <SQL演算子> <指定する値>”という書式で記述します。
・ addFilter(): 取得するリストに対するUDAによるフィルター条件を追加します。パラメータに渡される値は、“where <UDA> <SQL演算子
> <指定する値>”という書式で記述します。
・ addSortOrder(): 取得するリストに対するフィールドを識別する定数のソート順を追加します。
・ addSortOrder(): 取得するリストに対するUDAによるソート順を追加します。
・ getNextBatch(): openBatchedList()で取得したオブジェクトのリストを引数batchSizeの数だけ返します。最後に取得するリストの数
は、引数batchSizeより小さい可能性があります。リスト内に返すエレメントが無い場合、nullが返されます。
詳細については、『API Javadocマニュアル』を参照してください。
- 79 -
6.4.3 メソッドの呼び出し手順
以下のサンプルは、メソッドの呼び出し順序を示しています。
wfol = WFObjectFactory.getWfObjectList()
wfol.addFilter(…)
wfol.addSortOrder(…)
Object[] listElements = null;
int batchSize = 10;
wfol.openBatchedList(…)
while ((listElements = wfol.getNextBatch(batchSize)) != null) {
// process elements in listElements array
}
openBatchedList()の呼出しは、addFilter()、addSortOrder()のいずれかを呼出した後かつ、getNextBatch()を呼出す前であることを確認
します。メソッドがほかの順序で呼び出された場合、WFObjectListの動作は保証されません。
6.4.4 リストに使用するUDAの識別
プロセス定義、プロセスインスタンス、およびワークアイテムのリストをUDAの値でフィルターすることができます。ユーザはUDAの値に
基づいたフィルター条件に一致するリストを取得することができます。たとえば、「UDAの変数の値が指定の値より大きいワークアイテ
ムをすべて取得 > 5000.*」などの条件です。それには、UDAにWorkListUDAフラグが設定されていることを確認してください。プロセ
ス定義をデザインするときに、DataItemRefインタフェースのmarkAsWorkListUDA()を使用して、このフラグを設定できます。詳細につ
いては、「6.7.2 ワークリストUDA」を参照してください。
上記のように識別されていないUDAを使用してリストのフィルターやソートを行った場合、リストの動作は保証されません。
6.4.5 ソートとフィルター
リストは、フィールドを組み合わせてソートしたり、フィルターしたりすることができますが、以下の制限があります。
フィールドを識別する定数のソートと、UDAによるソートは同時に指定することができません。
以下の表は、フィールドまたはUDAフィルタ、およびソート順の有効な組み合わせを示しています。
1つのUDAフィルター
1つのUDAソート順
1つ以上のフィールドフィ 1つ以上のフィールドソー
ルター
ト順
1つのUDAフィルター
-
1つのUDAソート順
同一(注)*
-
1つ以上のフィールド
フィルター
有効
有効
-
1つ以上のフィールド
ソート順
有効
無効
有効
-
注: ソートとフィルターの両方が同一のUDA上で行われる必要があります。
6.4.6 バッチ処理の注意点
バッチでリストを取得することができます。データベース内のレコード数が多い場合、数件のレコードが必要な場合でも、リストを開くに
は時間がかかります。openBatchedListおよびgetNextBatch(int howMany)を使用して、リストをバッチで取得することができます。バッチ
処理は、フィルターとソートが影響します。すなわち、Interstage BPMは、フィルターおよびソートしたリストのバッチを取得します。目的
の結果を取得するには、「6.4.3 メソッドの呼び出し手順」の手順に従ってください。
注意
フィルターやソートを使用した場合、バッチの取得スピードとリスト全体の取得スピードは、フィルターやソートに使用したフィールドまたは
UDAの値の分散によって異なります。値の分散が高いほど、バッチを使用することによって効率性が高まります。
- 80 -
たとえば、プロセスインスタンスのリストがプロセス名でソートされていて、すべてのプロセスインスタンスが同じプロセス名の場合は、内
部的にバッチを取得すると、リスト全体を取得するよりも効率性が低くなります。それに対して、ほとんどのプロセスインスタンスが違うプ
ロセス名だった場合は、バッチを使用することによって効率性が高まります。
6.4.7 リストの更新通知
リストの更新通知は、ワークリストなどの更新をユーザに通知する機能です。バッチ、フィルター、ソート順などを使用していないリストに
対してサポートしています。以下のメソッドは、リストの更新通知機能を使用している場合にModelExceptionを送出します。
・ addFilter()
・ addSortOrder()
・ getNextBatch()
6.5 複数オブジェクトの情報の一括取得
WFDetailsListインタフェースを使用すると、複数のオブジェクトに関する情報を効率的に一括して取得できます。この機能は、一括処
理とも呼ばれます。
現在、インタフェースには、次の処理を行うメソッドがあります。
・ 複数のプロセスインスタンスのユーザ定義属性(UDA)の一括取得
・ 複数のワークアイテムの外向き矢印の一括取得
ここでは、このインタフェースの使用方法の一般的な手順を説明します。複数のプロセスインスタンスのUDAを取得するプログラムの例
を挙げます。完全なプログラムコードはサンプルファイルBatchDetailsRetrieval.javaにあります。このサンプルファイルには、複数のワー
クアイテムの外向き矢印を取得する方法の例も含まれています。
複数のプロセスインスタンスのUDAを一括取得するには、以下の手順に従います。
1. UDAを取得したいプロセスインスタンスのIDのリストを用意します。そのためには、WFObjectListインタフェースが提供するプロ
セスインスタンスフィルターの1つを使用します。
以下のプログラム例では、一括処理機能の準備段階として、ログインユーザの活性プロセスインスタンスを取得しています。
WFObjectList list = WFObjectFactory.getWFObjectList(session); list.openBatchedList(Filter.MyActiveProcesses);
Object[] batch = list.getNextBatch(10);
フィルターの詳細については、「6.4 フィルターとソートのAPI」を参照してください。
2. プロセスインスタンスが見つかったら、それぞれのIDを配列に格納します。
if (batch == null) {
< ... >
return;
}
long[] idValues = new long[batch.length];
for (int i = 0; i < batch.length; i++) {
idValues[i] = ((ProcessInstance) batch[i]).getId();
}
3. その後の処理で必要でない場合、プロセスインスタンスのリストはクローズします。
list.closeList();
4. 前の手順で取得したすべてのプロセスインスタンスのUDAを取得します。そのためには、WFDetailsListのインスタンスを生成し、
getUDAsForProcessInstances()を呼びます。
WFDetailsList detailsList = WFObjectFactory.getWFDetailsList(session);
ProcessInstancesUDASet udaInfo = detailsList
.getUDAsForProcessInstances(idValues);
- 81 -
udaInfoオブジェクトがプロセスインスタンスのUDAをJava Mapに格納します。プロセスインスタンスのIDはキーとして使用され、
そのプロセスインスタンスのUDAを表すもう1つのJava Mapが値として使用されます。
次の例では、特定のプロセスインスタンスのUDAを取得します。
5. 特定のプロセスインスタンスのUDAを取得するには、ProcessInstancesUDASetクラスのgetUDAsForProcessInstance()を使用しま
す。
for (int i = 0; i < idValues.length; i++) {
Map udaData = udaInfo.getUDAsForProcessInstance(idValues[i]);
< ... >
}
この例では、プロセスインスタンスのUDAがudaDataという名前のJava Mapに格納されます。このMapは、UDAの名前をキーとし、
UDAData型のオブジェクトを値とします。UDADataオブジェクトは、個々のUDAの名前、データ型、値を格納します。
6. プロセスインスタンスの個々のUDAを処理するには、Java Iteratorを使用してプロセスインスタンスのUDAを反復処理します。
UDADataクラスのgetUdaName()、getUdaType()、getUdaValue()を使用すると、UDAの名前、データ型、値を取得できます。
以下の例では、Map udaDataの各要素で反復するのに必要なJava Iteratorを生成します。iterator.next()が返すオブジェクトはそ
れぞれUDADataオブジェクトにキャストされます。最終的に、UDAの名前、データ型、値を、その後の処理のために取得します。
Iterator iterator = udaData.keySet().iterator();
while (iterator.hasNext()) {
UDAData data = (UDAData) udaData.get(iterator.next());
System.out.println("\tUDA name: '" + data.getUdaName() + "'");
System.out.println("\tUDA type: '" + data.getUdaType() + "'");
System.out.println("\tUDA value: '" + data.getUdaValue() + "'\n");
}
6.6 プロセスコメントの使い方
ユーザ間の柔軟なコミュニケーションを容易にするために、Interstage BPMはユーザにノードインスタンスやプロセスインスタンスにコメ
ントを追加することができます。
com.fujitsu.iflow.model.workflowパッケージに含まれるプロセスインスタンスとノードインスタンス インタフェースの以下のAPIを使用し
て、コメントの追加、取得、および、削除ができます。
注意
以下のAPIは、プロセスインスタンスおよびノードインスタンスの両方で使用することができます。
・ コメントを取得するには、-getComments()メソッドを使います。このAPIは、プロセスインスタンスやノードインスタンスのコメントの配
列を返します。すべてのユーザがコメントを取得することができます。
例)
- Activityノードのノードインスタンスオブジェクトであるactivityから、activity.getComments();を実行します。
- Process Instanceのオブジェクトであるpiから、pi.getComments() を実行します。
com.fujitsu.iflow.model.workflowパッケージに含まれるCommentインタフェースを使って、コメントの詳細を取得することができま
す。
例)
- getMessage():コメントのメッセージを返します。
- getId():コメントのコメントIDを返します。
- getUserId():コメントを追加したユーザのユーザIDを返します。
- getTimeStamp()ミリ秒で、コメントが追加された時間のタイムスタンプを返します。
利用可能なクラスとメソッドに関する詳細については、『API Javadocマニュアル』を参照してください。
- 82 -
以下のサンプルコードはProcess Instanceオブジェクトpiから個々のコメント情報を取得する例を示しています。
Comment [] comments = pi.getComments();
for(int count=0;count<comments.length;count++){
System.out.println("CommentId: "+comments[count].getId());
Date date = new Date(comment[count].getTimeStamp());
System.out.println("Timestamp: "+ date);
System.out.println("UserId: "+comments[count].getUserId());
System.out.println("CommentMsg: "+comments[count].getMessage());
System.out.println("Deleted flag: "+comments[count].isDeleted());
}
また、ProcessInstance.getAllComments()APIを使って、ユーザはプロセスインスタンスのコメントと、関連しているノードインスタンス
のすべてのコメントを、取得できます。
次のサンプルコードは、プロセスインスタンスオブジェクトpiとノードインスタンスのプロセスインスタンス オブジェクトpiから、すべて
のコメントを取得するコードです。
Comment [] comments = pi.getAllComments();
注意
プロセスインスタンスまたはノードインスタンスにコメントがない場合、空のComment配列が返ります。
・ コメントを追加するには、-addComments()メソッドを使います。このAPIは、ユーザが入れたコメントをプロセスインスタンスやノードイ
ンスタンスに追加します。管理者、プロセスインスタンスの所有者、プロセスインタンスの作成者、およびワークアイテムの担当者
が、プロセスインスタンスのコメントを追加することができます。また、管理者、プロセスインスタンスの所有者、プロセスインタンスの
作成者、およびワークアイテムの担当者が、ノードインスタンスのコメントを追加することができます。
注意
- コメントはActivityノード、Votingノード、Compoundノード、およびDynamicActivityノードのインスタンスに追加することができま
す。
- プロセスインスタンスがほかのユーザにロックされていない場合にだけ、ノードインスタンスとプロセスインスタンスにコメントを追
加することができます。
以下のサンプルコードは、Activityノードのノードインスタンスオブジェクトであるactivityに、コメントを追加する例を示しています。
String comment = "This is a comment on the node instance";
activity.addComment(comment);
以下のサンプルコードは、プロセスインスタンスのオブジェクトであるpiに、コメントを追加する例を示しています。
String comment = "This is a comment on the process instance";
pi.addComment(comment);
・ コメントを削除するには、-deleteComment()メソッドを使います。このAPIは、コメントをユーザが削除したことを表すフラグを設定しま
す。コメントを削除できるのは、コメントを追加した人および管理者です。
注意
コメントは、プロセスインスタンスがほかのユーザからロックされていないときにだけ、削除することができます。
次のサンプルコードは、Activityノードのノードインスタンスオブジェクトであるactivityから、コメントを削除する例です。
Comment comments = activity.getComments();
long commentId = comments[0].getId();
activity.deleteComment(commentId);
- 83 -
注意
削除したいコメントのコメントIdが、コメントを削除したいノードインスタンスまたはプロセスインスタンスのものであることを確認してく
ださい。プロセスインスタンスに属するコメントのコメントIdを使ってノードインスタンスからコメントを削除しようとすると、エラーが発生
します。プロセスインスタンスに対しても同様です。
次のサンプルコードは、プロセスインスタンスのオブジェクトであるpiから、コメントを削除する例です。
Comment comments = pi.getComments();
long commentId = comments[0].getId();
pi.deleteComment(commentId);
6.7 特別なユーザ定義属性のプロパティ
6.7.1 タイプXMLのユーザ定義属性でのワーク
プロセスで使用されるデータをモデル化するとき、XML形式に構造化されたデータを処理する場合があります。例えば、プロセス実行
の間に、外部システムを経由する場合などです。
Interstage BPMはXMLデータの特別なデータタイプを提供します。XML形式のユーザ定義属性(UDAs)にアクセスし、要素やシング
ルエレメント、属性と同様に全体のXML構造を操作します。XPath評価は、さらなる処理のためのXMLデータからコンポーネントを選
択するのに使用します。
XML形式のUDAデータを保存する前に、Interstage BPMサーバはデータが正しいフォームかをチェックします。正しいフォームのXML
データのみ保存されます。任意に各UDAにXMLスキーマを指定して、そのスキーマに対してXMLデータを有効にできます。
他のUDAのようにXML形式のUDAsの作成、アップデート、読み込み、削除が可能です。XML形式のUDAsに以下の追加メソッドが
あります。
・ XSDスキーマの設定および取得
・ ファイルとしてUDA値を設定および取得
・ XPath式を使用してのUDA値を設定および取得。全体のXML構造、要素、およびシングルエレメントの値の設定および取得が可
能。
・ UDAのXMLコンテンツの有効化
XML形式のUDAマッピング時、ワークアイテムインタフェースのDataItemMappingElementクラスで
・ すべてのXML構造をすべてのXML構造にマッピング
・ XML形式の別のUDAにシングルエレメントをマッピング
・ 別のXML要素にXML要素をマッピング
・ すべてのXML構造にXML要素をマッピング
以下にXML形式のUDAsの利用例があります。サンプルコードの全体については、ComplexPlan.javaサンプルファイルを参照してくだ
さい。
XML形式UDAsを利用するには、以下の手順に従います。
1. UDAs追加する場合は、データタイプにTYPE_XMLを指定します。
DataItemRef dataRefOrder = procDef.addDataItemRef(XMLUDA_BOOKSTORE,
DataItemRef.TYPE_XML, XMLVAL_BOOKSTORE);
XMLUDA_BOOKSTORE定数はUDAの名で定義します。
private final static String XMLUDA_BOOKSTORE = "XMLBookstore";
XMLVAL_BOOKSTORE定数は以下のXML構造のUDA値を定義します。
- 84 -
private final static String XMLVAL_BOOKSTORE =
"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"
+ "<bookstore>"
+ "<book category=\"COOKING\">"
+ "<title lang=\"en\">Everyday Italian</title>"
+ "<author>Giada De Laurentiis</author>"
+ "<year>2005</year>"
+ "<price>30.00</price>"
+ "</book>"
+ "<book category=\"CHILDREN\">"
+ "<title lang=\"en\">Harry Potter</title>"
+ "<author>J K. Rowling</author>"
+ "<year>2005</year>"
+ "<price>29.99</price>"
+ "</book>"
+ "<book category=\"WEB\">"
+ "<title lang=\"en\">XQuery Kick Start</title>"
+ "<author>James McGovern</author>"
+ "<author>Per Bothner</author>"
+ "<author>Kurt Cagle</author>"
+ "<author>James Linn</author>"
+ "<author>Vaidyanathan Nagarajan</author>"
+ "<year>2003</year>"
+ "<price>49.99</price>"
+ "</book>"
+ "<book category=\"WEB\">"
+ "<title lang=\"en\">Learning XML</title>"
+ "<author>Erik T. Ray</author>"
+ "<year>2003</year>"
+ "<price>39.95</price>" + "</book>" + "</bookstore>";
2. XML構造のシングルエレメントを読みこむには、XPath式を使用してエレメントを指定します。ここでは最初の本の価格です。
DataItem di = pi.getDataItem(XMLUDA_BOOKSTORE);
// retrieve the price for the first book
String price = di.getElementValue("/bookstore/book[1]/price/text()");
logger.log(Logger.DEBUG, "Price is: " + price);
3. 要素でのXMLノードの名前を読み込みます。ここでは2番目の本を定義するXMLノードの名前です。
org.w3c.dom.Node subNode = di.getSubTreeValue("/bookstore/book[2]");
logger.log(Logger.DEBUG, "Node name is: " +
subNode.getNodeName());
Interstage BPMがNodeインタフェースを提供するので、XMLノードの処理には必ずorg.w3c.dom.Nodeインタフェースを使用して
ください。
4. XMLエレメントの値を比較します。
String xPath = "/bookstore/book[3]/author/text()";
String expAuthor = "Erik T. Ray";
logger.log(Logger.DEBUG, "Author: " + di.getElementValue(xPath));
if (di.getElementValue(xPath).equals(expAuthor)) {
logger.log(Logger.DEBUG, "Expected author found");
6.7.2 ワークリストUDA
多くのアプリケーションでは、作業者が次に行う作業のリストを表示する必要がありますが、その際、特定のUDAの値を表示するワーク
リストを表示することができます。一般のアクセスでは、ワークリストからUDAの値へのアクセスは遅くなることがあります。ワークリストUDA
は、より高速なアクセス方法を提供しています。さらに、UDAをワークリストUDAとすることで、そのUDAのワークリストエレメントのリスト
をソートしたり、フィルターしたりすることができます。
- 85 -
ワークリストUDAは、ワークリストオブジェクトにオブジェクトとして含まれます。ワークリストオブジェクトが生成されると、アクティビティに
関係することなく同じ内容のUDA値が含まれます。これらの値は、ワークアイテムオブジェクトと共に含まれており、すぐに読み込むこと
ができます(プロセスインスタンス全体をモデルに読み込む必要はありません)。
Model APIを使用して特定のワークアイテムのUDA情報を取得するには、2つのメソッドを使用することができます。まず、ワークアイテ
ムオブジェクトを取得します。次に、getDataItems()を使用して、そのワークアイテムのすべてのUDA(DataItem)を取得するか、または
getWorklistDataItems()メソッドを使用して、ワークアイテムのDataItemで構成されているサブセットを取得します。
WorkItemインタフェースのgetWorklistDataItems()メソッドを使用するには、特定のDataItemをワークリストUDAとして、マークする必要
があります。プロセス定義をデザインするときに、DataItemRefインタフェースのmarkAsWorkListUDA()を使用して、このマークを設定
できます。
ワークリストUDA特有のメソッドには、以下のものがあります。
・ markAsWorkListUDA(): UDAをワークリストUDAとしてマークします。
・ boolean isWorkListUDA(): UDAがワークリストUDAかどうかを確認します。
以下のサンプルコードでは、プロセス定義作成時に、UDAを定義し、それらをワークリストUDAとしてマークする方法を示しています。
プロセス定義への処理は、ComplexPlan.javaのサンプルファイルを参照してください。
protected final static String WLUDA_PRICE = "Price";
protected final static String WLUDA_QTY = "Qty";
protected final static String WLUDA_TOTAL = "Total";
//*** Definition of UDAs ***
DataItemRef udaPrice = plan.addDataItemRef(WLUDA_PRICE,
DataItemRef.TYPE_FLOAT, "0.0");
DataItemRef udaQty = plan.addDataItemRef(WLUDA_QTY,
DataItemRef.TYPE_INTEGER, "0");
DataItemRef udaTotal = plan.addDataItemRef(WLUDA_TOTAL,
DataItemRef.TYPE_FLOAT, "0.0");
//Mark the UDAs as Worklist UDAs.
udaPrice.markAsWorkListUDA(true);
udaQty.markAsWorkListUDA(true);
udaTotal.markAsWorkListUDA(true);
たとえば、これらのワークリストUDAを使用して、UDAの値をもとにしたフィルター条件に一致するプロセスインスタンスを取得すること
ができます。プログラミングサンプルは、ComplexPlan.javaサンプルファイルのlistProcsByUDA()メソッドを参照してください。
6.8 拡張属性の使用
Interstage BPMで拡張属性が定義できます。拡張属性はInterstage BPM用ではないその他の情報を保存します。定義、ノードおよび
矢印の処理に拡張属性を割り当てることができます。
拡張属性はXMLドキュメントとして指定されます。拡張属性値は常にString型です。以下のXMLスキーマは拡張属性の定型を定義し
ます。
<xsd:element name="ExtendedAttributes">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="xpdl:ExtendedAttribute" minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="ExtendedAttribute">
<xsd:complexType mixed="true">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:any minOccurs="0" maxOccurs="unbounded"/>
</xsd:choice>
<xsd:attribute name="Name" type="xsd:NMTOKEN" use="required"/>
<xsd:attribute name="Value" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
- 86 -
拡張属性を使用すると、XMLドキュメントはXMLスキーマを確実に満たします。以下のサンプルは有効なインスタンスです。
<ExtendedAttributes>
<ExtendedAttribute Name="SomeAttributeName" Value="Some value"/>
<ExtendedAttribute Name="AnotherAttributeName" Value="200"/>
</ExtendedAttributes>
プラン、ノード、および矢印インタフェースは拡張属性に関連する以下のメソッドを提供します。
・ setExtendedAttributes(org.w3c. dom.Document attrs): 拡張属性をプロセス定義、ノードまたは矢印に割り当てます。attrsは、割当
てられる拡張属性を含むXMLドキュメントです。
・ getExtendedAttributes(): プロセス定義、ノードまたは矢印のすべての拡張属性を含むXMLドキュメントに戻ります。
ComplexPlan.javaは、拡張属性がどのように働くかを示すサンプルを含みます。サンプルプロセス定義CxPD_PurchaseOrderは、各国
で使用できるように作成されます。したがって、プロセス定義名やノード名といった特定のストリングは、各国語で利用できる必要があり
ます。拡張属性は言語特定名の保存に使用されます。
以降、拡張属性の割当て、取得について説明します。
6.8.1 拡張属性の割当て
プロセス定義、ノードまたは矢印に拡張属性を割り当てるには、以下の手順に従います。
1. エレメントに割り当てたい拡張属性を含むXMLドキュメントを作成します。
サンプルプログラムComplexPlan.javaは2つのXMLドキュメントを作成します。CxPD_PurchaseOrderプロセス定義の言語種名の
ためのものとActivityノードの言語種名のためのものです。以下のサンプルコードはプロセス定義の言語種名のために作成される
XMLドキュメントを示しています。
StringBuffer sb_xmlProcDef = new StringBuffer();
sb_xmlProcDef.append("<ExtendedAttributes>");
sb_xmlProcDef.append("<ExtendedAttribute Name=\"DE\" Value=\"Kaufauftrag\"/>");
sb_xmlProcDef.append("<ExtendedAttribute Name=\"EN\" Value=\"Purchase Order\"/>");
sb_xmlProcDef.append("<ExtendedAttribute Name=\"FR\" Value=\"Contrat d'achat\"/>");
sb_xmlProcDef.append("</ExtendedAttributes>");
InputStream in_xmlProcDef = new
ByteArrayInputStream(sb_xmlProcDef.toString().getBytes("UTF-8"));
これはActivityノードの言語特定名に作成されるXMLドキュメントです。
StringBuffer sb_xmlProcDef = new StringBuffer();
sb_xmlProcDef.append("<ExtendedAttributes>");
sb_xmlProcDef.append("<ExtendedAttribute Name=\"DE\" Value=\"Bestellformular ausfuellen\"/>");
sb_xmlProcDef.append("<ExtendedAttribute Name=\"EN\" Value=\"Fill out Purchase Requisition\"/>");
sb_xmlProcDef.append("<ExtendedAttribute Name=\"FR\" Value=\"Remplir le formulaire de commande\"/>");
sb_xmlProcDef.append("</ExtendedAttributes>");
InputStream in_xmlActivity = new
ByteArrayInputStream(sb_xmlProcDef.toString().getBytes("UTF-8"));
拡張属性に使用できる名前にはいくつかの制限があります。詳しくは、「6.8.4 拡張属性の名前」を参照してください。
2. 拡張属性を含むXMLドキュメントを読み込みます。
DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder();
Document extAttPlan = builder.parse(in_xmlProcDef);
Document extAttNode = builder.parse(in_xmlActivity);
3. 拡張属性をエレメントに割り当てます。
4. 以下のサンプルコードは、プロセス定義とノードに拡張属性を割り当てる方法を示しています。
procDef.startEdit();
procDef.setExtendedAttributes(extAttPlan);
- 87 -
nodePR.setExtendedAttributes(extAttNode);
procDef.commitEdit();
いったん拡張属性をエレメントに割当てると、さらなる処理のためのそれらの取得にgetExtendedAttributes()を使用できます。
6.8.2 拡張属性値の取得
前提条件:「6.8.1 拡張属性の割当て」を参照して、拡張属性を要素に割り当てます。
特定の拡張属性値を取得するには、以下の手順に従います。
1. 要素に割当てられた拡張属性を読み込みます。
以下のサンプルはプロセス定義に割当てられた拡張属性を読む方法を示しています。
Document resExtAttPlan = procDef.getExtendedAttributes();
また、アクテビティ定義に割り当てられた拡張属性を読み込むため、カスタムJava Actionを使用することができます。カスタムJava
Actionの作成は、「6.3.2 Server Enactment Contextインタフェースを使用するワークフローデータへのアクセス」を参照してくださ
い。カスタムJava ActionにはServerEnactmentContext.getActivityExtendedAttributes()APIを必ず使用してください。
2. XMLドキュメントの拡張属性の位置を特定するXPath式を構築します。以下のサンプルでは、exAttNameは取得される拡張属性
の名前を保存します。
String xpath = "/ExtendedAttributes/ExtendedAttribute[@Name=\""
+ exAttName + "\"]";
exAttNameに値ENがあれば、結果としてXPath式は以下のようになります。
"/ExtendedAttributes/ExtendedAttribute[@Name=\"EN\"]"
3. 拡張属性に対応するXMLノードを選択します。
org.w3c.dom.Node ndLang =
XPathAPI.selectSingleNode(resExtAttPlan, xpath);
XMLノードの結果例:
<ExtendedAttribute Name="EN" Value="Purchase Order"/>
4. 拡張属性値にアクセスするには、以下の設定をします。
String strRes =
ndLang.getAttributes().getNamedItem("Value").getNodeValue();
エレメントで拡張属性を割り当てない場合、getExtendedAttributes()かselectSingleNode()は、null値になります。
6.8.3 エレメントの全拡張属性の取得
前提条件:「6.8.1 拡張属性の割当て」を参照して、拡張属性をエレメントに割当てます。
特定のエレメントの全拡張属性を取得するには、以下の手順に従います。
1. XMLドキュメントの拡張属性の位置を特定するXPath式を構築します。
String xpath = "/ExtendedAttributes/ExtendedAttribute";
2. エレメントに割り当てられた拡張属性を読み込みます。以下のサンプルはプロセス定義のすべてのノードを取得して、拡張属性
がノードに割り当てられているかをチェックします。ノードに拡張属性がある場合、XMLノードのリストに割り当てられます。
Node[] nodes = procDef.getNodes();
for (int iNodeCnt=0; iNodeCnt<nodes.length; iNodeCnt++) {
Node tmpNode = nodes[iNodeCnt];
Document resExtAttNode = tmpNode.getExtendedAttributes();
if (resExtAttNode != null) {
NodeList nodelistNode =
- 88 -
XPathAPI.selectNodeList(resExtAttNode, xpath);
. . . }
}
また、アクテビティ定義に割り当てられた拡張属性を読み込むため、カスタムJava Actionを使用することができます。カスタムJava
Actionの作成は、「6.3.2 Server Enactment Contextインタフェースを使用するワークフローデータへのアクセス」を参照してくださ
い。カスタムJava ActionにはServerEnactmentContext.getActivityExtendedAttributes()APIを必ず使用してください。
3. XMLノードのリストにある特定の拡張属性にアクセスします。
for (int iNListCnt=0; iNListCnt<nodelistNode.getLength();
iNListCnt++) {
org.w3c.dom.Node exAttNode = nodelistNode.item(iNListCnt);
. . . }
nodelistNodeが以下のXMLノードを含むと仮定します。
<ExtendedAttribute Name="DE"
Value="Bestellformular ausfuellen"/>
<ExtendedAttribute Name="EN"
Value="Fill out Purchase Requisition"/>
<ExtendedAttribute Name="FR"
Value="Remplir le formulaire de commande"/>
この場合、nodelistNode.item(1)は以下のXMLノードを戻します。
<ExtendedAttribute Name="EN"
Value="Fill out Purchase Requisition"/>
6.8.4 拡張属性の名前
拡張属性を定義するときは、それらの名前が確実にInterstage BPMかXPDL規格で使用される名前を妨げないようにします。
Interstage BPMへのネイティブ拡張属性
プロセス定義をXPDLに変換するとき、Interstage BPMは拡張属性にInterstage BPMにネイティブな情報をコード化します。以下はその
ネイティブ拡張属性にInterstage BPMで使用されたリストがあります。
注意
拡張属性値としてこれらの名前を使用しないでください。
プロセス定義がXPDLに変換されるとき、これらの属性値を持っているXMLノードは削除されます。Interstage BPMは内部のデータを
マッピングするのにこれらのノードを使用します。getExtendedAttributesメソッドを使用して、それらは拡張属性から抽出されます。
Associations
Artifacts
ChildPlan
ChildPlanId
CommitJavaActionSet
Coordinates
CustomNodeType
DataMapping
DataMappings
Description
EnableFutureWorkItems
- 89 -
EndPoint
EpilogueJavaActionSet
ExposedField
FormList
FormsList
InitJavaActionSet
InTransaction
IsWorkItemUDA
IteratorCountUDA
NodeType
Organization
ParentVersion
PrivateData
ProcessDefinitionId
ProcessOwnerRole
ProcessOwnerRoleJavaActionSet
ProcessTypeId
PrologueJavaActionSet
RoleJavaActionSet
SameSubPlanVersion
StartPoint
State
subProcessDefinitionURI
SWIM_LANES
TemplateIdentifier
TimerDefSet
Title
TriggerDefSet
VersionComment
ViewerScript
例: 以下のXMLフラグメントは二つの拡張属性、StartPoint、およびStartPoint1を定義します。この名前がInterstage BPMによってネイ
ティブ拡張属性の一つに使用されるので、StartPointの定義は不完全です。
<ExtendedAttributes xmlns:x="http://example.com">
<ExtendedAttribute Name="StartPoint">
<x:StartPoint>
PointA
</x:StartPoint>
</ExtendedAttribute>
<ExtendedAttribute Name="StartPoint1">
<x:StartPoint1>
PointB
</x:StartPoint1>
</ExtendedAttribute>
</ExtendedAttributes>
- 90 -
プロセス定義がXPDLに変換されるとき、StartPoint XMLノードは削除されます。結果としてXPDLフラグメントは以下のようになります。
<ExtendedAttributes xmlns:x="http://example.com">
<ExtendedAttribute Name="StartPoint1">
<x:StartPoint1>
PointB
</x:StartPoint1>
</ExtendedAttribute>
</ExtendedAttributes>
6.8.5 拡張属性の名前空間
Interstage BPMはXPDL2.0規格に完全準拠の名前空間を意識したXPDLを生成します。
注意
拡張属性を使用しているなら、その名前を有効な名前空間のプレフィクスにすることをお薦めします。これで確実にInterstage BPMに
よって生成されたXPDLがXPDL規格に完全に準拠していることになります。
拡張属性を定義するときに名前空間を使用していないと、XPDL2.0規格に完全準拠の名前空間を意識したXPDLを生成するよう、
Interstage BPMはデフォルトibpm名前空間を加えます。
例1
以下のサンプルは名前空間xとyでプレフィクス拡張属性を定義します。:
<?xml version="1.0" encoding="UTF-8"?>
<ExtendedAttributes xmlns:x="http://example.com"
xmlns:y="http://example.net">
<ExtendedAttribute Name="myAttribute">
<x:myTag1>
myData1
</x:myTag1>
<y:myTag2>
<myTag3>
myData2
</myTag3>
</y:myTag2>
</ExtendedAttribute>
</ExtendedAttributes>
そのようなプロセス定義をインポートした後に、getExtendedAttributes()は以下のXMLドキュメントを戻します。
<?xml version="1.0" encoding="UTF-8"?>
<ExtendedAttributes xmlns="http://www.wfmc.org/2004/XPDL2.0alpha"
xmlns:xpdl="http://www.wfmc.org/2004/XPDL2.0alpha"
xmlns:ibpm="http://fujitsu.com/ibpm1" xmlns:x="http://example.com"
xmlns:y="http://example.net">
<ExtendedAttribute Name="myAttribute">
<x:myTag1>
myData1
</x:myTag1>
<y:myTag2>
<myTag3>
myData2
</myTag3>
</y:myTag2>
</ExtendedAttribute>
</ExtendedAttributes>
- 91 -
追加名前空間属性(ibpm名前空間とXPDL、2.0の標準の名前空間)がルートエレメントに追加されていることに注意してください。適切
な名前空間がオリジナルのXMLドキュメントに既に存在していたので、ExtendedAttributeエレメントの直系のエレメントはibpmでプレ
フィクスになっていません。
例2
このXMLフラグメントは名前空間なしで拡張属性を定義します。XPDL規格のコンテキストでは、ExtendedAttributeエレメントの子エレ
メントには前に置かれた名前空間がないのでこのXMLは無効です。
<!-- INVALID -->
<ExtendedAttributes>
<ExtendedAttribute Name="myAttribute">
<myTag1>
myData1
</myTag1>
<myTag2>
<myTag3>
myData2
</myTag3>
</myTag2>
</ExtendedAttribute>
</ExtendedAttributes>
プロセス定義をインポートした後に、getExtendedAttributes()は以下のXMLドキュメントを戻します。
<?xml version="1.0" encoding="UTF-8"?>
<ExtendedAttributes xmlns="http://www.wfmc.org/2004/XPDL2.0alpha"
xmlns:xpdl="http://www.wfmc.org/2004/XPDL2.0alpha"
xmlns:ibpm="http://fujitsu.com/ibpm1">
<ExtendedAttribute Name="myAttribute">
<ibpm:myTag1>
myData1
</ibpm:myTag1>
<ibpm:myTag2>
<myTag3>
myData2
</myTag3>
</ibpm:myTag2>
</ExtendedAttribute>
</ExtendedAttributes>
戻ったXMLドキュメントは、以下2点で変化しています。
・ ibpm名前空間とXPDL2.0標準名前空間属性がルートエレメントに追加されました。
・ ibpmプレフィクスがExtendedAttributeエレメントの直系のエレメントに追加されました。
6.9 トランザクション制御
Interstage BPMのトランザクション制御メカニズムは、プロセス実行中の特定ポイントへのロールバックトランザクションを設定できます。
このメカニズムで、システム全体のパフォーマンスも向上します。
プロセスは多くの場合、ノードの連続で構成されます。ノードの完了後、トランザクションを開いたままにしておくかどうかを決めることが
できます。トランザクションが開いたままの場合、そのプロセスの次のノードが同じトランザクション内で処理されることになります。
以下の点を考慮します。
・ パフォーマンス: トランザクションをコミットすると、すべてのデータがデータベースに保存され、後続のトランザクションを開始するた
めに、データベースから再度すべてのデータを読み取ります。簡単な演算を行うノードが長く連なっている(たとえば、多くの選択
肢から方向を選択する枝分かれしたノードが連なっているなど)場合、データベースに毎回保存すると負荷が大きくなります。
・ エラー時のロールバック: プロセスの処理中に低レベルのエラーが発生した場合、現在のトランザクションは最後にコミットされたポ
イントにロールバックします。同一トランザクション内に4つのノードが存在した場合、エラーが起きると、4つのノードすべてがロール
- 92 -
バックし、再スタート時には4つすべてが再度実行されます。トランザクションを途中でコミットすると、そのポイントまでしかロールバッ
クされないということになります。
Model APIを使用してトランザクションを制御する
com.fujitsu.iflow.model.workflow.Nodeインタフェースには、トランザクションを制御する機能をサポートする2つのメソッドがあります。そ
れらは、以下のとおりです。
・ setNodeInTxn(): ノードにトランザクションフラグを設定します。トランザクションフラグは、ノードが完了したとき、トランザクションをコ
ミットすべきかどうかを決定するために使用します。
・ getNodeTxnStatus(): ノードのトランザクションの状態を取得します。同じトランザクション内で、そのノードが完了に設定されたかど
うかによって決まります。
これらのメソッド、または一般的なModel APIの詳細については、『API Javadocマニュアル』を参照します。
次のコミット操作で自動的にトランザクションをコミットするノードは、次のようにsetNodeInTxn()をtrueに設定します。
fillOutNode.setNodeInTxn(true);
ノードのトランザクション状態を確認するには、getNodeTxnStatus()を次のように使用します。
logger.log(Logger.INFO, "");
logger.log(Logger.INFO, "Get status of node transaction");
boolean nodeTxnStatus =
workItem.getNodeInstance().getNodeTxnStatus();
logger.log(Logger.INFO, "Status: " + nodeTxnStatus);
完了ノードの定義については、ComplexPlan.javaおよびProcessExecution.javaのサンプルを参照してください。
外部システムのロールバックトランザクション
トランザクションがロールバックされてプロセスインスタンスがエラー状態に設定される前に「クリーンアップ」を実行するJava Actionを定
義することもできます。これには、Java Actionセット内のすべてのJava Actionのロールバックが含まれます。プロセスインスタンスがエ
ラー状態に設定される前に、エラー発生時の通知メールの送信などの一般的なアクションを実行したり、何らかの特別なアクションを実
行することができます。
Java Actionに対してエラー処理を定義しない場合、このJava Actionで例外がスローされると、トランザクションがロールバックされます。
ただし、ロールバックは、Interstage BPMアプリケーションサーバのコンテキストでの変更に対してのみ実行可能です。外部システムの
トランザクション(データベースへの行の追加など)は、ロールバックできません。このため、場合によっては、トランザクションで使用され
たすべてのシステムを一貫した状態に保つために、外部システムを手動でクリーンアップする必要があります。必要な場合は、補償ア
クションセットを使用できます。
詳細については、「6.3.9 Java Actionのエラー処理」を参照してください。
6.10 トリガ
トリガの目的は、データを移動することです。これは、一般的に、外部システムのデータソースから送られてきたXMLデータファイルを
Interstage BPMのプロセスインスタンスに移動することを指します。これらのプロセスインスタンスは、受信したXMLデータファイルによっ
て開始されるか、または制御され、そのプロセスインスタンスはソースデータのデータを使用する機能を実行します。このXMLデータ
ファイルを、Eventデータファイルと呼びます。
トリガは、イベントデータファイルを認識するように設定することができます。それによって、データがInterstage BPMのプロセスインスタンスの
UDAにマップされるか、またはトリガがイベントデータファイルを直接使用して、データを定義されたUDAに書き込みます。
トリガは用途が広く、プロセス定義、Event Activity(Trigger)ノード、またはActivityノードに関連付けることができます。それぞれのトリガ
には、別々の動作範囲があります。
・ プロセス定義レベルで定義した場合、トリガは新しいプロセスインスタンスを生成し、開始します。
・ ノードレベルで定義した場合、トリガは選択をして、プロセスの実行を次のノードに進めます。
トリガは2つのコンポーネントを含んでいます。1つはトリガを起動するEvent、もう1つはトリガが実行されたときにとるアクションです。
- 93 -
6.10.1 トリガの機能
イベントデータファイル(XMLファイル)は、外部データソースからInterstage BPMのFile Listenerの設定内容に従って指定したディレク
トリに送られます。トリガハンドラは、Interstage BPMで構成されているすべてのトリガを確認し、受信したXMLファイルについてFile Listener
がトリガハンドラに通知した場合にそのトリガを活性化します。トリガは、以下に示すように、その定義に従って動作します。
・ プロセス定義レベルのトリガの場合は、トリガが定義されているプロセス定義からプロセスインスタンスを開始し、トリガ定義に指定さ
れたデータマッピングに従って、XMLデータをプロセスのUDAに移動します。
・ Activityノードレベルのトリガの場合は、トリガが定義されているプロセスのアクティビティを選択し、トリガ定義に指定されたデータ
マッピングに従って、XMLデータをプロセスインスタンスのUDAに移動します。
ト リ ガ は File Listener だ け で は 開 始 さ れ ま せ ん 。 com.fujitsu.iflow.model.workflow パ ッ ケ ー ジ 内 の Model API の
WFObjectFactory.processTriggerEventメソッドを明示的に使用する必要があります。このメソッドは、XML形式で提供された、活性中の
全トリガ定義のイベントデータを処理します。
トリガの状態
トリガの状態は、デフォルト、活性中、非活性のどれかになります。トリガの状態は、定義レベルでのプロパティです。つまり、
ProcessInstance.getTriggers()を呼び出すなどの方法で、インスタンスレベルで取得したトリガを変更すると、同じプロセス定義に属する
すべてのプロセスインスタンスのトリガが影響を受けます。プロセス定義またはプロセスインスタンスの状態が変化しても、それに含まれ
るトリガの状態は影響を受けません。
制御条件
トリガは、プロセス定義ではなくプロセスインスタンスで動作するようにデザインされている場合があります。その場合は、制御条件を設
定して、トリガが開始されるときに動作対象の適切なプロセスインスタンスを特定することができます。制御条件を設定しないと、指定さ
れたディレクトリ内でFile Listenerが新しいXMLファイルを検出するたびにトリガが開始されます。
たとえば、プロセス定義レベルのトリガの場合は、次のようになります。複数のプロセス定義にトリガを定義した場合は、File ListenerがXML
ファイルを検出するたびに、それぞれのプロセス定義用のプロセスインスタンスが作成されます。つまり、XMLファイルは、プロセス定
義の数だけプロセスインスタンスを生成することを意味します。制御条件を指定することで、このような動作を回避し、XMLファイルの内
容に応じてプロセスインスタンスを作成することができます。XMLファイルの内容が制御条件に一致した場合にだけトリガが開始(プロ
セスインスタンスが作成)されます。
制御条件はUDAで操作します。使用する各属性について、XPath式で送られてくるイベントデータのエレメントを指定します。トリガが
開始されると、指定した属性の値が受信したEventの対応するエレメントの値と一致するプロセスだけが選択されます。
アクションの詳細
アクションの詳細には、トリガが実行する操作を定義します。各トリガは1つの種類の操作を扱うように定義されます。つまり、アクティビ
ティで選択を行うように定義されているトリガが、プロセスを開始することはできません。
Activityノードレベルのトリガ(選択トリガ)では、addAction(String, String)メソッドを使用して、実行可能なアクションを指定する必要があ
ります。最初のパラメータには、2番目のパラメータに指定された条件がtrueの場合に実行される外向き矢印の名前を指定します。
トリガをイベントアクティビティノードで定義する場合、このノードは外向き矢印を1つだけしか持てないため、1つのアクションを定義する
必要があります。
トリガをアクティビティノードで定義する場合、定義可能なアクションの数は、Activityノードに定義された外向き矢印の数によって異な
ります。メソッドの2番目のパラメータに指定されている条件を評価する順序は、アクションの順序によって決まります。index [0]のアク
ションの条件が最初に評価されます。この条件がtrueの場合、そのほかのアクションの条件は評価されません。プロセスインスタンスは、
条件がtrueであったアクションに定義された矢印を使用して続行します。
6.10.2 トリガの定義
ここでは、トリガをプロセス定義レベルで定義する方法を説明します。ここで紹介されているプログラミング例のすべてのコードは、
TriggerTimerSample.javaサンプルファイル内にあります。
- 94 -
注意
TriggerTimerSample.javaは、トリガをActivityノードに追加する別の例を含みます。Event Activity(Trigger)ノードで定義するトリガの詳
細については、「6.11 Event Activity(Trigger)ノードの使用」を参照してください。
トリガを定義する方法について説明します。
1. File Listenerを設定することにより、受信したイベントデータファイルが保存されるディレクトリ内を調査して、トリガが開始されま
す。File Listenerの設定とテストの方法に関しては、「6.12 File Listenerファイルリスナ」を参照してください。
2. プロセス定義に関連するUDAを作成します。
サンプルファイル内では、以下のUDAが作成されます。
plan.addDataItemRef("OrderID",
DataItemRef.TYPE_STRING, "Initial Value");
plan.addDataItemRef("OrderPerson",
DataItemRef.TYPE_STRING,"Initial Value");
plan.addDataItemRef("Name",
DataItemRef.TYPE_STRING, "Initial Value");
plan.addDataItemRef("Address",
DataItemRef.TYPE_STRING, "Initial Value");
plan.addDataItemRef("City",
DataItemRef.TYPE_STRING, "Initial Value");
plan.addDataItemRef("State",
DataItemRef.TYPE_STRING, "Initial Value");
plan.addDataItemRef("ZIP",
DataItemRef.TYPE_STRING, "Initial Value");
plan.addDataItemRef("Title",
DataItemRef.TYPE_STRING, "Initial Value");
plan.addDataItemRef("Note",
DataItemRef.TYPE_STRING, "Initial Value");
plan.addDataItemRef("Quantity",
DataItemRef.TYPE_INTEGER, "1");
plan.addDataItemRef("Price",
DataItemRef.TYPE_BIGDECIMAL, "0.00");
3. プロセス定義にトリガを追加します。たとえば、プロセス定義レベルのトリガを追加して、制御条件を定義し、その状態を活性中に
します。
以下のサンプルでは、2つの制御条件が定義されます。最初の制御条件は商品の価格の値が10より大きいこと、2番目の制御条
件は受取人名が“Pete Gagnet”であることが記載されています。
TriggerDef myTrigger = plan.addTrigger("myTrigger",
TriggerDef.TYPE_START_PROCESS);
myTrigger.setDescription("プロセスインスタンスを開始します。");
// 制御条件を追加します。
String[] conditions = new String[2];
conditions[0] = "toFloat(eventData.getXMLData
( \"/shiporder/item/price/text()\" )) > 10";
conditions[1] = "eventData.getXMLData
( \"/shiporder/shipto/name/text()\" ) == \"Pete Gagnet\"";
myTrigger.setControlConditions(conditions);
// トリガを活性化します。
myTrigger.setState(TriggerDef.STATE_ACTIVE);
4. トリガを起動し、XMLファイルからイベントエレメントの値を抽出してUDAに値を格納するためのマッピングを指定します。以下の
例を参照してください。
myTrigger.addDataMap("OrderID","shiporder/@orderid");
myTrigger.addDataMap("OrderPerson","shiporder/orderperson/text()");
myTrigger.addDataMap("Name","shiporder/shipto/name/text()");
myTrigger.addDataMap("Address","shiporder/shipto/address/text()");
- 95 -
myTrigger.addDataMap("City","shiporder/shipto/city/text()");
myTrigger.addDataMap("State","shiporder/shipto/state/text()");
myTrigger.addDataMap("ZIP","shiporder/shipto/zip/text()");
myTrigger.addDataMap("Title","shiporder/item/title/text()");
myTrigger.addDataMap("Note","shiporder/item/note/text()");
myTrigger.addDataMap("Quantity","shiporder/item/quantity/text()");
myTrigger.addDataMap("Price","shiporder/item/price/text()");
5. トリガがプロセス定義のインスタンスを開始するために使用するXMLファイルを作成し、そのファイルに値を入力します。既存のXML
ファイルを使用するか、またはAPIを使用して次のように作成します。
// Create XML file in the folder specified by the FILELISTENER_PATH File xml = new File(FILELISTENER_PATH +
"shiporder.xml");
// XMLデータをファイルに書き込みます。
FileWriter fw = new FileWriter(xml);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("<?xml version=\"1.0\" encoding=\
"ISO-8859-1\"?>"); bw.newLine();
bw.write("<shiporder orderid=\"889923\">"); bw.newLine();
bw.write("<orderperson>Joan Smith</orderperson>");
bw.newLine();
bw.write("<shipto>");bw.newLine();
bw.write("<name>Pete Gagnet</name>"); bw.newLine();
bw.write("
<address>325 Eastwood Ave</address>");
bw.newLine();
bw.write("<city>" + CITY_OF_ORDER + "</city>"); bw.newLine();
bw.write("<state>OH</state>"); bw.newLine();
bw.write("<zip>20131-1234</zip>"); bw.newLine();
bw.write("</shipto>");bw.newLine();
bw.write("<item>");bw.newLine(); String titleStr = "<title>" + ITEM_TITLE + "</title>";
bw.write("(titleStr);bw.newLine();
bw.write("<note>Special Edition</note>");bw.newLine();titleStr = "<quantity>" + QUANTITY_ORDER + "</quantity>";
bw.write("(titleStr);bw.newLine();
bw.write("<price>39.99</price>");bw.newLine();
bw.write("</item>");bw.newLine();
bw.write("</shiporder>");bw.newLine();
bw.close();
注意
XMLファイルにデータを指定する場合、Interstage BPMサーバに一致するデータフォーマットを使用します。
6.11 Event Activity(Trigger)ノードの使用
Event Activity(Trigger)ノードは、プロセス内の、外部イベントドリブンのステップを表します。各Event Activity(Trigger)ノードは、外部
システムからデータ(XMLファイルなど)が送られてきた際に実行すべき定義済みトリガを含みます。データを受信すると、トリガはその
定義に従って、データをユーザ定義属性(UDA)に移動します。そして、トリガがアクティビティを選択し、プロセスの実行は次のノード
に進みます。人の操作は不要です。
ここでは、Event Activity(Trigger)ノードの使用方法の一般的な手順を説明します。ここで示す例の完全なプログラムコードは、サンプ
ルファイルEventActivityNodeSample.javaにあります。
トリガとその動作の全般については、「6.10 トリガ」を参照してください。
Event Activity(Trigger)ノードを使用するには、以下の手順に従います。
1. addNode()を使用して、Event Activity(Trigger)ノードを生成します。定数nodeTypeをTYPE_EVENT_ACTIVITYに設定します。
Node activity = plan.addNode("EventActivity",
Node.TYPE_EVENT_ACTIVITY);
- 96 -
2. 以下のように、Event Activity(Trigger)ノードに外向き矢印を1つだけ追加します。
plan.addArrow("Exit", activity, exit);
3. 前の手順で作成したEvent Activity(Trigger)ノードの選択トリガを定義します。
TriggerDef trigger = activity.addTrigger("ChoiceTrigger",
TriggerDef.TYPE_MAKE_CHOICE);
4. 必要な場合は、制御条件と相関マップを追加します。
制御条件は、受け取ったXMLデータの内容がトリガにとって有効かどうかをチェックします。相関マップは、トリガが動作するプロ
セスインスタンスを選択するのに使用します。
次の例は、外部システムから受け取ったXMLデータの<doMakeChoice>要素の値がtrueの場合にトリガを作動させるための定義
です。トリガは、特定のUDAが受け取ったXMLデータの<newValue>要素の値と同じ場合のみ、プロセスインスタンスに対して作
動します。
trigger.addControlCondition("eventData.getXMLData"
+ "('/root/doMakeChoice/text()[1]') == 'true'");
trigger.addCorrelationMap(UDA_NAME, "/root/currentValue/text()[1]");
5. メソッドaddAction(String, String)を使用して、トリガが選択する外向き矢印を指定します。
最初のパラメータは、第2のパラメータに指定された条件がtrueの場合に選択すべき外向き矢印の名前を指定します。
このプログラム例では、特定のUDAの値が10未満の場合、トリガが外向き矢印を選択します。
trigger.addAction(exit.getName(), "uda." + UDA_NAME + " < 10");
6. 受け取ったXMLデータの情報のうち、さらに処理が必要なものをUDAにマッピングします。
このプログラム例では、<newValue>要素の値からUDAへのマッピングという、1つのデータマッピングだけを定義しています。
trigger.addDataMap(UDA_NAME, "/root/newValue/text()[1]"
7. トリガの状態をアクティブにします。
trigger.setState(TriggerDef.STATE_ACTIVE);
Event ActivityTriggerノードの定義は、これで完了です。実行時にトリガを作動させるには、受け取ったXMLデータの一部をトリ
ガに送る必要があります。このデータはサンプルプログラムが生成し、WFObjectFactory.processTriggerEvent()を使用してトリガ
に送ります。
StringBuffer bw = new StringBuffer();
bw.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>");
bw.append("<root>");
bw.append("<currentValue>5</currentValue>");
bw.append("<doMakeChoice>true</doMakeChoice>");
bw.append("<newValue>7</newValue>");
bw.append("</root>");
WFObjectFactory.processTriggerEvent(bw.toString(), adminSession);
6.12 File Listenerファイルリスナ
ファイルリスナは、指定されたディレクトリ内のファイルを監視します。ファイルハンドラは、新しいファイルや、新しく変更されたファイル
を検出すると、Interstage BPMのファイルハンドラに通知し、Interstage BPMプロセスインスタンスを開始したり、アクティビティの選択を
行ったりする自動機能を実行できるようにします。ファイルリスナは、一般的に、Interstage BPMをほかのエンタープライズアプリケーショ
ンと統合するために使用します。
6.12.1 File Listenerファイルリスナの使用
ファイルリスナを使用する方法について説明します。
- 97 -
1. ファイルリスナの設定ファイルfileListenerConf.xmlは、Interstage BPM Studioで作成してインポートしたワークフロー アプリケーション
プロジェクトの一部です。このファイルは、<DMSRoot>/apps/<アプリケーションID>に格納します。
2. ファイルリスナ環境設定ファイルを変更した場合は、ワークフローアプリケーションを再起動します。
3. プロセス定義を作成し、ファイルリスナにプロセスインスタンスを開始させるトリガを追加します。手順については、「6.10 トリガ」を
参照してください。
4. トリガとなるイベントデータファイル(XMLファイル)を作成し、filelistenerディレクトリに保存します。手順については、「6.10 トリガ」
を参照してください。
トリガが作動中の場合、イベントデータファイルは消え、トリガを含むプロセス定義からプロセスインスタンスが開始されます。トリ
ガが作動中ではない場合、イベントデータファイルはfilelistener¥errorディレクトリに移動します。
6.12.2 File Listenerファイルリスナの設定
ファイルリスナの環境設定ファイル、fileListenerConf.xmlは、<DMSRoot>/apps/<application ID>に格納されています。
以下は、fileListenerConf.xml環境設定ファイルの例です。
<FileListener>
<Directory>
<ScanInterval>60000</ScanInterval>
<StabilizationPeriod>2000</StabilizationPeriod>
<PostProcessing>
<onSuccess>
<Delete></Delete>
</onSuccess>
<onError>
<Move>
</Move>
</onError>
</PostProcessing>
</Directory>
</FileListener>
以下の表は、fileListenerConf.xmlで使用されているXMLタグを説明しています。
タグ
説明
<Directory>
新しいファイル、または新しく変更されたファイルを監視するディレクトリの環境設定パ
ラメータが含まれます。
<Path>
監視するディレクトリのパスです。
SaaSモード、または非SaaSモードでパスが指定されていない場合、
<ServerSharedRoot>/tenants/<テナント名>/apps/<アプリケーションID>/filelistenerとな
ります。
<ScanInterval>
ディレクトリ内に新しいファイルがあるかどうかをスキャンする間隔を指定します。(単位
はミリ秒)
<StabilizationPeriod>
ファイルが処理される前に、ファイルのサイズを監視し、変更の有無を確認するための
設定です。(単位はミリ秒)
<PostProcessing><onSuccess>
ファイルの処理に成功した場合にとるアクションです。アクションとして設定できるの
は、<Delete>または<Move>です。
<PostProcessing><onError>
ファイルの処理に成功しなかった場合にとるアクションです。アクションとして設定でき
るのは、<Delete>または<Move>です。
<Delete>
ファイルを削除します。
<Move>
指定されたディレクトリにファイルを移動します。
On success:
・ 非SaaSモードの場合、ファイルを指定した場所に移動します。
- 98 -
タグ
説明
・ SaaS モ ー ド 、 ま た は 非 SaaS モ ー ド で パ ス が 指 定 さ れ て い な い 場 合 、
<ServerSharedRoot>/tenants/<テナント名>/apps/<アプリケーションID>/filelistener/
successにファイルを移動します。
On error:
・ 非SaaSモードの場合、ファイルを指定した場所に移動します。
・ SaaS モ ー ド 、 ま た は 非 SaaS モ ー ド で パ ス が 指 定 さ れ て い な い 場 合 、
<ServerSharedRoot>/tenants/<テナント名>/apps/<アプリケーションID>/filelistener/
errorにファイルを移動します。
6.13 Emailリスナ
Emailリスナは、Interstage BPMに渡すデータのファイルを含んだEmailを監視します。
Emailリスナがこれらのファイルを検出すると、EmailリスナはInterstage BPMのトリガハンドラーに通知し、トリガハンドラーはInterstage BPM
のプロセスインスタンスを開始したり、アクティビティ上で矢印を選択したりするなどの処理を自動的に行います。一般的に、Emailリスナは
Interstage BPMとほかのアプリケーションを連携するために使用されます。
6.13.1 トリガ起動のためのEmailリスナの使用
Emailリスナを使うには、以下の操作が必要です。
・ Emailリスナの設定をする
注意
Emailリスナの設定は、テナントの管理者(Tenant Administrator)が実施してください。
EmailリスナがEmailを監視するようにするためには、以下のパラメータを設定する必要があります。
- EmailListenerAutoReplyEnabled
- EmailListenerDeleteInvalidMessages
- EmailListenerEmailAddress
- EmailListenerEnabled
- EmailListenerPassword
- EmailListenerPollingInterval
- EmailListenerPOPPort
- EmailListenerPropertiesFile
- EmailListenerServerHost
- EmailListenerUserName
- EmailStyleSheetFile
これらの設定パラメータについては、『Interstage BPMサーバ 管理者ガイド』を参照してください。
・ プロセス開始トリガまたは矢印の選択トリガ(アクティビティレベルのトリガ)を持った単純なプロセス定義を用意し、トリガを有効にし
てください。データマッピングは、未定義でも構いません。
Emailリスナは、1つの例外を除いて、ファイルリスナと同様に機能します。ファイルリスナは、ファイルリスナ用のディレクトリにコピーされた
XMLデータファイルをトリガハンドラに送信し、処理を行います。Emailリスナは、特別な形式のEmailのメッセージに含まれるXMLデー
タファイルをトリガハンドラに送信し、処理を行います。データファイルは、一般的には、トリガハンドラがInterstage BPMのイベントを引
き起こすために使われます。Emailリスナを利用する際、特殊なフォーマットのアプリケーションアクセスキーが必要になります。
- 99 -
注意
以下の手順では、Systemアプリケーションとデフォルトテナントを使用しています。
1. 作成したプロセス定義が存在するアプリケーションのアプリケーションアクセスキーを、取得します。
注意
テナントの管理者またはアプリケーションの所有者だけが、以下の手順でアプリケーションアクセスキーを入手することができま
す。どちらにも該当しない場合は、テナントの管理者またはアプリケーションの所有者から、アプリケーションアクセスキーを入手
してください。
a. [システム管理]タブの配下の[アプリケーションの設定]を開き、作成したプロセス定義が存在するアプリケーションを選択し
ます。
以下の例では、Systemアプリケーションを選択しています。
b. [アクセスキー]をクリックします。
アプリケーションアクセスキーが表示されます。
c. ネットワーク上の安全な場所へ、アプリケーションアクセスキーを編集しないでコピーします。
アプリケーションアクセスキーは、Emailリスナを起動するのに使われるEmailのメッセージ本体に、編集しないで追加する
必要があります。管理者以外の人が、Emailリスナを起動するEmailを作成する場合は、管理者がアプリケーションアクセス
キーを配布する必要があります。
2. 新しいEmailメッセージを作成するために、Emailクライアントのソフトウェアを起動します。
3. テナントのプロパティ[EmailListenerEmailAddress]の値を、Emailの送信先に設定します。送信先がわからない場合は、手順1で
述べたアプリケーションの管理者に聞いてください。
4. Emailメッセージに、イベントデータファイルを添付します。イベントデータファイルは、トリガを活性化し、プロセスインスタンスに
データを渡します。イベントデータファイルはXML形式で、トリガ定義時に指定したXMLスキーマに適合している必要がありま
す。
イベントデータファイルは、ファイルリスナで使う場合と同じフォーマットである必要があります。
Emailに添付できるファイルは、1つだけです。2つ以上のファイルが添付されている場合、最初の添付ファイルが使われます。
まとめると、Emailリスナを活性化させるEmailには、以下が必要です。
- アプリケーションアクセスキー (手順1を参照)
- Emailの送信先 (手順3を参照)
- XML形式のイベントデータファイル (手順4の先頭を参照)
5. Emailを送ります。
Interstage BPMはメッセージを処理し、返信のEmailを送ります。
返信のEmailには、Emailリスナでの処理の成功・失敗の状態が記述されています。
6. Emailリスナへメッセージを送った結果を、返信のEmailで確認します。
この結果は、メッセージによって活性化されたトリガの種類や、トリガの活性化の成功・失敗によって変わります。
メッセージがプロセス開始トリガを活性化させた場合は、トリガが定義されているプロセス定義から新しいプロセスインスタンスが
開始されます。Interstage BPMは、処理が成功した旨の返信のEmailを送ります。
メッセージが矢印の選択トリガを活性化させた場合は、トリガが定義されているアクティビティが完了し、イベントデータファイルに
指定された矢印を選択します。Interstage BPMは、処理が成功した旨の返信のEmailを送ります。
トリガでデータマッピングが定義されている場合、トリガの定義内容に従ってデータがプロセスインスタンスに追加されます。
- 100 -
メッセージが、イベントデータファイルで指定されたトリガを活性化させることに失敗した場合、Interstage BPMは処理が失敗した
旨の返信のEmailを送ります。
期限切れまたは不正な内容のアプリケーションアクセスキーを含んだEmailを送信した場合、Interstage BPMはメッセージを破棄
し、不正な内容のアプリケーションアクセスキーを使っていることを示す返信のEmailを送ります。
6.14 JMS リスナ
JMSリスナは、Interstage BPMに渡すデータを含んだJMSメッセージを監視します。
JMSリスナがこれらのデータを含んだメッセージを検出すると、JMSリスナはInterstage BPMのトリガハンドラーに通知し、トリガハンドラーは
Interstage BPMのプロセスインスタンスを開始したり、アクティビティ上で矢印の選択したりといった処理を自動的に行います。一般的
に、JMSリスナはInterstage BPMとほかのアプリケーションを連携するために使用されます。
6.14.1 トリガ起動のためのJMSリスナの使用
JMSリスナを使用するためには、以下が必要です。
・ 簡単なJMSクライアントアプリケーションを作成する知識
・ プロセス開始トリガまたは矢印の選択トリガ(アクティビティレベルのトリガ)を持ち、トリガが有効になっている単純なプロセス定義
データマッピングは未定義でも構いません。
JMSリスナは、1つの例外を除いてファイルリスナと同様に機能します。ファイルリスナは、ファイルリスナ用のディレクトリにコピーされたXML
データファイルをトリガハンドラーに送信し、処理を行います。JMSリスナは、JMSメッセージから取り出したXMLデータをトリガハンド
ラーに送信し、処理を行います。XMLデータは、一般的にはトリガハンドラーがInterstage BPMのイベントを引き起こすために使われま
す。JMSメッセージには、以下で説明するように、アプリケーションアクセスキーが含まれている必要があります。
注意
以下の説明の手順1では、Systemアプリケーションとデフォルトテナントを使用しています。
1. 作成したプロセス定義が存在するアプリケーションのアプリケーションアクセスキーを取得します。
注意
テナントの管理者またはアプリケーションの所有者だけが、以下の手順でアプリケーションアクセスキーを入手することができま
す。どちらにも該当しない場合は、テナントの管理者またはアプリケーションの所有者から、アプリケーションアクセスキーを入手
してください。
a. [システム管理]タブの配下の[アプリケーションの設定]を開き、作成したプロセス定義が存在するアプリケーションを選択し
ます。
以下の例では、Systemアプリケーションを選択しています。
b. [アクセスキー]をクリックします。
アプリケーションアクセスキーが表示されます。
c. ネットワーク上の安全な場所へ、アプリケーションアクセスキーを編集しないで、コピーします。
JMSリスナを活性化するためには、アプリケーションアクセスキーを編集しないで、JMSメッセージに追加する必要がありま
す。管理者以外の人がJMSメッセージを作成する場合は、管理者がアプリケーションアクセスキーを配布する必要がありま
す。
2. トリガを起動し、プロセスインスタンスにデータを転送するイベントデータの文字列を作成します。文字列はXML形式で、トリガ定
義時に指定したXMLスキーマに適合している必要があります。
3. JMSメッセージを送信する対象のInterstage BPMサーバ名を特定します。
4. Interstage BPMサーバの配備時に、CommandTopicおよびResponseTopicという名前のJMSのトピックが作成されます。Interstage
BPMサーバは、CommandTopicを監視し、到着したメッセージを処理します。また、処理が完了すると、Interstage BPMサーバは
- 101 -
ResponseTopicに返信メッセージを送信します。ユーザが作成するアプリケーションは、ResponseTopicを監視することにより、
Interstage BPMサーバからの返信を取得できます。
CommandTopicにテキストメッセージを送信する簡単なJMSクライアントアプリケーションを、作成してください。変数xmlStringに、
XMLのイベントデータの文字列を設定してください。また、APPLICATION_ACCESSKEYプロパティにアプリケーションアクセス
キーの文字列(手順1を参照)を、SERVER_IDプロパティにJMSメッセージを送信する対象のInterstage BPMサーバ名(手順3を
参照)を設定してください。以下は、これらのプロパティをJMSメッセージに設定する方法の例です。
...
TextMessage msg = pubSession.createTextMessage();
String xmlString = [XML Data Event STRING];
String serverName = [name of Interstage BPM Server STRING];
String applicationAccessKey = [the Application Access Key STRING];
msg.setText(xmlString);
msg.setStringProperty("SERVER_ID", serverName);
msg.setStringProperty("APPLICATION_ACCESSKEY", applicationAccessKey);
...
5. JMSメッセージを送信します。
Interstage BPMサーバはJMSメッセージを処理し、JMSリスナの成功・失敗の状態を示す返信メッセージをResponseTopicに送信
します。
返信は、TextMessage型またはObjectMessage型です。アプリケーションへのアクセス時に例外が発生した場合は、失敗の説明
をするTextMessageが送信されます。XMLイベントデータが正常に処理された場合は、com.fujitsu.mode.workflow.TriggerResult
オブジェクトがObjectMessage型の形式で送信されます。
6. JMSメッセージの送信結果を確認します。
この結果は、メッセージによって活性化されたトリガの種類や、トリガの活性化の成功・失敗によって変わります。
メッセージがプロセス開始トリガを活性化させた場合は、トリガが定義されているプロセス定義から新しいプロセスインスタンスが
開始されます。Interstage BPMは、処理が成功した旨の返信メッセージを送ります。
メッセージが矢印の選択トリガを活性化させた場合は、トリガが定義されているアクティビティが完了し、イベントデータに指定さ
れた矢印を選択します。Interstage BPMは、処理が成功した旨の返信メッセージを送ります。
トリガでデータマッピングが定義されている場合、トリガの定義内容に従って、データがプロセスインスタンスに追加されます。
メッセージがイベントデータで指定されたトリガを活性化させることに失敗した場合、Interstage BPMは処理が失敗した旨の返信
メッセージを送ります。
期限切れまたは不正な内容のアプリケーションアクセスキーを含んだJMSメッセージを送信した場合、Interstage BPMはメッセー
ジを破棄し、不正な内容のアプリケーションアクセスキーを使っていることを示す返信メッセージを送ります。
6.15 エージェントの使用
Interstage BPMのエージェントは、自動的に実行され、ユーザの代わりとして振る舞います。エージェントを使用して、Interstage BPMの
外のシステムにアクセスすることができます。接続する外部システムは、レガシーシステムの場合も、Webサービスの場合もあります。
エージェントを使用して、これらの外部サービスをInterstage BPMプロセスインスタンスに組み入れることができます。
注意
Interstage BPMエージェントが使用できるように外部のライブラリを含めるには、外部クラスかJARを、「6.1 Interstage BPMと外部アプリ
ケーションの統合」で指定したディレクトリへコピーします。
クラスタインストール環境でエージェントを使用する場合は、各クラスタノードにエージェントを設定します。エージェントの設定はすべ
てのクラスタノードで完全に一致しなければなりません。
- 102 -
6.15.1 エージェントの概要
エージェントは、アプリケーション特有で、agentsConfig.xmlというXMLファイルを使用して構成されます。このファイルは、Interstage
BPM Studioからインポートしたワークフロー アプリケーション プロジェクトの一部であり、<DMSRoot>/apps/<アプリケーションID>にあり
ます。
エージェントがagentsConfig.xmlに追加され、Interstage BPMで構成されると、エージェントをActivityノードに割当てることで、Interstage
BPMのプロセスインスタンス内でアクティビティとして実行することができます。これにより、エージェントはアクティビティの代わりに実行
されます。実際は、ワークアイテムが、そのエージェントと同じ名前のシステムユーザに割当てられます。
agentsConfig.xml環境設定ファイル
agentsConfig.xmlのサンプルコードを以下に示します。
<ActionAgentList>
<ActionAgent>
<Name>@TestFrameAgent</Name>
<Description>テスト用です。最初の矢印を返します。</Description>
<RetryInterval>20</RetryInterval>
<EscalationInterval>1</EscalationInterval>
<ClassName>com.fujitsu.iflowqa.testframe.TestFrameAgent
</ClassName>
<ClassPath>IBPMROOT/classes</ClassPath>
<ConfigFile></ConfigFile>
</ActionAgent>
</ActionAgentList>
以下の表は、agentsConfig.xmlで使用されているXMLタグを説明しています。
タグ
説明
<ActionAgentList>
エージェントの一覧が記述されます。
<ActionAgent>
単一のエージェント定義が記述されます。エージェントごとに独自の定義をこのタグ内に記述
する必要があります。
<Name>
エージェントの名前です。名前の先頭は必ず「@」にする必要があります。これは、エージェン
トであることを指定します。この名前はActivityノードの担当者として指定し、そのアクティビティを
「エージェント」アクティビティにする必要があります。つまり、これは通常のInterstage BPMアク
ティビティではなく、エージェントとして機能します。
<Description>
エージェントの簡単な説明です。通常は、機能について説明します。
<RetryInterval>
エージェントは、外部サービスの呼出しに失敗した場合、指定された間隔をおいてその呼出
しを再試行します。RetryIntervalには、その試行間隔を秒単位で指定します。
<EscalationInterval>
システム管理者にメールで通知する場合に、失敗回数のしきい値を指定します。
メールは、次のエスカレーションに進むたびに送られます。たとえば、値が1の場合は、エー
ジェントが失敗するたびにシステム管理者に通知されます。
メールは、Interstage BPMサーバのServerEmailAddressパラメータに指定されたアドレスに送
られます。
<ClassName>
エージェントに関連付けられているJavaクラスの名前です。このクラスは、エージェントの機能
部分です。
<ClassPath>
エージェントに関連付けられているJavaクラスのクラスパスです。
SaaSモードでは、この値は無視されます。
<ConfigFile>
エージェントが使用する環境設定ファイル名です。
エージェントクラス
agentsConfig.xmlの<ClassName>タグに指定されたクラスは、エージェントが外部サービスにアクセスする手段です。以降は、エージェ
ントクラスと呼びます。エージェントクラスは、次のインタフェースを実装する必要があります。
- 103 -
package com.fujitsu.iflow.server.intf;
public interface ActionAgentInvoke
{
public String invokeService(ServerEnactmentContext sec, String configFile) throws Exception;
}
エージェントクラスは、invokeService()を使用して外部サービスを呼び出し、そのサービスからデータを受け取ります。次に、サービス
のアクションを指示するInterstage BPMに、STRING型のデータを返します。
エージェントクラスの実行結果は3つあります。それらは、以下のとおりです。
・ NULL STRING型、または空のSTRING型のデータが返された場合: エージェントはサービスの実行を繰り返し試行します。再試
行の間隔は、<RetryInterval>タグに指定されます。エージェントは、<EscalationInterval>タグに指定された回数だけ実行を試み、
そのたびにInterstage BPMサーバのServerEmailAddressパラメータに指定されたアドレスにメールを送ります。
・ そのほかのSTRING型のデータが返された場合: エージェントは、そのデータがエージェントアクティビティを起点とした外向き矢印
の名前の1つと一致するかどうかを確認します。一致する場合、プロセスインスタンスはその一致する矢印に従って続行します。STRING
型の戻り値が矢印に一致しない場合、エージェントはcannot-find-arrow例外を送出し、プロセスインスタンスはエラー状態になりま
す。
・ エージェントクラスが例外を送出した場合: エージェントはInterstage BPMにその例外を送り、プロセスインスタンスはエラー状態に
なります。
6.15.2 FTPエージェントの構成
FTPエージェントは、そのエージェントが含まれるプロセスインスタンスに添付されたファイルを自動的に転送します。すべてのエージェ
ントと同様に、FTPエージェントもInterstage BPMのアクティビティを代行します。FTPエージェントのアクティビティが含まれるプロセス定
義から開始されたプロセスインスタンスは、添付されているファイルを自動的に転送します。添付ファイルは、Interstage BPMサーバか
ら接続可能な、どのコンピュータのFTPサーバにも転送されます。
FTPエージェントは、すべてのエージェントと同様に、agentsConfig.xmlで構成されます。この環境設定ファイルの<ActionAgent>セク
ションには、FTPエージェントのデフォルトの設定が含まれています。通常、このファイルのFTPエージェントの設定を変更する必要は
ありません。
FTPエージェントは、Interstage BPMのServiceAgentクラスを使用します。また、ftp.xmlという特別なFTPエージェントの環境設定ファイ
ルも使用します。この環境設定ファイルは、FTPホストのアドレスなど、FTPの設定を定義します。この環境設定ファイルを確認して、使
用する環境に合わせてください。
ftp.xml環境設定ファイル
FTPエージェントの環境設定ファイルであるftp.xmlは、Interstage BPMサーバインストール環境内のエージェントディレクトリ<DMSRoot>/
apps/<アプリケーションID>にあります。
FTPエージェントを構成するftp.xmlファイルのサンプルを以下に示します。
<Services>
<Service>
<ServiceType>FTP</ServiceType>
<ServiceStatusUDA>AgentServiceStatus</ServiceStatusUDA>
<ServiceResultUDA>AgentServiceResult</ServiceResultUDA>
<ServiceSpecificInfo>
<FTPHost><HOSTNAME or IP Address></FTPHost>
<FTPPort></FTPPort>
<FTPUser>anonymous</FTPUser>
<FTPPassword></FTPPassword>
<FTPType>ASCII</FTPType>
<FTPAppend>FALSE</FTPAppend>
<FTPDirectory>%%REMOTE_FTP_DIRECTORY%%
</FTPDirectory>
<FTPFileNames>%%REMOTE_FTP_FILES%%</FTPFileNames>
<Documents>%%OUTGOING_FILES%%</Documents>
</ServiceSpecificInfo>
- 104 -
</Service>
</Services>
このファイル内の一部のタグは、ServiceAgentクラスを使用するすべてのエージェントが利用します。一部のタグはFTPエージェント固
有のものです。
以下の表は、ftp.xmlで使用されているXMLタグを説明しています。
タグ
説明
<ServiceType>
FTPエージェントのサービスタイプは、常にFTPです。サービスタイプが指定されてい
ない場合や、サービスタイプが無効な場合、プロセスインスタンスはエラー状態にな
ります。
このタグは、ServiceAgentクラスを使用するすべてのエージェントが利用します。
<ServiceStatusUDA>
FTPエージェントのアクティビティの状態を保存するUDAの名前です。設定可能な値
は、DoneまたはFailedです。このタグを削除してもFTPエージェントには何も影響があ
りませんが、ユーザはFTPエージェントのアクティビティの状態を確認できなくなりま
す。
<ServiceResultUDA>
FTPエージェントが例外を送出した場合に使用する、エラーメッセージを保存するUDA
の名前です。このタグを削除してもFTPエージェントには何も影響がありませんが、FTP
エージェントが失敗しても、ユーザはエラーが発生したことを確認できなくなります。
<FTPHost>
転送されたファイルを受信するローカルコンピュータのサーバ名またはIPアドレスで
す。デフォルト値は127.0.0.1 (ローカルコンピュータ)です。FTPホストが指定されてい
ない場合や、FTPホストが無効な場合、ファイルは、FTPサーバが使用できる場合は、
そこに転送されます。
このタグはFTPエージェント固有のものです。
<FTPPort>
FTPサーバが使用するポートです。ポートが指定されていない場合は、デフォルトの
FTPポートである21が使用されます。
このタグはFTPエージェント固有のものです。
<FTPUser>
ファイルを転送するFTPユーザのユーザ名です。ユーザ名が無効な場合、ファイル
の転送は失敗し、プロセスインスタンスはエラー状態になります。
このタグはFTPエージェント固有のものです。
<FTPPassword>
ファイルを転送するFTPユーザのパスワードです。
このタグはFTPエージェント固有のものです。
<FTPType>
転送されるファイルのタイプです。設定可能な値は、ASCIIまたはBINARYです。デ
フォルト値はBINARYです。
テキストファイルを転送する場合は、ASCIIを使用します。バイナリファイルを転送す
る場合は、BINARYを使用します。ASCIIまたはBINARY以外の値を指定すると、FTP
エージェントは例外を送出します。
このタグはFTPエージェント固有のものです。
<FTPAppend>
転送されるファイルをリモートファイルに追加するかどうかを指定します。設定可能な
値は、TRUEまたはFALSEです。デフォルト値はFALSEです。
既存のリモートファイルにローカルファイルのコンテンツを追加する場合は、TRUEを
使用します。既存のリモートファイルを上書きする場合は、FALSEを使用します。TRUE
またはFALSE以外の値を指定すると、FTPエージェントは例外を送出します。
このタグはFTPエージェント固有のものです。
<FTPDirectory>
ファイルの転送先のディレクトリを指定するUDAの名前です。FTPサーバからの相対
パスが指定されます。
たとえば、/iflowがREMOTE_FTP_DIRECTORY UDAの値で、ユーザがWindowsシ
ステムで作業している場合、ファイルはC:\Inetpub\ftproot\iflowに転送されます。無
効なディレクトリが指定された場合、プロセスインスタンスはエラー状態になります。
このタグはFTPエージェント固有のものです。
<FTPFileNames>
リモートファイルに使用するファイル名を指定するUDAの名前です。このパラメータ
は、ファイルの名前を転送中に変更するために使用します。
たとえば、プロセスインスタンスにLocalFile.txtというファイルが添付されていて、
- 105 -
タグ
説明
REMOTE_FTP_FILESの値にRemoteFile.txtが設定されている場合、LocalFile.txtは
FTPディレクトリに転送され、RemoteFile.txtというファイル名に変更されます。
REMOTE_FTP_FILESには、複数のファイル名をセミコロン(;)で区切って指定できま
す。REMOTE_FTP_FILESにファイル名が含まれていない場合は、元のファイル名
が使用されます。
<Documents>
FTPディレクトリに転送されるファイルを指定するUDAの名前です。
OUTGOING_FILESには、複数のファイル名をセミコロン(;)で区切って指定できま
す。OUTGOING_FILESにファイル名が含まれていない場合は、プロセスインスタン
スに添付されているすべてのファイルが転送されます。
注意
ファイル名にセミコロン(;)が含まれるファイルは、FTPディレクトリに転送できません。セミコロンはファイル名の区切り文字と見なされる
ので、転送するファイルの名前に含めることはできません。
6.15.3 FTPエージェントの使用
プロセス定義のFTPエージェントを使用する方法について説明します。
1. FTPエージェントを表すActivityノードを作成します。
2. “@FTP”をActivityノードに割当てます。
3. FTPエージェントの環境設定ファイル、ftp.xmlのパラメータに対応する、すべてのUDAをプロセス定義に追加します。
以下は、追加する可能性のあるUDAです。
- AgentServiceStatus
- AgentServiceResult
- REMOTE_FTP_DIRECTORY
- REMOTE_FTP_FILES
- OUTGOING_FILES
REMOTE_FTP_FILESまたはOUTGOING_FILESを追加しない場合は、該当するタグのコンテンツをftp.xmlファイルから削除し
ます。たとえば、転送されるファイルの名前を変更しないと仮定します。この場合REMOTE_FTP_FILESUDAをプロセス定義に
追加する必要はありません。さらに、<FTPFileNames>タグの次のコンテンツをftp.xmlファイルから削除する必要があります。
<FTPFileNames></FTPFileNames>
該当するパラメータがftp.xmlファイルに指定されているにも関わらず、REMOTE_FTP_FILESまたはOUTGOING_FILESを追加
しなかった場合、FTPエージェントアクティビティが活性化されると、プロセスインスタンスはエラー状態となります。
ftp.xml環境設定ファイルの詳細については、「6.15.2 FTPエージェントの構成」を参照してください。
4. FTPエージェントアクティビティを起点として次のアクティビティを活性化する、Done矢印を追加します。
FTPエージェントは、以下のとおり、Doneまたはnullを返します。
- Doneを返した場合、プロセスインスタンスはDone矢印に従って続行します。
- null を 返 し た 場 合 、 プ ロ セ ス イ ン ス タ ン ス は エ ラ ー 状 態 と な り ま す 。 AgentServiceStatusUDA は エ ラ ー 状 態 を 示 し 、
AgentServiceResultUDAには発行されたエラーメッセージが保存されます。
- 次のケースでは、プロセスインスタンスがエラー状態となりますが、AgentServiceStatusUDAおよびAgentServiceResultUDA
は、エラー情報が更新されません。
- FTPエージェントアクティビティに、外向きのDone矢印が設定されていません。
- agentsConfig.xml内のいずれかのデータが正しくないか、または設定されていません。
エラーの理由を確認するには、プロセスインスタンスの履歴を確認する必要があります。
- 106 -
6.15.4 HTTPエージェントの設定
HTTPエージェントは、環境設定ファイルに指定されているURLにデータを送り、そのURLからレスポンスデータを受信します。
<HTTPRequestUDA>タグに指定されているUDAの値を、<HTTPBaseURL>タグに指定されているURLに送り、返されたデータを
<HTTPResponseUDA>タグに指定されているUDAの値として割当てます。
HTTPエージェントは、すべてのエージェントと同様、agentsConfig.xmlで構成されます。この環境設定ファイルの<ActionAgent>セク
ションには、HTTPエージェントのデフォルトの設定が含まれています。通常、このファイルのHTTPエージェントの設定を変更する必要
はありません。
Interstage BPM内にHTTPエージェントを設定する方法について説明します。
HTTPエージェントの環境設定ファイルを作成し、Interstage BPMのエージェントディレクトリ、<DMSRoot>/apps/<アプリケーションID>
に保存します。
環境設定ファイルHTTPagent.xml
以下は、HTTPエージェントの環境設定ファイルのサンプルです。
<HTTPAgent>
<HTTPBaseURL method="POST"
followRedirects="true">{{Field HTTP_URL}}</HTTPBaseURL>
<HTTPHeaderParams name="Content-Type">text/xml;
charset=UTF-8</HTTPHeaderParams>
<HTTPHeaderParams name="User-Agent">I-BPM HTTP Agent
</HTTPHeaderParams>
<HTTPHeaderParams name="accept-charset">UTF-8
</HTTPHeaderParams>
<QueryParams name= "ParamName"> Param value</QueryParams>
<HTTPRequestUDA>HTTP_REQUEST</HTTPRequestUDA>
<HTTPResponseUDA>HTTP_RESPONSE</HTTPResponseUDA>
<HTTPAgentStatusUDA>HTTP_STATUS</HTTPAgentStatusUDA>
</HTTPAgent>
以下の表は、HTTPagent.xmlで使用されているXMLタグを説明しています。
タグ
<HTTPBaseURL>
説明
URLエンドポイントです。<HTTPBaseURL>タグの値は、HTTPエージェントによって呼び
出される、サーブレットなどの外部サービスを指定します。
属性:
method="POST"または"GET"を指定します。HTTPリクエストで使用するリクエストメソッド
を定義します。method属性が指定されていない場合、プロセスインスタンスはエラー状態
になります。"POST"または"GET"以外の属性値を設定した場合は、HTTPエージェントは
失敗します。
followRedirects="true"を指定します。
followRedirectsのデフォルト値はfalseなので、この属性を指定する必要があります。
<HTTPHeaderParams>
エンコードスタイルやコンテンツタイプなどのHTTPヘッダのプロパティを設定します。HTTP
ヘッダは、たとえば、現在のHTTPセッションのリクエスト、レスポンスオブジェクトのプロパ
ティなど、様々なWebオブジェクトプロパティを定義するために使用します。
属性:
name="Content-type"または"User-Agent"を指定します。
"Content-type"は、リクエストされたコンテンツの種類を定義します。以下の値が使用でき
ます。value="text/xml"、およびcharset=UTF-8。
"User-Agent"は、リクエストを送ったクライアント(ユーザエージェント)についての情報を含
みます。
- 107 -
タグ
説明
<HTTPHeaderParams>タグのname属性で指定される値には、現在制限が設けられていな
いことに注意してください。この属性に有効な値はすべて、HTTPヘッダに有効となります。
<QueryParams>
このタグは、HTTPエージェントが"GET"メソッドを使用した場合、必要となります。このタグ
の値は、クエリ文字列として外部サービスに渡されます。<HTTPRequestUDA>タグに指定
されたUDAの値は、"GET"メソッドを使用した場合は使用されないことに注意してくださ
い。
このタグの正しい使用法は以下のとおりです。
<QueryParams name= "ParamName"> Param value</QueryParams>
これは、HTTPエージェントが実行中の以下のようなURL指定となります。
URL?ParamName= Param value
<QueryParams>タグの名前属性には、有効な文字列であれば、すべて指定できます。
<HTTPRequestUDA>
タグ内で指定されたUDAの値は、HTTPリクエストのクエリ文字列の一部となります。
<HTTPAgentStatusUDA>
HTTPサービスのステータスが保存されるUDAです。
<HTTPResponseUDA>
HTTPレスポンスが保存されるUDAです。
6.15.5 HTTPエージェントの使用
プロセス定義のHTTPエージェントを使用する方法について説明します。
1. HTTPエージェントを表すActivityノードを作成します。
2. “@HTTPAgent”をActivityノードに割当てます。
3. HTTPAgent.xmlのパラメータに対応する、すべてのUDAをプロセス定義に追加します。
以下は、追加する可能性のあるUDAです。
- HTTP_URL
- HTTP_REQUEST
- HTTP_RESPONSE
- HTTP_STATUS
4. HTTPエージェントのアクティビティを起点として次のノードを活性化する、Done矢印およびFailed矢印を追加します。
HTTPエージェントは、以下のとおり、DoneまたはFailedを返します。
- Doneを返した場合、プロセスインスタンスはDone矢印に従って続行します。
- Failedを返した場合、プロセスインスタンスはFailed矢印に従って続行します。
HTTPエージェントサンプル
あらかじめ設定されているHTTPのサンプルが、Windowsの場合<Interstage BPMサーバのインストールディレクトリ>/client/samples/
examples/sources/HTTPAgentExample、SolarisまたはLinuxの場合<Interstage BPMサーバのインストールディレクトリ>/client/samples/
examples/sources/HTTPAgentExampleディレクトリに保存されています。このサンプルでは、簡単に実装できるHTTPエージェントが提
供されています。このサンプルのエージェントは、HTTPエージェントの完全な機能を示しています。
この例には、Interstage BPMサーバがインストールされているアプリケーションサーバ上に展開する.warファイルが含まれています。
HTTPAgentExampleディレクトリにあるHTTPAgentExampleInstructions.txtファイルの説明のとおり、HTTPエージェントの実装に進んで
ください。
以下は、追加説明です。
・ 環境設定ファイルのagentsConfig.xmlおよびHTTPAgent.xmlには、この例で使用するHTTPエージェントの設定も含まれています。
HTTPエージェントの設定は、HTTPAgent.xmlファイルに含まれています。agentsConfig.xmlは、HTTPAgent.xmlファイルをエー
ジェントとして指定します。
- 108 -
・ 新しく設定したHTTPエージェントを使用するために、Interstage BPMサービスを再開する必要があります。
・ インポートしたテンプレートのHTTP Agent Example V1.xpdlには、HTTPエージェントが含まれています。エージェントは、ユーザグ
ループがActivityノードに割当てられるのと同じ方法で、Activityノードに割当てられます。ただし、エージェントの名前には、特別
な指定として@記号が付いています。この場合、エージェントの名前は、@HTTPAgentになります。
6.16 タイマーの使用
タイマーの期限が切れると、特定のアクションがトリガされます。タイマーには、Activityノードが活性化された場合に実行が開始される
Activityノードレベルタイマー、またはタイマーを含むプロセス定義から新しいプロセスインスタンスが作成されるたびに実行が開始さ
れるプロセスレベルタイマーがあります。
タイマーはUDAとJavascriptで指定され、Java Actionで設定される時刻とアクションのパラメータで制御されます。タイマーの有効期限
と開始時刻は、絶対時刻を使用した時間指定をすることも、ほかのイベント(アクティビティまたはプロセスインスタンスの開始など)に対
して相対的な時間を指定することも可能です。タイマーに、定期的なトリガアクションを指定することも可能です。また、タイマーは、エ
スカレーション(追加のユーザリストにアクティビティを割当てる)やメールの送信を含む、さまざまなアクションを実行することができます。
タイマーの実行と終了は、キャンセルや再スケジュール、アクティブタイマーの終了またはリセットといったアクションで制御されます。
詳細は、「6.16.3 タイマーの実行を制御する」および「6.16.1 タイマーの定義」を参照してください。
タイマーは、次のノードに設定することができます。
・ Activityノード
・ Delayノード
・ Voting Activityノード
・ Event Activity(Trigger)ノード
・ Compound Activity ノード
使用可能なタイマーの種類の概要は、「3.2.7 タイマー」を参照してください。
6.16.1 タイマーの定義
以下の例では、2000ミリ秒待機してメールを送信するDelayノードにタイマーが追加されます。
ノードにタイマーを追加する方法について説明します。
1. TimerActionオブジェクトのJava Action、およびUDAを定義します。
JavaActionSet timerJASet = WFObjectFactory.getJavaActionSet();
timerJASet.setActionSetDescription("タイマーで実行を制御する"
+ "アクション");
timerJASet.setActionSetName("TimerActions");
JavaAction[] timerJA = timerJASet.createJavaActions(1);
timerJA[0].setActionDescription("メールを送信");
timerJA[0].setActionName("EmailSend");
timerJA[0].setClassName(CLASS_NAME_JAVA_ACTION);
timerJA[0].setMethodName("sendEmail(String,String,String,String,"
+ "String,String,ServerEnactmentContext)");
timerJA[0].setArgumentsUDANames("<E>uda.to</E><E>uda.from</E>"
+ "<E>uda.cc</E><E>uda.bcc</E><E>uda.subject</E>"
+ "<E>uda.body</E><E>sec</E>");
timerJASet.setJavaActions(timerJA);
plan.addDataItemRef("Timer_JavaActionSet",
DataItemRef.TYPE_STRING,
timerJASet.toString());
- 109 -
2. TimerActionオブジェクトを定義します。WFObjectFactoryクラスのgetTimerDef()を使用して、指定された種類のタイマーを作成
します。
TimerAction timerAction = WFObjectFactory.getTimerAction();
timerAction.setJavaActionSet("Timer_JavaActionSet");
3. この段階で、setType(timerType)を使用して、使用するタイマーの種類も定義します。timerType定数に設定可能な値は、TimerDef
インタフェースで取得できます。以下の値があります。
- RELATIVE: 相対時刻タイマーを定義します。
- ABSOLUTE: 絶対時刻タイマーを定義します。
- PERIODIC: 周期タイマーを定義します。
- BUSINESSPERIODIC: ビジネス周期タイマーを定義します。
- BUSINESSRELATIVE: ビジネス相対時刻タイマーを定義します。
TimerDef timer = WFObjectFactory.getTimerDef();
timer.setName("Send mail timer");
timer.setDescription("このタイマーは、2000ミリ秒待機後、"
+ "メールを送信します。");
timer.setType(TimerDef.RELATIVE);
timer.setTime("TimeOfExpiration");
timer.setTimerTimeExpression("DateAdd(Packages.java.util.Date(), 4,\"hh\").getTime();");
timer.addTimerAction(timerAction);
plan.addDataItemRef("TimeOfExpiration",
DataItemRef.TYPE_LONG, "2000");
4. TimerDefオブジェクトを定義します。つまり、TimerDefオブジェクトにTimerActionオブジェクトを付加します。
5. 完了時間を含むUDAの名前を設定します。
6. タイマの有効期限日を計算するJavascriptを設定することもできます。
注意
Javascriptを設定できるのは、絶対時刻タイマー、相対時刻タイマー、および周期タイマーだけです。
- 絶対時刻タイマーの場合、スクリプト評価(script evaluation)の結果は期限となります。しかし、スクリプト評価(script evaluation)
がLongフォーマットの日付時間でない場合は、UDA値が完了時間となります。つまり、完了時間は、スクリプト評価結果(script
evaluation)またはUDA値となります。
- 相対時刻タイマーの場合、スクリプト評価(script evaluation)の結果は参照時間(reference time)となります。UDA値で指定さ
れた時間は、参照時間からの相対的な時間となります。つまり、完了時間は、スクリプト評価(script evaluation)の結果 + UDA
値となります。
この例では、完了時間として、スクリプトが実行されたときから4時間後を設定しています。
timerDef.setTimerTimeExpression("DateAdd(Packages.java.util.Date(), 4,\"hh\").getTime();");
この例では、完了時間として、XML UDAでRequestDateから2日後を設定しています。
timerDef.setTimerTimeExpression("sec.getProcessXMLAttributeElementValue(\"xmlUda\",
"//Request/RequestDate/text()\");");
timerDef.setTime("timerUda"); // timerUda holds the value for 2 days
in long format
TimerActionオブジェクトとTimerDefオブジェクトは、それぞれ異なっています。これらは、どちらを先に作成してもかまいません。
ただし、TimerActionオブジェクトを使用するには、TimerDef.addTimerAction(TimerActionアクション)を使用して、TimerDefオブ
ジェクトに関連付ける必要があります。
- 110 -
7. TimerDefオブジェクトをノードに追加します。
delayNode.addTimer(timer);
6.16.2 期限の追加
プロセス定義またはノードレベルに期限タイマーを付加することで、プロセスインスタンスまたはノードが完了すべき期限を設定するこ
とができます。
以下のサンプルコードは、プロセス定義に期日タイマーを追加する例です。
// 期日タイマーを定義する
plan.startEdit();
TimerDef timerDef = WFObjectFactory.getTimerDef();
timerDef.setName("DueDateTimer");
timerDef.setType(TimerDef.RELATIVE);
plan.addDataItemRef("DueDateExpTime",DataItemRef.TYPE_STRING,
timerDef.setTime("DueDateExpTime");
"300000");
// プロセス定義に、期限タイマーを追加する
plan.setDueDateDef(timerDef);
plan.commitEdit();
// プロセス定義から、期限タイマーを取得する
TimerDef dueDateDef = plan.getDueDateDef(timerDef);
ProcessInstance pi = plan.createProcessInstance();
// プロセスインスタンスから、期限を取得する
Date dueDate = pi.getDueDate();
6.16.3 タイマーの実行を制御する
Interstage BPMでは、活性化されたタイマーの実行を制御できます。活性化されたタイマーを取り消すこと、再スケジュールすること、タ
イマーの期限を再計算するためにリセットすること、またはすぐに実行させることができます。タイマーの実行を制御することによって、
タイマーの実際の期限を変える、または実行を停止させることができます。
注意
タイマーの実行を制御できるのは、プロセスインスタンスの所有者と管理者ユーザだけです。
活性化されたタイマーの実行を制御する方法には、以下があります。
・ タイマーを取り消す: 活性化されたタイマーを取り消すことができます。取り消されたタイマーは、期限が来ても実行されません。し
かし、再スケジュールするか、またはリセットすることによって、再活性化できます。
注意
取り消されたタイマーは、再スケジュールとリセットすることができます。
・ タイマーを再スケジュールする: 活性化されたタイマー、または取り消されたタイマーの期限に、絶対時刻を指定することで、再ス
ケジュールできます。
注意
タイマーを再スケジュールするには、期限に絶対時刻を指定する必要があります。
以下のサンプルコードは、再スケジュールをする例です。
- 111 -
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(2009, 2, 3, 13, 30, 00);
timerInstance.reschedule( cal.getTimeInMillis() );
Assignee of an activity can also re-schedule a DueDate timer along with process owners and the administrators.
注意
アクティビティの担当者、プロセスインスタンスの所有者、または管理者ユーザは、期限タイマーを再スケジュールできます。
・ タイマーをリセットする: 活性化されたタイマー、または取り消されたタイマーをリセットすると、システムは、再びUDAからタイマー値
を取得するか、スクリプトを再評価します。リセットされると、タイマーは新たに定義された完了時刻に終了されます。
・ タイマーの満了: 活性化されたタイマーは指定された期限に関係なく、特定のアクションがトリガされます。
注意
- 期限タイマーは、特定のアクションがトリガされません。
- タイマーが、再スケジュール、リセット、または満了した場合、そのタイマーインスタンスは取り消されます。そして、新しいタイ
マーインスタンスが作成されます。
6.16.4 タイマーインスタンス履歴
タイマーインスタンスの履歴情報は、監査のために保存されます。タイマーインスタンスが変化するたびに、その変化を保存し、あとで
それを見ることができます。以下のサンプルコードは、タイマーインスタンス履歴を取得する例です。
TimerInstance[] tInsts = processInstance.getTimerInstances(timerDefId);
for (int i = 0; i < tInsts.length; i++) {
TimerInstance tInstance = tInsts[i];
System.out.println(tInstance.getId() + "\t"
+ tInstance.getName() + "\t"
+ tInstance.getDescription() + "\t"
+ tInstance.getTimerInstanceId() + "\t"
+ new Date(tInstance.getTimerExpirationTime()) + "\t"
+ tInstance.getState() + "\t" + tInstance.getActor();
}
6.16.5 ビジネスカレンダーの使用
Interstage BPMでは、その有効期限と関連付けて特定のEventをトリガするタイマーを作成することができます。ビジネスカレンダー機
能を使用して、ビジネスタイマーを作成することができます。ビジネスタイマーは特別な種類のタイマーで、営業時間と営業日だけを
「カウント」し、営業時間内に有効期限が切れます。営業時間や営業日は、ビジネスカレンダーで指定します。
ビジネス定期タイマーとビジネス相対時刻タイマーは、ビジネスカレンダーで使用します。ビジネスカレンダーはタイマーとの組合せで
使用されるので、以下の種類のノードで使用することができます。
・ Activityノード
・ Delayノード
・ Voting Activityノード
・ Event Activity(Trigger)ノード
使用可能なタイマーの種類の概要は、「3.2.7 タイマー」を参照してください。
ここで紹介されているプログラミング例のすべてのコードは、TriggerTimerSample.javaサンプルファイル内にあります。
- 112 -
ビジネスカレンダーの設定
Interstage BPMでは多種多様なビジネスカレンダーを利用できます。使用するプロセス定義にビジネスカレンダーをまだ定義していな
い場合、Interstage BPMはInterstage BPMのインストール時にデフォルトで設定されたビジネスカレンダーを使います。
独自のカスタムビジネスカレンダーを作成することも、デフォルトのビジネスカレンダーをニーズに合わせて変更することもできます。組
織の実状に合わせて必要な数だけビジネスカレンダーを作成し、プロセス定義またはプロセスインスタンスごとに異なるビジネスカレン
ダーを使用できます。カレンダー名はカレンダーのファイル名に対応しています。カレンダーファイルの拡張子は.calで、これによりビジ
ネスカレンダーとして識別できます。
デフォルトのカレンダー(ファイル名Default.cal)は、インストール時に提供されます。他のカレンダーがInterstage BPMに設定されてい
なくても、Interstage BPMプロセスインスタンスにビジネスタイマーを追加し、デフォルトのカレンダーで営業日と営業時間を指定できま
す。デフォルトのカレンダーは、全機能を備えたビジネスカレンダーのサンプルも提供します。
カスタム化したビジネスカレンダーの作成や、デフォルトのビジネスカレンダーの変更に関する詳細については、『Interstage BPMサーバ
管理者ガイド』を参照してください。
ビジネスカレンダーの割当て
カレンダーの名前(拡張子.calを除くファイル名)をユーザ定義属性(UDA)__businessCalendarに割り当てることで、そのカレンダーを
プロセス定義やプロセスインスタンスに割り当てることができます。このUDAはビジネスタイマーと期限にのみ使用されます。
例えば、ドイツの子会社で実行するプロセスインスタンス用として使いたいカレンダーがあり、それをGerman.calと呼ぶことにします。あ
るアクティビティを従業員の1人に割り当てたいが、しばらくこの従業員の手が空いていない場合に、他の従業員に割り当てたいとしま
す。アクティビティを割り当てなおすタイミングは、ビジネスカレンダーとタイマーの定義によって異なります。
ビジネスカレンダーをプロセス定義に割り当てるには、以下の操作を行います。
1. プロセス定義にSTRING型のUDAを追加し、カレンダーファイルの名前をその値として割り当てます。
例えば、STRING型のUDAをドイツの子会社事業部のプロセス定義に追加し、Germanという値を割り当てることもできます。
plan.addDataItemRef("__businessCalendar", DataItemRef.TYPE_STRING, "German");
2. 任意の名前、タイプ、初期値で、UDAをプロセス定義に追加します。UDAの値は、STRINGとして指定し、タイマーの開始時刻
を表します。
以下の例では、営業時間は現在の時刻に相対して2分置いて設定されます。
plan.addDataItemRef("__udaStartTime", DataItemRef.TYPE_STRING, "BT(00:02:00)");
営業時間に使用できる時刻コードと日付コードの一覧については、「6.16.6 タイマーの時刻コードと日付コード」を参照してくだ
さい。
3. 例えばActivityノードなどの、ビジネスの定期タイマーまたは相対タイマーを割り当てるノードを追加します。
Node orderActivity = plan.addNode("Order",Node.TYPE_ACTIVITY);
4. 名前、説明、UDA __udaStartTimeで定義された開始時刻を指定して、また相対タイマーと定期タイマーのいずれであるかを定
義して、タイマーを作成します。
以下の例では、ビジネスの相対タイマーを使用します。
TimerDef busCalTimer = WFObjectFactory.getTimerDef();
busCalTimer.setName("busCalTimer");
busCalTimer.setDescription("Timer to show the business calendar functionality");
busCalTimer.setTime("__udaStartTime");
busCalTimer.setType(TimerDef.BUSINESSRELATIVE);
5. タイマーをActivityノードに追加します。
TimerAction busCalTimerAction = WFObjectFactory.getTimerAction();
// タイマーの期限が切れるときに実行されるJavaActionSetを含む
// UDAの名前を設定します。
busCalTimerAction.setJavaActionSet("BusCalActionSet");
// このタイマー定義にJavaActionSetを指定するTimerAction
// を追加します。このタイマーの期限が切れると
- 113 -
// アクションの定義済みJavaActionSetが実行されます。
busCalTimer.addTimerAction(busCalTimerAction);
// タイマーをActivityノードに追加します。
orderActivity.addTimer(busCalTimer)
ビジネスカレンダーを特定のビジネスタイマーや期限に割り当てることもできます。ビジネスタイマーや期限は、このビジネスカレ
ンダーに基づいて計算されます。以下の表現を使用します。
UC(<ビジネスカレンダー>):
<ビジネスカレンダー>には、拡張子.calを除いたビジネスカレンダーの名前を指定します。
以下の例では、California.calと呼ばれるビジネスカレンダーをビジネスタイマーの計算に使用します。
plan.addDataItemRef("__udaStartTime", DataItemRef.TYPE_STRING,
"UC(California);BT(00:02:00)");
. . . TimerDef busCalTimer = WFObjectFactory.getTimerDef();
. . . busCalTimer.setTime("__udaStartTime");
busCalTimer.setType(TimerDef.BUSINESSRELATIVE);
. . .
JavaScript関数setProcessAttributeとUDA __businessCalendarを使えば、プロセスインスタンスの実行中でもカレンダーの変更が
可能です。ビジネスカレンダーをEngland.calに変更する場合、以下のスクリプトを使用します。
sec.setProcessAttribute("__businessCalendar","England");
6.16.6 タイマーの時刻コードと日付コード
タイマーを設定するとき、時刻コードと日付コードを使って時刻を指定できます。以下の例では、現在の時刻に対して相対的に表され
る営業時刻を設定しています。時刻コードは太字で示しています。
plan.addDataItemRef("__udaStartTime", DataItemRef.TYPE_STRING,
"BT(00:02:00)");
使用できる時刻コードと日付コードは以下のとおりです。
時刻コード
コード
意味
例
AT
1日のうちの絶対時刻を設定します。
AT(16:30:00): その日の午後4時30分。
CT
1日の終業時刻に対して相対的に表され
る時刻を設定します。
CT(00): 終業時刻。
CT(-02:00:00): 終業時刻の2時間前。
設定可能な値: 00またはマイナスの時間。
一般的には、終業時刻までの相対的な
時刻を計算するために、終業時刻ととも
にマイナスの時間を使用します。
OT
1日の始業時刻に対して相対的に表され
る時刻を設定します。
OT(00): 始業時刻。
OT(02:00:00): 始業時刻の2時間後。
設定可能な値: 00またはプラスの時間。
BT
現在の時刻に対して相対的に表される営
業時刻を設定します。
BT(04:30:00): 営業時刻で現時刻から4時間30分後。
BT(-02:00): 営業時間の2時間前。
BT(00): 現在の時刻が営業時刻ではない場合に、時
刻を変えずに次の営業時刻を順方向検索することがで
きます。営業日によって営業時刻が異なる場合は、こ
れを使用する必要があります。
- 114 -
コード
意味
例
BT(-00): 直前の営業時刻に逆方向検索する場合に使
用します。現在の時刻がすでに営業時刻になっている
場合は無効です。
日付コード
コード
BD
意味
営業日を設定します。
例
BD(4): 今日から4営業日後。
BD(0): その日が営業日の場合は同じ日、営業日でな
い場合は翌日。
BD(-0): その日が営業日の場合は同じ日、営業日でな
い場合は前日。
RD
WD
現在の日付から日付を相対的に設定し
ます。
RD(7): 1週間後。
曜日を設定します。
WD(1): その週の日曜日。
設定可能な値: 1以上。
WD(7): その週の土曜日。
RD(-1): 1日前。
WD(8): 次の週の日曜日。
今日以降の次の曜日を設定します。
WN(1): 今日以降の次の日曜日。
設定可能な値: 1から7。
WN(7): 今日以降の次の土曜日。
RM
将来の月を相対的に設定します。その月
に十分な日数がないため同じ日に設定
できない場合は、月の最後の日になりま
す。
RM(3): 3か月後。
DM
月の特定の日を設定します。
DM(1): 月の最初の日。
設定可能な値: -1、1から31
DM(-1): 月の最後の日。
月の特定の営業日を設定します。
BM(1): 月の最初の営業日。
設定可能な値: -1、1から31
BM(-1): 月の最後の営業日。
その年の特定の日を設定します。
DY(1): 年の最初の日。
設定可能な値: -1、1から365
DY(-1): 年の最後の日。
その年の特定の営業日を設定します。
BY(1): 年の最初の営業日。
設定可能な値: -1、1から365
BY(-1): 年の最後の営業日。
WN
BM
DY
BY
6.17 リモートサブプロセスのモデル化
リモートサブプロセスは、リモートコンピュータのワークフローサーバ上で実行されるサブプロセスです。リモートコンピュータのワークフ
ローサーバは、たとえば、ほかのInterstage BPMサーバなどです。
リモートサブプロセスは、親プロセス定義ではRemote Subprocessノードによって表されます。親プロセスとリモートサブプロセスとの間の
やり取りは、以下のステップで行われます。
1. Remote Subprocessノードに到達すると、ローカルコンピュータのワークフローサーバがStartProcess要求をリモートコンピュータの
ワークフローサーバに送ります。このとき、リモートサブプロセスインスタンスが処理するUDAも送られます。
2. リモートコンピュータのワークフローサーバはこの要求を受け取って、プロセスインスタンスを開始します。
3. リモートプロセスインスタンスが完了すると、それを実行したワークフローサーバがProcessCompletedメッセージを返します。この
とき、サブプロセスインスタンスの結果も返されます。
- 115 -
4. ローカルコンピュータのワークフローサーバはこのメッセージを受け取り、結果を取り込み、Remote Subprocessノードを完了して、
プロセスインスタンスが次のノードに進めるようにします。
このやり取りを正常に行うためには、親プロセス定義に以下を定義する必要があります。
・ リモートプロセス定義のURI
・ やり取りされるUDAの識別子
・ サブプロセス定義の戻り値
6.17.1 親とリモートサブプロセス定義を設計
ここでは親とサブプロセス定義を設計する方法を説明します。以下のサンプルプロセス定義を使って主なステップを説明します。
図6.3 リモートサブプロセスノードとの親プロセス定義
- 116 -
図6.4 リモートサブプロセス定義
サンプルファイルRemoteSubProcess.javaで、プログラミングコードの全体を参照できます。
親とリモートサブプロセス定義を設計するには、以下の手順に従います。
1. サブプロセス定義を作成します。Startノード、一つ以上のExitノード、および必要なActivityノードをサブプロセス定義に追加しま
す。また、前後にパスされるUDAsを特定します。
サンプルプログラムでは、サブプロセス定義を作成するためにcreateRemoteSubPlan()が呼び出されています。
Plan subPlan = createRemoteSubPlan();
サンプルサブプロセス定義は、Startノード、Activityノードおよび2つのExitノードから成り立っています。Exitノードは親プロセス
定義によって処理される必要があるサブプロセス定義の可能な結果を定義します。
Node exitNodeApp = plan.addNode("Approved", Node.TYPE_EXIT);
exitNodeApp.setPosition(new Point(500, 350));
Node exitNodeRej = plan.addNode("Rejected", Node.TYPE_EXIT);
exitNodeRej.setPosition(new Point(200, 350));
以下のUDAsはサンプルサブプロセス定義で作成されます。
plan.addDataItemRef("Name",
DataItemRef.TYPE_STRING, "John Smith");
plan.addDataItemRef("Number",
DataItemRef.TYPE_STRING, "0123456789");
plan.addDataItemRef("Amount",
DataItemRef.TYPE_FLOAT, "0.0");
plan.addDataItemRef("Limit",
DataItemRef.TYPE_FLOAT, "0.0");
2. 親プロセス定義を作成し、編集モードに設定します。
plan = WFObjectFactory.getPlan();
plan.setWFSession(adminSession);
plan.startEdit();
3. 親プロセス定義では前後にパスされるUDAsを作成します。サンプルプログラムでは以下のUDAsが作成されます。
plan.addDataItemRefWithId("Name", "Name",
DataItemRef.TYPE_STRING, "John Smith");
plan.addDataItemRefWithId("SSN", "SSN",
DataItemRef.TYPE_STRING, "0123456789");
- 117 -
plan.addDataItemRefWithId("LoanAmount", "Loan Amount",
DataItemRef.TYPE_FLOAT, "0.0");
plan.addDataItemRefWithId("ApprovalLimit", "Approval Limit",
DataItemRef.TYPE_FLOAT, "0.0");
注意
プロセス定義が関わった同じUDAに違う名前を使用できます。ただし同じデータタイプにしてください。
4. Startノード、一つ以上のExitノードおよび必要なActivityノードを親プロセス定義に追加します。
5. 親プロセス定義にRemote Subprocessノードを追加します。
Node RemoteSubProcessNode = plan.addNode("Remote",
Node.TYPE_REMOTE_SUB_PROCESS);
RemoteSubProcessNode.setPosition(new Point(400, 300));
6. 前後にパスされる必要があるUDAsのデータマッピングを定義します。ノードインタフェースの以下のメソッドを使用します。
addDataMappingElement(<UDA identifier in parent process definition>,
<UDA identifier in subprocess definition>,<direction of data flow>)
親からリモートサブプロセスへデータ値を渡すとき、データフローの方向としてDataItemMappingElement.INを指定してください。
リモートサブプロセスから親プロセスへデータ値を渡すとき、DataItemMappingElement.OUTを指定してください。データ値を渡
すのが双方向のときは、DataItemMappingElement.INOUTを指定してください。
サンプルプログラムでは、以下のデータマッピングが定義されます。
RemoteSubProcessNode.addDataMappingElement("Name","Name",
DataItemMappingElement.IN);
RemoteSubProcessNode.addDataMappingElement("SSN","Number",
DataItemMappingElement.IN);
RemoteSubProcessNode.addDataMappingElement("LoanAmount", "Amount",
DataItemMappingElement.IN);
RemoteSubProcessNode.addDataMappingElement("ApprovalLimit", "Limit",
DataItemMappingElement.OUT);
7. 以下のメソッドを使用し、親とサブプロセス定義を接続します。それにはリモートサブプロセス定義のURIとサーバがかかわった
ワークフローで使用される通信プロトコルを指定してください。
RemoteSubProcessNode.setSubPlanURI("asap:" +
subPlan.getPlanURI());
Interstage BPMはワークフローサーバ間のコミュニケーションの2つのオープンプロトコル、シンプルワークフローアクセスプロトコル
(SWAP)と非同期サービスアクセスプロトコル(ASAP)をサポートします。これらのプロトコルはXMLメッセージをワークフローサー
バの間でHTTPを超えて渡します。
プロセスの統合をInterstage BPMサーバ上で実行するときASAP(asapと指定)の使用をお薦めします。Collaboration Ringのみと
SWAP(swapと指定)を使用します。Collaboration Ring連携に関する詳細はお近くのFujitsuサポートセンターに連絡してくださ
い。
8. 親プロセス定義でノードを接続するために矢印を追加します。サブプロセスが戻る可能性を考慮して外向きの矢印をRemote
Subprocessノードに必ず追加します。結果値はリモートサブプロセス定義のExitノードの名前に対応しています。
9. Remote Subprocessノードには、1つ以上の外向きの矢がある場合があります。親プロセスが再開するときは1つの矢印だけが選
択されます。選択された矢印はリモートサブプロセスの結果に一致するものです。サンプルプログラムでサブプロセスは可決か
否決のいずれかを戻します。
Arrow ExitSubProcessApp = plan.addArrow("Approved", RemoteSubProcessNode, activityNodeAfter);
Arrow ExitSubProcessRej = plan.addArrow("Rejected", RemoteSubProcessNode, exitNode);
- 118 -
注意
サブプロセス定義のExitノードの名前と外向きの矢印の名前は大文字・小文字も同一でなければなりません。
6.17.2 実行中のリモートサブプロセス定義
リモートサブプロセス定義を実行できるように、Interstage BPM連携ユーザはローカルおよびリモートInterstage BPMサーバで構成され
なければなりません。:
・ ローカルInterstage BPMサーバでは、ユーザはリモートInterstage BPMサーバで認証可能であると指定してください。このユーザは
リモートInterstage BPMサーバにサブプロセスインスタンスを作成します。
・ リモートInterstage BPMサーバでは、ユーザはローカルInterstage BPMサーバで認証可能であると指定してください。このユーザは
リモートサブプロセスインスタンスの結果をローカルInterstage BPMサーバに戻します。
Interstage BPM連携ユーザはInterstage BPMサーバのSWAPLinkageUserNameパラメータとSWAPLinkagePasswordで構成されます。
詳しくは『Interstage BPMサーバ 管理者ガイド』を参照してください。
サブプロセス定義がInterstage BPM連携ユーザに属さない限り、発行されたサブプロセス定義のみがリモートに呼び出されます。
Interstage BPM連携ユーザはドラフト状態にあるリモートサブプロセス定義を呼び出すことができます。よって、以下のオプションの一
つをサブプロセス定義のテストに使用します。
1. 実行する前に、リモートサブプロセス定義を発行します。
2. ローカルInterstage BPMサーバに構成されたInterstage BPM連携ユーザを調べます。それをサブプロセス定義の所有者として
使用します。
3. ローカルInterstage BPMサーバに構成されたInterstage BPM連携ユーザを変更します。Interstage BPM連携ユーザとしてサブプ
ロセス定義の所有者を指定します。
6.17.3 リモートサブプロセスのエラー処理
親プロセス定義でRemote SubprocessノードのエラーJava Actionを定義することでリモートサーバが開始しないなどの理由から、リモー
トサブプロセス開始が失敗した場合の処理が可能です。このように、サブプロセスが開始できなければプロセスインスタンスがエラー状
態になるのを避けられます。
リモートサブプロセスが開始に失敗すると、リモートサブプロセスレベルのエラーJava Actionセットが活性化されます。 Java Actionのこ
のタイプに関する詳細は「6.3.8 エラーJava Actionの使用」を参照してください。
エラーアクションセットをRemote Subprocessノードに設計し、割り当てるには、以下の手順に従います。
1. WFObjectFactoryクラスからgetJavaActionSet()を使用して、新しいJavaActionSetオブジェクトを作成します。
JavaActionSet errorJavaActionSet = WFObjectFactory.getJavaActionSet();
2. Java ActionセットにJava Actionsの必要数を生成します。以下の例では、一つのJava Actionが生成しています。
JavaAction[] errorJavaActions = errorJavaActionSet.createJavaActions(1);
3. Java Actionセットを定義します。
errorJavaActions[0]
.setActionName("WriteLogEntry");
errorJavaActions[0]
.setActionDescription("Writes a log entry in case the Remote Subprocess could not be started");
errorJavaActions[0]
.setMethodName("writeLogEntryWithException(String,ServerEnactmentContext)");
errorJavaActions[0]
.setClassName(CLASS_NAME_JAVA_ACTION);
errorJavaActions[0]
.setArgumentsUDANames("<E>uda.LogEntry</E><E>sec</E>");
errorJavaActionSet.setJavaActions(errorJavaActions);
- 119 -
4. リモートサブプロセスノードにJava Actionセットを割り当てます。
RemoteSubProcessNode.setJavaActionSet(errorJavaActionSet,
JavaActionSet.NODE_ERROR);
6.18 Compound Activityノードの使い方
Compound Activityノードは、プロセスのフェイズを、マイルストーンはフェイズの終了を表します。フェイズは様々なノードや矢印を含
んだ入れ物です。いったんフェイズが完了すると、プロセス内のマイルストーンは達成されたことになり、プロセスは次のアクティビティ
またはフェイズに遷移します。また、フェイズには期限を設定することができます。この期限はタイマーとは別に設定できます。
Compound Activityノードは、入れ子になった子ノードを持ちます。子ノードとして、StartノードとExitノードが必要です。Compound Activity
ノードの定義については、「6.18.1 Compound Activityノードの定義」を参照してください。
Compound ActivityノードとCompound Activityノード内に入れ子にされたノードインスタンスは、親のプロセスインスタンスと同じプロセ
ス定義Idを持ちます。この入れ子にされたノードインスタンスは、Compound Activityノードの外にアクセスすることはできません。
以下の図は、Compound Activityノードの定義例です。
図6.5 Compound Activityノード
Compound Activityノードに対するワークフロー
プロセスインスタンス内でCompound Activityノードに制御が移ると、以下のように処理が行われます。
1. Compound Activityノードのワークアイテムが作成されます。ワークアイテムは、WaitingForSubProcessの状態になります。
2. 子のStartノードが活性化されます。
注意
Compound Activityノードは、内部にStartノードとEndノードを持たなければなりません。
3. Compound Activityノードの状態はWaitingForSubProcessに変化し、子ノードが実行されます。
4. 子のExitノードに達すると、以下のようになります。
- Compound Activityノードは終了し、完了状態に変化します。
- Compound Activityノードのワークアイテムは、削除されます。
- Compound Activityノードから出ている外向き矢印は、子のExitノードと同じものが活性化されます。
注意
- 子のExitノードの名前が、Compound Activityノードから外向きに出ている矢印のどれかと名前が同じであるかどうか確認し
てください。
- Compound Activityノードに対するワークアイテムが、矢印を選択することによって完了したとき、すべての子ノードインスタン
スは中止されます。そのワークアイテムは削除され、Compound Activityノードは、完了状態になります。
Compound Activityノードの詳細は、「3.2.10 ノードタイプ」を参照してください。
- 120 -
6.18.1 Compound Activityノードの定義
前提条件
Compound Activityノードをプロセス定義に追加するには、編集モードにする必要があります。
Compound Activityノードを定義するには
1. Compound Activityノードを作成するには、addNode()メソッドを使います。nodeTypeにTYPE_COMPOUND_ACTIVITYをセット
してください。
Node activity = plan.addNode("CompoundActivity",
Node.TYPE_COMPOUND_ACTIVTY);
次のサンプルコードは、CompoundNodeという名前のCompound Activityノードをプロセス定義planに追加しています。
// Adding Compound Activity Node
Node compoundNode =
plan.addNode("CompoundNode",Node.TYPE_COMPOUND_ACTIVITY);
compoundNode.setRole("SampleGroup");
compundNode.setSize(new Dimension(200,100));
2. com.fujitsu.iflow.model.workflow.NodeインタフェースのaddChildNode()APIを使って、子ノードを追加します。
com.fujitsu.iflow.model.workflow.Node
次のサンプルコードは、Compound Activityノードに子ノードを追加しています。
//Adding child nodes
Node subStartNode = compoundNode.addChildNode("SubStart",
Node.TYPE_START);
Node subActivityNode =
compoundNode.addChildNode("SubActivity",Node.TYPE_ACTIVITY);
subActivityNode.setRole("SampleGroup");
//Exit Node name should be same as Compound Activities' outgoing Arrow
name
Node subExitNode = compoundNode.addChildNode ("CommonName",
Node.TYPE_EXIT);
3. 子ノードに矢印を追加します。Compound Activityノードの外向き矢印の名前と、Compound Activityノードの内部のExitノードの
名前が一致していることを確認してください。
次のサンプルコードは、それぞれの子ノードを矢印で接続しています。
plan.addArrow("SubArrow1", subStartNode, subActivityNode);
plan.addArrow("SubArrow2", subActivityNode, subExitNode);
次のサンプルコードは、子のExitノードと同じ名前の外向き矢印を、Compound Activityノードから接続しています。
plan.addArrow("CommonName", compoundNode, actNode);
注意
Compound Activityノード内部の子ノードからCompound Activityノードの外に、矢印を定義することはできません。
6.19 ダイナミックサブタスクの使い方
活性化している作業があるとき、その作業を完了させるために、作業を分割してサブタスクとし、それらのサブタスクに異なる担当者を
割り当てたい場合があります。このような場合、動的にサブタスクを作成して、このサブタスクを異なる作業者に割当てることが可能で
す。作成したサブタスクを、ダイナミックサブタスクと呼びます。
- 121 -
サブタスクを活性中のアクティビティ(Activity1)に追加するには、子のダイナミックノードインスタンスを作成し、作業者を割当てます。
作成した子のダイナミックノードインスタンスは、Activity1の子のダイナミックノードインスタンスとなり、指定した担当者のワークアイテム
がサブタスクとして作成されます。
注意
サブタスクを追加するには、ノードインスタンスが、活性またはサブプロセスで待機中のどちらかの状態である必要があります。
ノードインスタンスをアクティビティに追加すると、そのノードインスタンスの状態はサブプロセスで待機中に、ワークアイテムの状態はサ
ブプロセスで待機中に変化します。子のダイナミックノードインスタンスと関連するサブタスクの状態は、活性中に変化します。すべて
のサブタスクが完了したとき、そのタスクは完了となります。
注意
子のダイナミックノードインスタンスは、子のダイナミックノードインスタンスが完了または中止になったとき、削除されます。
子のダイナミックノードインスタンスには、さらに子のノードインスタンスを追加することができ、ダイナミックノードインスタンスを階層化で
きます。
子のダイナミックノードインスタンスには、以下を設定することができます。
・ 名前
・ 説明
・ 優先度
・ コメント
・ 所有者
・ Order(一覧表示する際に利用可能なタスクの順序)
・ 担当者
・ Point(画面表示する際に利用可能な位置情報)
子のダイナミックノードインスタンスに、期限を設定することができます。
子のダイナミックノードインスタンス(サブタスク)に、以下のものは設定できません。
・ JavaAction
・ Javascript
・ タイマー
・ トリガ
・ イテレータ(Iterator Count)
・ 取戻しフラグ
・ トランザクションフラグ
・ サブプロセス
・ チェインドサブプロセス(Chained Process)
・ リモートサブプロセス
・ 矢印(サブタスク作成時に、completeという名前の矢印が設定されます。)
・ フォーム
- 122 -
タスクにサブタスクを追加する
以下の手順は、ノードインスタンス(nodeInstance)に、子のダイナミックノードインスタンス(newNodeInst)を追加する方法を示していま
す。
1. プロセスインスタンスを開始し、ノードインスタンスを活性化します。例えば、nodeInstanceが活性化されるとします。
2. 活性化したノードインスタンス上に 、addChildDynamicNodeInstance()APIを使って 、子のダイナミックノードインスタンス
(newNodeInst)を作成します。詳細は、下記サンプルコードを参照してください。
// create dynamic node instance
ProcessInstance procInst = … // Get process instance
String[] assignees = {"user1","user2"}
procInst.startEdit();
NodeInstance newNodeInst = nodeInstance.addChildDynamicNodeInstance("SubTask",assignees) ;
newNodeInst.setDesc("Description of this sub task");
newNodeInst.setOrder(10);
newNodeInst.setPriority(Node.PRIORITY_MEDIUM);
procInst.commitEdit();
参照
詳 細 は 、 『 API Javadoc マ ニ ュ ア ル 』 の com.fujitsu.model.workflow
addChildDynamicNodeInstance()を参照してください。
パ ッ ケ ー ジ の NodeInstance ク ラ ス の
ここで、newNodeInstは活性化状態となり、nodeInstanceはサブプロセスの完了待ち状態になります。newNodeInstに対して作成
されたワークアイテムが、nodeInstanceのワークアイテムのサブタスクとなります。
注意
親のノードインスタンス、および子のノードインスタンスは、それぞれgetParentNodeInstance()、およびgetChildNodeInstances()API
を使用して取得することができます。
6.20 ダイナミックプロセスの使い方
プロセスインスタンスやワークアイテムの実行中に、プロセス定義が存在しないアクティビティを実施することがあります。言い換えると、
プロセスが定義されていないアクティビティをプロセスの実行時に動的に定義することがあります。
ダイナミックプロセスインスタンスは、プロセス定義を登録しないで作成することができます。また、ダイナミックプロセスは矢印を持ちま
せん。ダイナミックプロセスを完了させるためには、ダイナミックプロセス中に動的に作成されたダイナミックタスクを完了させる必要があ
ります。
ダイナミックプロセスインスタンスを作成するには、WFObjectFactory.createDynamicNodeInstance()メソッドを使用します。
注意
ダイナミックプロセスを作成するには、WFAdminSession.createApplicationSpace(String applicationId)メソッドを使ってアプリケーション
スペースを作成し、アプリケーションIDを決定しておく必要があります。
WFObjectFactory.createDynamicNodeInstance() メ ソ ッ ド を 使 っ て 、 ダ イ ナ ミ ッ ク プ ロ セ ス を 作 成 す る に は 、 あ ら か じ め
WFSession.chooseApplication()メソッドを使って、使用するアプリケーションIDを選択しておく必要があります。
WFSession.chooseApplication()メソッドを実行するとき、システム以外のアプリケーションIdを指定する必要があります。
ダイナミックプロセスとダイナミックノードインスタンスを作成するには
以下はダイナミックプロセスを作成し、ノードインスタンスとタスクを作成する手順を示しています。
- 123 -
1. ダイナミックプロセスの作成と開始には、WFObjectFactory.createDynamicNodeInstance()APIを使います。以下のサンプルコード
は、ダイナミックノードインスタンスを作成し、ルートのタスクを取得する手順を示しています。
// create dynamic process instance
NodeInstance nodeInst =
WFObjectFactory.createDynamicNodeInstance(wfSession, "Root Task");
2. ダイナミックプロセスインスタンスにノードインスタンスを作成します。
ダイナミックプロセスインスタンスの名前と、そのプロセスインスタンス上に作成されるノードインスタンスの名前には、同じものが
設定されます。
ノードインスタンスの名前やほかの属性値を変えたい場合は、変更することができます。以下のサンプルコードを参照してくださ
い。
// create dynamic node instance
ProcessInstance procInst = nodeInstance.getProcessInstance();
procInst.startEdit();
nodeInst.setName("Modified task name");
nodeInst.setDesc("Description of this sub task");
nodeInst.setOrder(10);
nodeInst.setPriority(Node.PRIORITY_MEDIUM);
procInst.commitEdit();
注意
ダイナミックノードインスタンスが作成されたあと、プロセスインスタンスの作成者が、ノードインスタンスの所有者として設定されま
す。そして、そのノードインスタンスの所有者のワークアイテムが作成されます。
3. 活性化したダイナミックノードインスタンスに、子のダイナミックノードインスタンスを付加します。ダイナミックノードインスタンスは、
サブプロセスの完了待ち状態になります。子のダイナミックノードインスタンスは活性状態になります。以下のサンプルコードを参
照してください。
procInst.startEdit();
String[] assignees = String{"user01","user02"};
nodeInst.addChildDynamicNodeInstance("NewTask", assignees);
nodeInst.setDesc("Description of this sub task");
nodeInst.setOrder(10);
nodeInst.setPriority(Node.PRIORITY_MEDIUM);
procInst.commitEdit();
6.21 決定表
決定表を使うことにより、意思決定のための詳細なルールをプログラミングすることなく作成できます。
決定表は、表に基づいて、動的なルールの管理を行います。そのため、ユーザは、複雑なルールエンジンの基盤の学習・開発および
サポートを行う必要がなくなります。
決定表ファイル(.dtファイル)は、プロセス定義とは独立して存在します。このことにより、ビジネスユーザが業務用語を使用して決定表
を作成でき、また、決定表の作成作業を、より技術的な作業であるプロセス定義の作成から分離することができます。
6.21.1 決定表の概念
決定表は、以下のものから構成されます。
・ 「条件変数」と呼ばれる入力変数の一覧 (例 : Deal Amount)
・ 「結果変数」と呼ばれる出力変数の一覧 (例 : Discount Rate)
・ 入力変数に関する条件を記述した「条件」 (例 : 'Deal Amount > 5000' or 'Deal Amount <= 3000')
・ 出力変数の値を格納した「結果」 (例 : Discount Rate に 35 を設定する)
- 124 -
・ 様々な条件と結果を結びつける「決定ルール」 (例 : 条件 [Deal Amount > 5000] が成立する場合、結果 [Discount Rate に 35 を
設定する]を適用する)
決定表では、入力変数(条件変数)に渡される値をもとに、条件の一覧のうち、どれに合致するかが評価されます。
合致した条件に対応する結果が選択され、結果の値が出力変数(結果変数)に設定されます。
決定表の作成時には、条件変数の作成、結果変数の作成、条件の作成、結果の作成、および条件と結果の対応づけ(決定ルールの
作成)を主に行います。
決定表の例は、以下のような図になります。
図6.6 決定表の概念
上記の例では、CUSTOMER_LEVELとDEAL_AMOUNTが入力変数(条件変数)です。DISCOUNT_RATEとSALES_MAN_BONUS
が出力変数(結果変数)です。
一覧に載っている決定ルールは、以下のとおりです。
・ CUSTOMER_LEVEL の 値 が GOLD
かつ
SALES_MAN_BONUSの値に35を設定する
DEAL_AMOUNT の 値 が 500000 よ り 大 き い 場 合 、 DISCOUNT_RATE と
・ CUSTOMER_LEVEL の 値 が SILVER か つ DEAL_AMOUNT の 値 が 500000 よ り 大 き い 場 合 、 DISCOUNT_RATE と
SALES_MAN_BONUSの値に25を設定する
・ CUSTOMER_LEVEL の 値 が REGULAR か つ DEAL_AMOUNT の 値 が 500000 以 上 の 場 合 、 DISCOUNT_RATE と
SALES_MAN_BONUSの値に15を設定する
決定表では、決定ルールは上から順に評価され、最初に合致した条件に対応する結果の値が採用されます。
例えば、CUSTOMER_LEVELの値がSILVERでDEAL_AMOUNTの値が800000の場合、最初の条件には合致しません。2番目の条
件に合致するため、DISCOUNT_RATEとSALES_MAN_BONUSの値に25が設定されます。2番目の決定ルールが選択されたため、
3番目の決定ルールは評価されません。
データ辞書
条件変数は、データ辞書と呼ばれる機能を持っています。データ辞書を使うことにより、条件変数の値に同義語を設定することができ
ます。
例として、Countryという条件変数を考え、Country = Japanという条件を作成するものとします。Japanの同義語としてJPやJPNをあらかじ
め設定しておくと、ユーザがCountryの値にJapanでなくJPやJPNを指定した場合でも、Country = Japanという条件が成立します。
データ辞書の機能により、決定表がより柔軟なものになります。
6.21.2 プロセス定義内での決定表の使用
プロセス定義内で決定表を使用するために、決定表を評価するための定義済JavaAction(決定表JavaAction)があります。決定表の変数
(条件変数・結果変数)をプロセス定義のUDAに対応づける必要があります。詳細は、『Studioユーザーズガイド』またはInterstage BPM
コンソールのオンラインヘルプを参照してください。
- 125 -
プロセスインスタンス内で決定表JavaActionが活性化されたとき、入力のUDAの値が決定表内の条件のどれかに合致すれば、決定表
JavaActionは決定表の結果の値を出力UDAに設定します。
6.21.3 決定表の仕様
条件変数・結果変数
条件変数・結果変数は、以下の情報を持っています。
・ 名前 : 条件変数・結果変数の抽象化された名前です。これらの名前は、決定表JavaActionを定義する際に、UDAの名前に対応
づけられます。
・ 説明 : 条件変数・結果変数の簡単な説明です。説明は、決定表の動作に影響しません。
・ 条件変数・結果変数の型として、以下がサポートされています。
- BOOLEAN
- INTEGER
- LONG
- FLOAT
- BIGDECIMAL
- STRING
- DATE
決定ルール
決定ルールは、以下の情報を持っています。
・ それぞれの条件変数に対する条件
・ 結果変数に設定する値
条件では、以下の演算子が使用できます。
・ =, != : 値が一致しているかどうかを判断します。
・ >, <, >=, <= : 数値に対する「以上」・「以下」などを比較します。
・ in(a,b,c) : 複数の値のどれかと一致しているかどうかを判断します。
・ between(x,y) : 数値が指定された範囲に入っているかを判断します。
・ LIKE(), NOT_LIKE() : 式に対するパターンマッチです。「?」は任意の1文字に、「*」は任意の長さの文字列に対応します。例え
ば、LIKE(?OLD)が条件に使われた場合、GOLD、BOLD、TOLDのような値が条件に合致します。LIKE(JAP*)が条件に使われ
た場合、JAPAN、JAPANESEのような値が条件に合致します。
条件変数の型によって、サポートされる演算子が変わります。以下の表を参照してください。
演算子
Boolean
Integer
Float
Long
BigDecimal
Date
String
<
×
○
○
○
○
○
×
>=
×
○
○
○
○
○
×
<=
×
○
○
○
○
○
×
>=
×
○
○
○
○
○
×
!=
○
○
○
○
○
○
○
=
○
○
○
○
○
○
○
in(a,b,c)
×
○
○
○
○
○
○
- 126 -
演算子
Boolean
Integer
Float
Long
BigDecimal
Date
String
between(x,y)
×
○
○
○
○
○
×
like
×
×
×
×
×
×
○
not_like
×
×
×
×
×
×
○
6.21.4 決定表の管理
決定表の管理には、com.fujitsu.iflow.decisiontableパッケージを使用します。本パッケージには、決定表を管理するためのAPIが含ま
れています。本パッケージおよびAPIの詳細は、『API Javadocマニュアル』を参照してください。
以下の主要な操作について、説明します。
1. 決定表の作成
2. 条件変数・結果変数・決定ルールの作成
3. 決定表の正当性の確認
4. 決定表の評価
5. 決定表の保存
6. 決定表の読み込み
決定表の作成
決定表は、APIを使用して、または決定表のXMLスキーマに準拠するXMLファイルを作成することで、作成されます。
APIを使用した決定表の作成
決定表は、DecisionTableFactoryクラスのcreateDecisionTable()メソッドを使うことにより、作成されます。詳細は、『API Javadocマニュ
アル』を参照してください。
以下は例です。
DecisionTable dt = DecisionTableFactory.createDecisionTable();
dt.setName("DecisionTableName");
dt.setDescription("example of decision table");
XMLスキーマに準拠した、手動による決定表の作成
APIを使わずに決定表を作成する場合、作成された決定表のXMLファイル(.dtファイル)が、.dtファイル用のXMLスキーマに準拠
するようにしてください。XMLスキーマは、<Interstage BPMサーバインストールディレクトリ>/client/DecisionTableディレクトリ内の
DecisionTable.xsdです。
条件変数・結果変数・決定ルールの作成
条件変数の作成
新しい条件変数を作成するには、DecisionTableクラスのcreateConditionCriterion()メソッドを使用します。本メソッドの詳細は、『API
Javadocマニュアル』を参照してください。
以下の例では、CUSTOMER_LEVEL と DEAL_AMOUNT という2つの条件変数が作られています。
また、CUSTOMER_LEVELにはデータ辞書が使われており、条件変数の値 Regularの同義語として、normalおよびnoneが定義さ
れています。
ConditionCriterion criterion1 = dt.createConditionCriterion();
criterion1.setName("CUSTOMER_LEVEL");
criterion1.setType(DataItemRef.TYPE_STRING);
Dictionary dic = criterion1.createDictionary();
DictionaryItem regularDictionaryItem = dic.createDictionaryItem();
regularDictionaryItem.setWord("Regular");
String synonyms[] = new String[2];
synonyms[0] = "Normal";
synonyms[1] = "None";
- 127 -
regularDictionaryItem.setSynonyms(synonyms);
ConditionCriterion criterion2 = dt.createConditionCriterion();
criterion2.setName("DEAL_AMOUNT");
criterion2.setType(DataItemRef.TYPE_INTEGER);
ConditionCriterion criteria[] = new ConditionCriterion[2];
criteria[0] = criterion1;
criteria[1] = criterion2;
dt.setConditionCriteria(criteria);
結果変数の作成
新しい結果変数を作成するには、DecisionTableクラスのcreateResultLocator()メソッドを使用します。本メソッドの詳細は、『API Javadoc
マニュアル』を参照してください。
以下の例では、DISCOUNT_RATE と SALES_MAN_BONUS という結果変数が作成されています。
ResultLocator locator1 = dt.createResultLocator();
locator1.setName("DISCOUNT_RATE");
locator1.setType(DataItemRef.TYPE_STRING);
ResultLocator locator2 = dt.createResultLocator();
locator2.setName("SALES_MAN_BONUS");
locator2.setType(DataItemRef.TYPE_STRING);
ResultLocator locators[] = new ResultLocator[2];
locators[0] = locator1;
locators[1] = locator2;
dt.setResultLocators(locators);
決定ルールの作成
以下の例では、次のような決定ルールが作成されています。
- CUSTOMER_LEVEL の 値 が GOLD か つ DEAL_AMOUNT の 値 が 500000 よ り 大 き い 場 合 、 DISCOUNT_RATE と
SALES_MAN_BONUSの値に35を設定する
- CUSTOMER_LEVEL の 値 が SILVER か つ DEAL_AMOUNT の 値 が 500000 よ り 大 き い 場 合 、 DISCOUNT_RATE と
SALES_MAN_BONUSの値に25を設定する
Decision decision1 = dt.createDecision();
Condition condition1 = decision1.createCondition();
condition1.setCriterionName("CUSTOMER_LEVEL");
condition1.setOperator(Condition.CONDITION_OPERATOR_EQUAL);
condition1.setValue("Gold");
Condition condition2 = decision1.createCondition();
condition2.setCriterionName("DEAL_AMOUNT");
condition2.setOperator(Condition.CONDITION_OPERATOR_GREATER_THAN);
condition2.setValue("500000");
Condition conditions1[] = new Condition[2];
conditions1[0] = condition1;
conditions1[1] = condition2;
decision1.setConditions(conditions1);
Result result1 = decision1.createResult();
result1.setLocatorName("DISCOUNT_RATE");
result1.setValue("35");
Result result2 = decision1.createResult();
result2.setLocatorName("SALES_MAN_BONUS");
result2.setValue("35");
Result results1[] = new Result[2];
results1[0] = result1;
results1[1] = result2;
decision1.setResults(results1);
Decision decision2 = dt.createDecision();
... //add code for creating decision2, similar to creating decision1
...
- 128 -
Decision decisions[] = new Decision[2];
decisions[0] = decision1;
decisions[1] = decision2;
dt.setDecisions(decisions);
決定表の正当性の確認
決定表は、評価を行う前に、その正当性を確認する必要があります。
決定表の正当性の確認内容の例として、以下のような基本的な事柄があります。
・ 決定表に名前が指定されているか
・ 条件変数の名前が指定されているか
・ 条件変数の型が指定されているか
決定表の正当性の確認を行うには、DecisionTableクラスのvalidate()メソッドを使用します。本メソッドの詳細は、『API Javadocマニュア
ル』を参照してください。
ValidationResult[] validationResults = dt.validate();
System.out.println(validationResults.length + " Problems detected.");
for (int i = 0; i < validationResults.length; i++) {
ValidationResult validationResult = validationResults[i];
System.out.println("Severity = " + validationResult.getSeverity());
System.out.println("ID = " + validationResult.getIdentifier());
System.out.println("Problem = " + validationResult.getProblem());
}
決定表の評価
決定表を評価する、またはサンプルの入力値を使って決定表をテストするには、DecisionTableクラスのevaluate()メソッドを使用します。
本メソッドの詳細は、『API Javadocマニュアル』を参照してください。
決定表の評価を成功させるためには、決定表が正当なものである必要があります。validate()メソッドの結果に重大度がERRORのもの
がある場合、決定表の評価は失敗します。
以下の例では、CUSTOMER_LEVELにサンプルの値'SILVER'を設定し、DEAL_AMOUNTにサンプルの値'800000'を設定していま
す。決定表はこれらのサンプルの値を使って評価され、対応する結果が設定されます。
Properties conditionValues = new Properties();
conditionValues.setProperty("CUSTOMER_LEVEL","Silver");
conditionValues.setProperty("DEAL_AMOUNT","800000");
DecisionResult decisionResult = newDt.evaluate(conditionValues);
int decisonIndex = decisionResult.getExecutedDecision();
Decision allDecisions[] = newDt.getDecisions();
Decision selectedDecision = allDecisions[decisonIndex];
Result results[] = decisionResult.getResults();
for (int i = 0; i < results.length; i++){
Result result = results[i];
String locatorName = result.getLocatorName();
String value = result.getValue();
System.out.println("result : " + locatorName + " = " + value);
}
決定表の保存
決定表を保存するには、DecisionTableクラスのsave()メソッドを使用します。本メソッドの詳細は、『API Javadocマニュアル』を参照して
ください。
FileOutputStream outFile = new FileOutputStream("/decisiontable.dt");
dt.save(outFile);
- 129 -
決定表はワークフローアプリケーションに固有のものであるため、<DMSRoot>/apps/<アプリケーションID>/rule/<カテゴリ名> ディレクト
リに保存します。
決定表の読み込み
既存の決定表を読み込むには、DecisionTableクラスのload()メソッドを使用します。本メソッドの詳細は、『API Javadocマニュアル』を参
照してください。
DecisionTable newDt = DecisionTableFactory.createDecisionTable();
FileInputStream inFile = new FileInputStream("/decisiontable.dt");
newDt.load(inFile);
決定表のAPIサンプル
決定表の管理に関するサンプルについては、「A.1.4 決定表に関連したサンプル」を参照してください。
6.22 Iteratorノード
通常、プロセス定義に定義されたそれぞれのノードを実行すると、1つだけインスタンスが作成されます。Iteratorノードを使用すると、1
つのノードから複数のノードインスタンスを作成できます。
作成するノードインスタンスの数は、ノードに指定するIteratorカウントによって決まります。
Iteratorノードには、以下のような特徴があります。
・ Iteratorは、プロセス定義で指定します。
・ Iteratorカウントは、UDAを使用して指定します。Iteratorノードのために指定されたUDAが存在しない場合、そのプロセス定義から
はプロセスインスタンスを作成できません。
・ Iteratorは、以下のノードタイプで利用できます。
- Activityノード
- Subprocessノード
- Chained-Processノード
・ すべてのIteratorノード インスタンスは、並行して実行されます。
・ Iteratorを有効にするため、Iteratorカウントに、0より大きい値を設定する必要があります。
・ Iteratorカウントに、0以下が設定された場合、以下のようになります。
- プロセスインスタンス作成時に、ノードインスタンスが1つ作成されますが、活性化されません。
- そのノードインスタンスは実行されず、次のノードが活性化します。
・ 完了したIteratorノードが再実行された場合、作成済のIteratorノードが活性化されます。例えば、最初に3つのIteratorノードにノー
ドインスタンスが作成された場合、以下のようになります。
- 再実行する前に、Iteratorカウントが10に変更された場合、3つのノードインスタンスが再活性化され、7つのノードインスタンスが
新規に作成されます。
- 再実行する前に、Iteratorカウントが2に変更された場合、新しいインスタンスは作成されません。2つのインスタンスが再活性化
され、1つは活性化されません。
・ アドホックな活性化またはアドホックな非活性化によって、ノードインスタンスは活性化または非活性化されます。
- 完了したノードインスタンスは、活性化できません。
- 実行中のノードインスタンスを非活性化した場合、そのIteratorノードのすべての実行中のノードインスタンスが非活性化されま
す。
・ 開始アクションと終了アクションは、生成されるノードインスタンスの数に関係なく、1回だけ実行されます。
・ Iteratorノードインスタンスの外向き矢印インスタンスのソース、またはターゲット ノードインスタンスは、変更できません。
・ Iteratorノードインスタンスを削除した場合、そのIteratorノードのすべてのノードインスタンスが削除されます。
- 130 -
・ Iteratorノードインスタンスの外向き矢印インスタンスを削除した場合、そのIteratorノードのすべてのノードインスタンスの外向き矢印
インスタンスも削除されます。
・ Iteratorノードインスタンスに外向き矢印インスタンスを追加した場合、そのIteratorノードのすべてのノードインスタンスに、外向き矢
印インスタンスが追加されます。
・ 実行中のノードインスタンスにIteratorカウントを設定しても、ノードインスタンスの実行に影響しません。Iteratorカウントは、ノードイ
ンスタンスが次に実行されるときに使用されます。
・ それぞれのIteratorノードインスタンスは、Iteratorインデックス番号を使って、識別またはアクセスできます。インデックス番号は、1から
nまでの値です。nは、Iteratorカウントと同じ値になります。
・ Iteratorノードを含んでいる実行中のプロセスインスタンスからは、Iteratorノードに指定されたIteratorカウントUDAを削除できませ
ん。
6.22.1 Iteratedアクティビティノード
Iteratorアクティビティノードには、以下の特徴があります。
・ アクティビティノードについて、Iteratorカウントをnとします。プロセスインスタンスが作成されると、すぐに最初のノードのインスタンス
が作成されます。プロセスインスタンスが開始したあと、制御がノードに達すると、以下のことが起こります。
- 1つのアクティビティノードに対して、n-1回インスタンスが繰り返し作成されます。ワークアイテムはn個のノードインスタンスに対
し、ロールに割り当てられたすべてのユーザに作成されます。例えば、ロールに10人のユーザが割当てられていた場合、Iterator
カウントが5なら、50個のワークアイテムが作成されます。
・ あるユーザがワークアイテムを完了させると、ノードインスタンスに含まれるほかのユーザのワークアイテムは削除され、そのノード
インスタンスは完了します。
・ 繰り返し作成されたノードがすべて完了すると、ノードのアクティビティが完了し、次のノードが活性化されます。
・ アクティビティのIteratorノードから外向きの矢印の数は、1つだけです。
・ Iteratorノードのすべてのインスタンスは、プロセス内のすべてのUDAを共有しています。あるインスタンスがUDAの値を変更した
場合、すべてのインスタンスに即座に反映されます。
・ Iteratorを設定したアクティビティノード上で、トリガを使うことはできません。
・ すべての繰り返されたインスタンスは、同じプロパティを持ちます。(名前、説明など。)
・ 繰り返し作成されたインスタンスの繰り返しの数は、ModelAPI、JavaAcript、またはCustomJavaActionを使って取得することができ
ます。詳細は、「Model APIを使った、ノードインタンスのIteratorインデックスの取得」および「カスタムJavaActionクラスを使って、ア
クティビティノードインスタンスのIteratorインデックスを取得する」を参照してください。
・ ノードのそれぞれのIteratorインスタンスには、異なるユーザを割当てることができます。詳細は、「カスタムJavaActionクラスを使っ
て、アクティビティノードインスタンスのIteratorインデックスを取得するを」を参照してください。ロールアクションは、それぞれのノー
ドインスタンスの作成を繰り返すごとに実行されます。
Iteratorノードに対するワークアイテムの取戻し
下記に、Iteratorノードでワークアイテムの取戻しがサポートされるケースを説明します。
Iteratorノードで、ワークアイテムの取戻しをサポートする場合について説明します。
・ Iteratorノードが取戻しソースのノードであるとき、最後に完了したノードのワークアイテムからだけ取戻しができます。
- すべてのIteratorノードインスタンスが完了し、次のアクティビティがまだ活性中である場合
取戻しによって、活性化している取戻しターゲットアクティビティは非活性化します。このとき、取戻しターゲットのアクティビティ
の開始アクションに設定された補償JavaActionが実行されます。また、取戻しソースのアクティビティに設定された終了アクショ
ンが実行されます。そして、取り戻されたIteratorアクティビティが活性化され、取戻しを実行したユーザのワークアイテムが作成
されます。
- すべてのIteratorノードインスタンスが完了していない場合
完了したIteratorノードインスタンスのどれかからだけ実行できます。取戻しによって、取り戻されたアクティビティインスタンスは
再び活性化され、取戻しを実行したユーザのワークアイテムが作成されます。
- 131 -
・ Iteratorノードが取戻しターゲットノードであるとき、Iteratorノードインスタンスが実行中の場合にだけ、取戻しができます。取戻しに
よって、繰り返し作成されたすべてのノードインスタンスは非活性化します。このとき、取戻しターゲットの開始アクションに設定された補償
JavaActionが実行されます。また、取戻しソースノードに設定された終了JavaActionが実行されます。そして、取戻されたアクティビ
ティは再び活性化し、取戻しを実行したユーザのワークアイテムが作成されます。
ワークアイテムの取戻しについては、「5.3.5 ワークアイテムの取戻し」を参照してください。
6.22.2 繰り返し作成されたSubprocessノードとChained-Processノード
繰り返し作成されたSubprocessノードとChained-Processノードについて、説明します。
・ 繰り返し作成されたSubprocessノードとChained-processノードについて、Iteratorカウントをnに設定したとします。プロセスインスタン
スが作成されると、すぐに最初のノードのインスタンスが作成されます。プロセスインスタンスが開始され、ノードに制御が移ったあ
と、以下の処理が行われます。
- 繰り返し作成されたSubprocessノードでは、n-1のノードインスタンスが作成されます。n個のノードインスタンスにそれぞれ関連
付けてサブプロセスが作成され、開始されます。すべての繰り返し作成されたSubprocessノードのインスタンスが完了したあと、
次のノードに制御が移ります。
- 繰り返し作成されたChained-processノードでは、更なるノードインスタンスは作成されません。プロセスインスタンスと同時に作
成される1つのノードインスタンスから、n個の関連している子プロセスインスタンスが作成され、開始されます。制御は、ただち
に次のノードに遷移します。
・ 繰り返し作成されたSubprocessノードに含まれているプロセスインスタンスが中止された場合、すべての繰り返し作成されたサブプ
ロセスインスタンスは中止されます。
SubprocessとChained-processのIteratorノードに対するデータマッピング
・ 繰り返し作成されたインスタンスは、それぞれUDAを持っています。繰り返し作成されたインスタンス同士の間で、UDAは引き継げ
ません。親プロセスのUDAとだけ、引き継ぎ可能です。
・ 事前に定義された変数を、XML UDAまたはXPathを使うことによって、繰り返し作成された子のプロセスと親のプロセスの間で、変
換することができます。親プロセスのXML UDAのXPath式内の変数は、親のXML UDAを異なる子のプロセスインスタンスのXML
UDAにマッピングするのに利用されます。データマッピングの詳細は、「親と繰り返し作成された子プロセスインスタンス間のデー
タマッピング」を参照してください。
6.22.3 Iteratorノードの使い方
Iteratorノードの作成
プロセス定義を設計するとき、com.fujitsu.iflow.model.workflow.NodeインタフェースのsetIteratorCount(String udaName)メソッドを使っ
て、ノードを繰り返すことができます。このとき、UDAの型はIntegerにしなければなりません。
com.fujitsu.iflow.model.workflow.NodeインタフェースのgetIteratorCount()メソッドを使って、IteratorUDAの名前を取得することができ
ます。詳細は、『API Javadocマニュアル』でこれらのメソッドを参照してください。
次のサンプルコードは、Activityという名前のアクティビティノードに、IteratorCountというUDAの値に5をセットした例です。
//lock a Process definition before calling the API
plan.startEdit();
plan.addDataItemRef("IteratorCount", DataItemRef.TYPE_INTEGER, "5");
Node activityNode = plan.addNode("Activity", Node.TYPE_ACTIVITY); activityNode.setIteratorCount("IteratorCount");
//when you save the plan, the Iterator count of
//the above node will also get saved
plan.createProcessDef();
//Now you can check the Iterator count set above
String iteratorCountUda = activityNode.getIteratorCount();
繰り返し可能に設定したノードを通常のノードに戻すには、空文字“”をIteratorカウントUDAの名前として設定します。
- 132 -
注意
ノードのIteratorカウントは、それぞれのIteratorアクティビティインスタンスの担当者の数を考慮して設定することをお勧めします。例え
ば、プロセスインスタンスごとに、Iterateアクティビティによって2000以上ものワークアイテムが作成されないようにしてください。この場
合、サーバ環境のセットアップとシステムのロードの際、Iterateノードの活性化のトランザクションにおいて非常に長い時間がかかり、タ
イムアウトを引き起こし、プロセスがエラー状態になることがあります。
Model APIを使った、ノードインタンスのIteratorインデックスの取得
com.fujitsu.iflow.model.workflow.NodeInstanceインタフェースのgetIteratorIndex()メソッドを使って、Iteratorインデックスを取得すること
ができます。詳細は、『API Javadocマニュアル』を参照してください。
サンプルコード
//retrieve the Node instance using Model API, then use code below
//for retrieving iterator index of node instance
//Let 'ni' represent retrieved Node Instance
int iteratorindex ;
iteratorIndex = ni.getIteratorIndex();
//this iteratorIndex can be used for manipulation of an XML UDA as follows
//Create the XPath using above retrieved iteratorIndex
String xpath="//OrderIds/orderId[position()=" + iteratorIndex + "]/text()";
//Retrieve the XML UDA from the process instance
::
//Assume 'dataItem' is the retrieved XML UDA
//Set the new value of the XML UDA using the XPath
dataItem.setElementValue(xpath, "Updated");
//Retrieve the new value
String udaValue = dataItem.getElementValue(xpath);
カスタムJavaActionクラスを使って、アクティビティノードインスタンスのIteratorインデックスを取得する
com.fujitsu.iflow.server.intf.ServerEnactmentContextインタフェースのgetActivityIteratorIndex()を使って、アクティビティインスタンスの
Iteratorインデックスを取得することができます。このインデックスをカスタムJavaActionクラスの中で、実際のノードインスタンスのXML UDA
から値を読み取ることができます。
例えば、異なる担当者にそれぞれのインスタンスを割り当てたい場合、アクティビティインスタンスのIteratorインデックスを取得するカスタム
JavaActionクラスを定義する必要があります。
以下の手順で、カスタムメソッドに、このインタフェースアクティビティインスタンスの担当者を設定します。
1. getActivityIteratorIndex()メソッドを使って、担当者を設定するために使われるカスタムメソッドを、カスタムJavaActionクラス内に
作成します。
2. 上記で定義したカスタムJavaActionは、ロールアクションで、繰り返し作成された異なるアクティビティインスタンスに異なる担当
者を割当てることができます。
1.カスタムJavaActionクラスの作成
カスタムJavaActionクラスを作成します。
a. ServerEnactmentContextインタフェースをインポートしてください。
b. JavaActionから呼び出すメソッドのパラメータの1つがServerEnactmentContext型であることを確認してください。
c. JavaActionを定義するとき、メソッドに渡す値を指定します。ServerEnactmentContextインタフェースを表すsecという変数名を
使います。プロセスの実行時、Interstage BPMは、このオブジェクトをカスタムメソッドに渡します。
以下の例は、XML UDAがUdaAssigneesの場合です。
- 133 -
<Assignees>
<Assignee>ibpm_user1</Assignee>
<Assignee>ibpm_user2</Assignee>
<Assignee>ibpm_user3</Assignee>
</Assignees>
次のサンプルコードは、getActivityIteratorIndexメソッドを使って、setAssigneeという名前のカスタムメソッドを定義したカスタム
JavaActionクラスで、担当者を定義しています。
import com.fujitsu.iflow.server.intf.ServerEnactmentContext;
public class MyClass {
public void setAssignee(ServerEnactmentContext sec)
throws Exception {
String xpath = "//Assignees/Assignee[position()=" +
sec.getActivityIteratorIndex() + "]/text()";
String assignee =
sec.getProcessXMLAttributeElementValue("UdaAssignees", xpath);
//here "UdaAssignees" is the name of the XML UDA containing the assignees
String[] assignees = { assignee };
sec.setActivityAssignees(assignees);
}
}
2.ロールアクションを使って、異なる担当者を、繰り返し作成された異なるノードインスタンスに割当て
a. アクティビティノードを付加します。プロセス定義内の最初のアクティビティの名前には、'protected' 'final' 'static'修飾子を使い
ます。
String NODE_FILL_OUT_PR = "Fill out Purchase Request";
protected final static String NODE_FILL_OUT_PR = "Fill out Purchase
Request";
Node fillOutNode = plan.addNode("NODE_FILL_OUT_PR",Node.TYPE_ACTIVITY);
fillOutNode.setRole("SampleGroup");
fillOutNode.setPosition(new Point(450, 40));
b. WFObjectFactoryクラスのgetJavaActionSet()メソッドを使って、新しいJavaActionSetオブジェクトを生成します。
JavaActionSet asRJavaActionSet = WFObjectFactory.getJavaActionSet();
c. JavaActionSetに対して、要求された数のJavaActionを作成します。
JavaAction[] asRJavaActions = asRJavaActionSet.createJavaActions(1);
d. アクティビティの担当者を設定するJavaActionを定義します。
asRJavaActions[0].setActionDescription("Sets Activity assignee");
asRJavaActions[0].setActionName("Set assignee");
asRJavaActions[0].setMethodName("setAssignee(ServerEnactmentContext");
asRJavaActions[0].setClassName("MyClass");
e. ロールアクションとして、アクティビティノードにJavaActionSetを割当てます。
asRJavaActionSet.setJavaActions(asRJavaActions);
fillOutNode.setJavaActionSet(asRJavaActions,JavaActionSet.NODE_ROLE);
注意
以下のJavaScriptで、getActivityItratorIndex()を使うこともできます。
var iteratorIndex = sec.getActivityIteratorIndex();
- 134 -
必要に応じて、さらにiteratorIndexを使用できます。
親と繰り返し作成された子プロセスインスタンス間のデータマッピング
XML UDAまたはXPathを使うことによって、繰り返し作成された子のプロセスと親のプロセスの間で、事前に定義された変数$indexを
変換することができます。
以下のXML UDAで例示します。
・ 親プロセスのXML UDA名、ParentXMLUDA
<Items>
<Item>A1</Item>
<Item>A2</Item>
</Items>
・ 子プロセスインスタンス#1のXML UDA、ChildXMLUDA_P
<ChildItems>
<ChildItem>P</ChildItem>
</ChildItems>
・ 子プロセスインスタンス#2のXML UDA、ChildXMLUDA_P
<ChildItems>
<ChildItem>P</ChildItem>
</ChildItems>
注意
子のプロセスインスタンスは同じ子プロセス定義から作成されるので、すべての子のインスタンスには、同じ名前で同じ初期値を持つUDA
が存在します。
com.fujitsu.iflow.model.workflow.NodeインタフェースのaddDataMappingElement()メソッドを使うことで、親と子のXML UDA間のマッ
ピングを実装することができます。
構文:
addDataMappingElement(java.lang.String parentDataItemRefName,java.lang.String
xPathForParentDataItem,java.lang.String childDataItemRefName,java.lang.String
xPathForChildDataItem,int direction)
なぜ、変数$indexが必要なのか
変数$indexを使わないで、addDataMappingElement()メソッドを使用した場合について、以下に説明します。
例えば、以下のメソッドは次のような動作をします。
addDataMappingElement("ParentXMLUDA", "//Items/Item[2]/text()",
"//ChildItems/ChildItem/text()", DataItemMappingElement.INOUT)
"ChildXMLUDA_P",
1. 子プロセスを開始するとき、2つの子プロセスインスタンスのUDA、ParentXMLUDAは、("//Items/Item[2]/text()"という指定によっ
て)同じ値A2が受け取られます。子のプロセスインスタンスのUDAはこのとき、以下のようになります。
- 子のプロセスインスタンス#1のUDA:
<ChildItems>
<ChildItem>A2</ChildItem>
</ChildItems>
- 135 -
- 子のプロセスインスタンス#2のUDA:
<ChildItems>
<ChildItem>A2</ChildItem>
</ChildItems>
2. 子のプロセスインスタンスが終わると、それぞれのインスタンスは親プロセスのParentXMLUDAの2項目を("//Items/Item[2]/
text()"の指定によって)同じ値に変更します。このように、それぞれの変換したデータによって上書きされます。例えば、子のプロ
セスインスタンス#1は、ParentXMLUDAの2番目の値をP1に置き換えます。そして、子プロセスインスタンスの#2は、ParentXMLUDA
の2番目の項目をP2に上書きします。親のXMLUDAは、以下のようになります。
<Items>
<Item>A1</Item>
<Item>P2</Item>
</Items>
本質的には、これは、親プロセスから異なった子のプロセスインスタンスに異なった値をマッピングできないことを意味します。非XML UDA
データ・マッピングを使用するときも、同様の問題が起こります。
親プロセスから繰り返し作成された異なる子のプロセスインスタンスに、異なった値をマッピングできるようにするには、事前に定義した変数
$indexを使用する必要があります。
変数$indexを使う
変数$indexを使って、addDataMappingElement()を使用した場合について、以下に説明します。
例えば、以下のメソッドは次のような動作をします。
addDataMappingElement("ParentXMLUDA", "//Items/Item[$index]/text()",
"ChildXMLUDA_P", "//ChildItems/ChildItem/text()", DataItemMappingElement.INOUT)
1. 2つの子インスタンスのUDAは、(as specified by "//Items/Item[$index]/text()"という指定によって)異なる値を受け取ります。親UDA
のXPath式で$index変数は、自動的に、1つ目の親のXML UDAを1つ目の子インスタンスのXML UDAに、2つ目の親のXML UDA
を2つ目の子インスタンスのXML UDAにといったようにマッピングします。子インスタンスのUDAは、以下のようになります。
- 子のプロセスインスタンス#1のUDA:
<ChildItems>
<ChildItem>A1</ChildItem>
</ChildItems>
- 子のプロセスインスタンス#2のUDA:
<ChildItems>
<ChildItem>A2</ChildItem>
</ChildItems>
2. 子インスタンスが終わると、それぞれの子インスタンスは異なる親のXML UDAの項目を変更しています。親のUDAのXPathにお
ける変数$indexは、自動的に、1つ目の親のXML UDAを1つ目の子インスタンスのXML UDAに、2つ目の親のXML UDAを2
つ目の子インスタンスのXML UDAにといったようにマッピングします。親のXML UDAは、以下のようになります。
<Items>
<Item>P1</Item>
<Item>P2</Item>
</Items>
このように、変数$indexを使うことによって、異なる親UDAの値を、繰り返し作成された異なる子プロセスインスタンスのUDAにマッピン
グすることができます。
- 136 -
注意
・ 変数$indexを使用すると、強制的に連続した値がマッピングされます。(1つ目のアイテムを1つ目の子インスタンスのXML UDAに、
2つ目のアイテムを2つ目の子インスタンスのXML UDAにといったように)このため、親のXML UDAのアイテムが、マッピングされ
る子インスタンスに対応していることを確認する必要があります。
・ 親プロセスのXML UDAのXPathにだけ、変数$indexを使用できます。
・ 繰り返しを設定していない子ノードのXML UDAのXPathに変数$indexを使用すると、実行されている間、この変数は1に置き換え
られます。
データマッピングについては、「6.17.1 親とリモートサブプロセス定義を設計」を参照してください。
- 137 -
第7章 運用管理
Interstage BPMには、管理者としてのロールが2つあります。
・ スーパーユーザ: テナントを作成・管理することができ、Interstage BPM サーバを管理する管理者です。テナントの作成・管理は、
スーパーユーザだけが行えます。
スーパーユーザは、テナントユーザ、プロセス定義、プロセスインスタンス、およびワークアイテムを管理できません。スーパーユー
ザは、テナントの管理にInterstage BPM テナント管理コンソールを使用します。スーパーユーザの管理者機能については、『Interstage
Business Process Manager サーバ・コンソール 導入ガイド』および『Interstage BPM サーバ 管理者ガイド』を参照してください。
・ テナント所有者: 管理者のロールを持つテナントユーザです。テナント所有者は、スーパーユーザによって作成されます。
非SaaSモードでは、デフォルトテナントが一つあるだけです。このため、スーパーユーザとテナント所有者は同じ人物になるでしょ
う。しかし、異なる管理機能を利用するために、スーパーユーザかテナント所有者を選んでログインする必要があります。
ここでは、テナント所有者によって行われる運用管理のためのModel APIを使用したプログラミングの例を示します。プログラミングの例
には、以下のものがあります。
・ テナント所有者のログインとログアウト
・ テナントユーザ管理(以降、ユーザ管理とします。)
・ プロセス定義管理
・ プロセスインスタンス管理
・ ワークアイテム管理
こ の 章 で 紹 介 さ れ て い る プ ロ グ ラ ミ ン グ 例 の す べ て の コ ー ド は 、 Adminstration.java サ ン プ ル フ ァ イ ル 、 お よ び
SampleLocalUserManagement.javaサンプルファイル内にあります。
サンプルコードを実装するには、Model APIの次のパッケージを使用する必要があります。
・ com.fujitsu.iflow.model.util
ほかのクラスやインタフェースで一般的に使用される、低レベルのユーティリティクラスが含まれています。
・ com.fujitsu.iflow.model.workflow
プロセス定義やプロセスインスタンスで必要な情報を管理するインタフェースが含まれています。これには、ノード、矢印、添付文
書、ワークアイテム、およびパーミッションレベルが含まれます。
一般的なModel APIの詳細については、『API Javadocマニュアル』を参照してください。
7.1 管理者のログインとログアウト(テナント所有者)
プロセス定義やユーザを管理するために、管理者(テナント所有者)はInterstage BPMサーバにログインする必要があります。管理者が
ログインするには、セッション、つまりWFAdminSessionオブジェクトを作成する必要があります。このセッションは、管理者がログアウトす
ると終了します。
管理者がログイン/ログアウトする方法について説明します。
1. 新しいWFAdminSessionオブジェクトを作成します。
adminSession = WFObjectFactory.getWFAdminSession();
ワークフローオブジェクトを割当てるには、WFObjectFactoryクラスを使用します。次に、getWFAdminSession()でWFAdminSession
オブジェクトを作成します。
2. 該当する環境設定ファイルを使用して、セッションを初期化します。
<Interstage BPMサーバ インストールディレクトリ>/client/samples/examples/classesに格納されたiFlowClient.propertファイルのサ
ンプルを使用できます。
このファイルを使うか、実行時のカレントディレクトリに格納された新しいファイルにプロパティを書き込みます。実行時のカレント
ディレクトリの格納先については、「4.3 プロパティファイルの格納」を参照してください。
- 138 -
使用するプロパティファイルに、ログインするテナント名を指定してください。テナント名は、
WFObjectFactory.TENANT_NAME( テ ナ ン ト 名 ) の 値 と し て 指 定 し ま す 。 Default テ ナ ン ト へ ロ グ イ ン す る 場 合 は 、
TenantName=Defaultを指定します。
iFlowClient.properties ファイルの中でバックスラッシュ"¥"またはコロン":"を使用する場合は、バックスラッシュでエスケープする
必要があります。たとえば、サーバのアドレスは以下のように指定します。
ibpmhost\:49950
java.util.Propertiesを使い、iFlowClient.propertiesファイルをロードするとき、load() メソッドは、エスケープ文字を自動的に考慮さ
れます。他の方法でプロパティをロードする場合は、エスケープ文字を正しく扱うようにしてください。iFlowClient.propertiesファイ
ルで使用するのエスケープシーケンスの詳細については、java.util.Properties.store()メソッドのJAVAドキュメントを参照してくださ
い。
セッション用に設定ファイルiFlowClient.propertiesを読み込みます。
Properties sessionProps = new Properties(); sessionProps.load(new FileInputStream("iFlowClient.properties"));
以下のとおり、セッションを初期化します。
adminSession.initForApplication(null, sessionProps);
1. サーバにログインします。
String server = sessionProps.getProperty("HostName") + "Flow";
adminSession.logIn(server, adminName, password);
接続サーバ名には、"Flow"という文字列を追加してください。
2. すべての作業が終了したら、管理者はWFAdminSessionを使用してサーバからログアウトします。
if (adminSession != null ) {
adminSession.logOut();
}
7.2 ワークフローアプリケーションを選択する
ログインしたあと、WFSession.chooseApplication()を使って、操作するワークフローアプリケーションを選択します。
adminSession.chooseApplication(myApplicationID);
注意
ApplicationModeSecurityパラメータにRelaxが設定されている場合、ワークフローアプリケーションの選択を省略することができます。選
択を省略した場合の動作については、『Interstage BPMサーバ 管理者ガイド』の「4.4 ApplicationSecurityMode」を参照してください。
7.3 ユーザおよびグループ管理
Interstage BPMを使うすべてのテナントユーザ(以降、ユーザとします)はユーザアカウントが必要です。ユーザは一つ以上のグループ
に所属しなければなりません。
ユーザアカウント
配備時のInterstage BPMの構成によって、ユーザアカウントはInterstage BPMのローカルユーザストアまたはディレクトリサービス(リモー
トユーザストア)で管理されます。
ローカルのユーザストアを使用する場合、WFAdminSessionインタフェースを使用してユーザの追加や削除、またパスワードのリセット
ができます。
ディレクトリサービスを使用する場合、ユーザの追加や削除にディレクトリサービスの機能を使用します。
- 139 -
グループ
グループは、組織内である機能を共有するユーザの集まりです。 例えば、マネージャグループは組織の上位のマネージャを含む場
合があります。Interstage BPMでは、グループはだれがプロセスでのタスク責任者であるかを決定するのに使用されます。
グループはInterstage BPMのローカルグループストアかディレクトリサービス(リモートグループストア)、または両方のシステムで管理で
きます。ローカルグループストアを使用する場合、WFAdminSessionインタフェースで管理できます。 WFAdminSessionインタフェース
には、グループの作成、グループを他のグループに追加、ユーザをグループに追加するなどのオペレーションがあります。
グループが他のグループのメンバーである場合もあるので、組織の階層を対応するグループ階層にモデル化できます。どんな深さに
もグループをネストできます。
注意
ユーザとグループを異なったストアで管理できます。例えば、ある組織ではユーザアカウントをディレクトリサービスで管理し、グループ
をローカルグループストアで管理する場合があります。
7.3.1 ローカルユーザの管理
前提条件: Interstage BPMは、ローカルユーザストアを使用するように構成されています。詳細は、『Interstage Business Process Manager
サーバ・コンソール 導入ガイド』を参照してください。
WFAdminSessionインタフェースですべてのローカルユーザのリストを取得、ローカルユーザの追加、パスワードのリセット、ローカル
ユーザの削除ができます。
・ すべてのローカルユーザのリストを取得するには、以下のように設定します。
User[] localUser = adminSession.getLocalUsers();
・ ローカルユーザを追加するには、以下のように設定します。
//Check whether the user already exists
User testUser = WFObjectFactory.getUser(sampleUser);
adminSession.createUser(testUser, usrPassword);
ユーザIDとパスワードは最大200文字まで使えます。 英数字、ハイフン、およびアンダースコア ("_")のみを使用してくださ
い。"@"はInterstage BPMでエージェントを特定するのに使われるため、"@"で始まるユーザ名は使用できません。
・ ローカルユーザのパスワードをリセットするには、以下のように設定します。
adminSession.resetPassword(testUser, usrPassword);
注意
ユーザにパスワードを変更する権限を与える場合、WFSessionインタフェースからchangePassword()を使用します。
・ ローカルユーザを削除するには、以下のように設定します。
adminSession.deleteUser(userID);
このユーザは属するすべてのローカルグループから削除、除外されます。
7.3.2 ローカルグループの管理
ここではローカルグループストア管理の最も重要なオペレーションを紹介します。プログラミングサンプルでは、3つのグループの階層
が作成され、ユーザはそれらのグループに割り当てられます。以下の図は作成される組織構造を示します。
- 140 -
図7.1 サンプルグループとユーザ
ローカルグループ管理をするには、以下の手順に従います。
1. WFAdminSessionインタフェースからcreateGroup()を使用して、必要なローカルグループを作成します。
以下のサンプルはAllEmployees、US_Employees、UK_Employeesグループを作成します。グループ作成前にサンプルはグルー
プが既に存在するかどうかチェックします。
group = WFObjectFactory.getGroup("AllEmployees ",
"ALL Employee group");
adminSession.createGroup(group);
group = WFObjectFactory.getGroup("US_Employees ",
"US Employee group");
adminSession.createGroup(group);
group = WFObjectFactory.getGroup("UK_Employees ",
"UK Employee group");
adminSession.createGroup(group);
ユーザIDとパスワードは最大200文字まで使えます。 英数字、ハイフン、およびアンダースコア ("_")のみを使用してくださ
い。"@"はInterstage BPMでエージェントを特定するのに使われるため、"@"で始まるユーザ名は使用できません。
2. getAllGroups()を使用してInterstage BPMで利用可能なすべてのグループを取得できます。
Group[] LocalGroupList = adminSession.getAllGroups();
3. Interstage BPMのローカルグループに割り当てたいユーザを作成します。 このサンプルでは、ユーザのLisa、Sarah、Peterおよび
Johnが作成されます。
testUser = WFObjectFactory.getUser("UserSarah");
adminSession.createUser(testUser, "SomePassword");
testUser = WFObjectFactory.getUser("UserLisa");
adminSession.createUser(testUser, "SomePassword");
testUser = WFObjectFactory.getUser("UserPeter");
adminSession.createUser(testUser, "SomePassword");
testUser = WFObjectFactory.getUser("UserJohn");
adminSession.createUser(testUser, "SomePassword");
4. WFAdminSessionインタフェースからaddUserToGroup()を使用して新たに作成されたユーザをローカルグループに割り当ててく
ださい。サンプルでは、LisaとSarahはUS_Employeesに割り当てられ、JohnとPeterはUK_Employeesに割り当てられます。
adminSession.addUserToGroup("UserSarah", "US_Employees");
adminSession.addUserToGroup("UserLisa", "US_Employees");
adminSession.addUserToGroup("UserPeter", "UK_Employees");
adminSession.addUserToGroup("UserJohn", "UK_Employees");
必要な数のグループに同一ユーザを割り当てることができます。
いかなるInterstage BPMユーザもいかなるローカルグループに割り当てできます。割り当てられるユーザはInterstage BPMのロー
カルユーザストアまたはディレクトリサービスのどちらに保存されていても構いません。
- 141 -
5. グループの階層構造を作成したい場合は、addGroupToGroup()を使用して子グループを親グループに割り当てます。サンプルでは
US_EmployeesとUK_EmployeesはAllEmployeesグループに関連しています。
adminSession.addGroupToGroup("US_Employees", "AllEmployees");
adminSession.addGroupToGroup("UK_Employees", "AllEmployees");
子グループを親グループに割り当てるとき、子グループのすべてのメンバーが親グループのメンバーになります。
同じグループを複数のグループに割り当てることができます。
注意
循環するグループを作成しないでください。例えば、グループ1をグループ2の子グループとし、グループ2をグループ1の子グ
ループに追加しないでください。
6. ユーザがグループのメンバーでなくなった時点でグループからそのユーザを除外できます。
adminSession.removeUserFromGroup(sampleUser, roleName);
7.3.3 ログインしたユーザリストの作成
すべてのログインしたユーザのリストを取得する方法について説明します。
1. WFAdminSessionインタフェースのgetAllUserAgentInfo()を使用します。
UserInfo[] userInfoList = adminSession.getAllUserAgentInfo();
7.3.4 ユーザのログアウト
・ 単独のユーザをログアウトさせる方法について説明します。
WFAdminSessionインタフェースのlogoutUser()を使用します。
・ すべてのユーザをログアウトさせる方法について説明します。
WFAdminSessionインタフェースのlogoutAllUsers()を使用します。
次の例では、管理者を除くすべてのユーザをuserInfoListからログアウトさせる方法を示しています。
if (userInfoList != null) {
boolean loggedOut = false;
for (int i = 0; i < userInfoList.length; i++) {
// 現在の管理者ではないユーザを取得するために
// ユーザ名を制御します。
if (!userInfoList[i].getName().equals(adminName)) {
adminSession.logoutUser(userInfoList[i].
getClientID());
loggedOut = true;
}
}
}
7.3.5 ユーザとグループキャッシュのリセット
管理セッション(WFAdminSession)で、管理者はディレクトリサーバからグループとユーザのキャッシュデータをリセットできます。
起動時、Interstage BPMサーバはローカルまたはリモートストアからグループとユーザを取得し、キャッシュに保存します。 WFAdminSession
では、管理者がグループとユーザのキャッシュデータをリセットできます。
・ グループリストをリセットするには、以下のように設定します。
adminSession.resetLDAPGroupsList();
- 142 -
resetLDAPGroupsList()は即座にグループのキャッシュをクリアします。ローカルまたはリモートストアで定義されたグループのキャッ
シュされたメモリオブジェクトをリセットします。ローカルまたはリモートストアのいかなるグループリストの変更もメモリオブジェクトにリ
ロードされます。
・ ユーザリストをリセットするには、以下のように設定します。
adminSession.resetLDAPUsersList();
resetLDAPUsersList()は即座にユーザのキャッシュをクリアします。ローカルまたはリモートストアで定義されたユーザのキャッシュ
されたメモリオブジェクトをリセットします。ローカルまたはリモートストアのいかなるユーザリストの変更もメモリオブジェクトにリロード
されます。
注意
リモートストアを使用するとき、グループキャッシュは自動的に一定の間隔で更新されます。LDAPグループキャッシュの有効期限は
Interstage BPMサーバのLDAPGroupCacheAgeSecパラメータで設定されます。詳細は『Interstage BPMサーバ 管理者ガイド』を参照し
てください。
7.4 プロセス定義管理
ここでは、以下の一般的なプロセス定義管理タスクについて説明します。
・ プロセス定義リストを作成する
・ プロセス定義を公開する
・ プロセス定義をアーカイブする
・ プロセス定義を削除する
・ アーカイブ済のプロセス定義を削除する
・ プロセス定義をXPDLファイルからインポートする
・ プロセス定義をXPDLファイルにエクスポートする
7.4.1 プロセス定義リストの作成
プロセス定義リストを作成するには、com.fujitsu.iflow.model.workflowパッケージのWFObjectListインタフェースを使用します。このイ
ンタフェースは、Interstage BPMサーバから既存のWFObjectsのリストを取得します。
プロセス定義リストを作成する方法について説明します。
1. Filterクラスを使用して、フィルタを作成します。
プロセス定義のフィルタには以下の条件を使用することができます。
- AllArchivedPlans: アーカイブ済のすべてのプロセス定義を取得します。
- AllPlans: すべてのプロセス定義を取得します。
- MyInactivePlans: 非活性状態のすべてのプロセス定義を取得します。
- MyPlans: ログイン中のユーザに属するすべてのプロセス定義を取得します。
2. openBatchedList()を使用します。
3. openBatchedList()を使用して、取得したオブジェクトのリストからフィルタ条件に一致するものを取り出します。
例
Plan[] planList = null;
if (filter == Filter.AllArchivedPlans
|| filter == Filter.AllPlans
|| filter == Filter.MyInactivePlans
|| filter == Filter.MyPlans) {
- 143 -
WFObjectList wfObjectList =
WFObjectFactory.getWFObjectList(adminSession);
wfObjectList.openBatchedList(filter);
Vector tmpList = new Vector();
int batchSize = 50;
Object[] elements = wfObjectList.getNextBatch(batchSize);
Plan plan = null;
while (elements != null && elements.length > 0) {
for (int i = 0; i < elements.length; i++) {
plan = (Plan) elements[i];
// プロセス定義をテンポラリリストに追加します。
tmpList.add(plan);
}
// フィルタに該当するプロセス定義の次のリストを読み込みます。
elements = wfObjectList.getNextBatch(batchSize);
}
// テンポラリリスト内のプロセスインスタンスを
// このプログラムで返されるProcessInstance配列にコピーします。
planList = new Plan[tmpList.size()];
planList = (Plan[]) tmpList.toArray(planList);
return planList;
}
7.4.2 プロセス定義の公開
プロセス定義を公開する方法について説明します。
・ WFAdminSessionインタフェースのpublishPlan()を使用します。
プロセス定義を公開すると、状態が「公開済」に変更されます。
例
以下の例では、プロセス定義のリスト(planList)の最初のプライベートまたはドラフト状態のプロセス定義を公開する方法を示します。
if (planList != null ) {
boolean published = false;
for (int i = 0; i < planList.length; i++) {
if (planList[i].getState() == Plan.STATE_DRAFT
|| planList[i].getState() == Plan.STATE_PRIVATE) {
adminSession.publishPlan(planList[i].getId());
}
published = true;
}
}
7.4.3 プロセス定義のアーカイブ
プロセス定義をアーカイブすると、状態が「アーカイブ済」に変更されます。すでにアーカイブ済のプロセス定義をアーカイブしようとす
ると、Interstage BPMでは、公開したプロセス定義をアーカイブすると判断します。この場合、プロセス定義リスト内にプロセス定義は残
り、状態が「削除済」になります。
プロセス定義をアーカイブする方法について説明します。
・ WFAdminSessionインタフェースのarchivePlan()を使用します。
adminSession.archivePlan(planList[i].getId());
- 144 -
一度プロセス定義をアーカイブした後も、以下のように再取得できます。
1. アーカイブ済のプロセス定義のIDを取得するには、アーカイブ済のプロセス定義の全リストを取得します。AllArchivedPlansフィ
ルタの基準を利用します。
2. 特定のアーカイブ済のプロセス定義を取得するにはWFAdminSessionインタフェースのgetArchivedPlan(id)を使用します。
adminSession.getArchivedPlan(planList[i].getId());
アーカイブ済のプロセス定義に対して実行できるのは、情報の取得など、一部の関数のみであることにご注意ください。プロセス定義
を変更する関数すべてが、アーカイブ済のプロセス定義でサポートされているわけではありません(setNameなど)。
7.4.4 プロセス定義の削除
管理者はすべてのユーザのプロセス定義を削除することができます。ただし、一般ユーザは自分が所有者であるプロセス定義だけ削
除できます。
プロセス定義の削除方法について説明します。
1. WFAdminSessionインタフェースのdeletePlan()を使用します。
adminSession.deletePlan(planList[i].getId());
このメソッドは、データベースから指定されたプロセス定義を選択します。プロセス定義は、「ドラフト」または「プライベート」状態
である必要があります。プロセス定義の状態がそれ以外の場合は、状態が「削除済」に変わりますが、データベースから物理的
に削除されるわけではありません。
7.4.5 アーカイブ済のプロセス定義の削除
データベースからアーカイブ済のプロセス定義を削除する方法について説明します。
1. WFAdminSessionインタフェースのdeleteArchivedPlan()を使用します。
adminSession.deleteArchivedPlan(archivedPlanList[i].getId());
7.4.6 プロセス定義のインポート
XPDLファイルをインポートする方法について説明します。
1. WFObjectFactory.getPlan()を使用して、空のプロセス定義オブジェクトを作成します。
2. setWFSession()を使用して、現在のセッションをプロセス定義オブジェクトに設定します。
3. convertFromXPDL()を使用して、XPDLファイルからプロセス定義オブジェクトを作成します。
例
以下の例が正しく動作するように、定義したインポート元のディレクトリDIR_PATH_IMPORTにファイルが含まれていることを確認しま
す。
File importDir = new File(DIR_PATH_IMPORT);
if (importDir.exists() && importDir.isDirectory()) {
File[] fileList = importDir.listFiles();
String filePath; boolean fileFound = false;
Plan plan = null;
for (int i = 0; i < fileList.length; i++) {
filePath = fileList[i].getAbsolutePath();
if (filePath.endsWith(".xml") ||
filePath.endsWith(".xpdl")) {
plan = WFObjectFactory.getPlan();
plan.setWFSession(adminSession);
plan.convertFromXPDL(new FileInputStream(fileList[i]));
- 145 -
break;
}
}
}
7.4.7 プロセス定義のエクスポート
PlanインタフェースのconvertToXPDL()を使用して、プロセス定義をXPDLデータに変換することができます。プロセス定義をインポー
トする場合と同様に、インポートの宣言を拡張する必要があります。
プロセス定義をXPDLファイルにエクスポートする方法について説明します。
1. プロセス定義のリストから最初のプロセス定義を取得します。
if (planList != null && planList.length > 0) {
Plan plan = planList[0];
. . .
}
2. エクスポート先のディレクトリが存在するかどうかを確認します。存在しない場合は、新しいディレクトリを作成します。
File exportDir = new File(DIR_PATH_EXPORT);
if (!exportDir.exists() || !exportDir.isDirectory()) {
exportDir.mkdir();
}
3. エクスポートファイルを絶対ファイル名で生成します。
String fileName = DIR_PATH_EXPORT + "/" + "PLAN_" +
plan.getName() + "_" + plan.getId() + ".xml";
4. 新しいファイルオブジェクトを作成します。
File file = new File(fileName);
if (!file.exists()) {
file.createNewFile();
. . .
}
5. プロセス定義をXPDLに変換します。
plan.convertToXPDL(new FileOutputStream(file));
7.5 プロセスインスタンス管理
ここでは、以下のプロセスインスタンス管理タスクについて説明します。
・ プロセスインスタンスリストを作成する
・ プロセスインスタンスの所有権を変更する
・ プロセスインスタンスをアーカイブする
・ プロセスインスタンスを一時停止する
・ プロセスインスタンスを中止する
・ プロセスインスタンスを削除する
・ アーカイブ済のプロセスインスタンスを削除する
- 146 -
7.5.1 プロセスインスタンスリストの作成
プロセスインスタンスリストを作成するには、com.fujitsu.iflow.model.workflowパッケージのWFObjectListインタフェースを使用します。
このインタフェースは、Interstage BPMサーバから既存のWFObjectsのリストを取得します。
プロセスインスタンスリストを作成する方法について説明します。
1. Filterクラスを使用して、フィルタを作成します。
プロセスインスタンスのフィルタには以下の条件を使用することができます。
- AllActiveProcesses: 活性中のすべてのプロセスインスタンスを取得します。
- AllArchivedProcesses: アーカイブ済のすべてのプロセスインスタンスを取得します。
- AllInactiveProcesses: 非活性状態のすべてのプロセスインスタンスを取得します。
- AllProcesses: すべてのプロセスインスタンスを取得します。
- AllProcessesInErrorState: 非活性状態のすべてのプロセスインスタンスを取得します。
- MyActiveProcesses: ログイン中のユーザによって開始された活性中のすべてのプロセスインスタンスを取得します。
- MyInactiveProcesses: ログイン中のユーザによって開始された非活性状態のすべてのプロセスインスタンスを取得します。
- MyProcesses: ログイン中のユーザによって開始されたすべてのプロセスインスタンスを取得します。
2. openBatchedList()を使用します。
3. openBatchedList()に設定したフィルタ条件に一致する、返却されたオブジェクトのリストの取得を繰り返します。
プロセスインスタンスリストを作成する方法の詳しいサンプルコードに関しては、Windowsの場合<Interstage BPMサーバのインストール
ディレクトリ>\client¥samples¥examples¥sources、SolarisまたはLinuxの場合<Interstage BPMサーバのインストールディレクトリ>/client/
samples/examples/sourcesディレクトリ内のAdministration.javaサンプルソースファイルを参照してください。
7.5.2 プロセスインスタンスの所有権の変更
プロセスインスタンスの所有権を変更できるのは、管理者または現在のプロセスインスタンスの所有者だけです。プロセスの所有権は、
プロセス定義レベルで設定される必要があります。プロセス所有者は、「所有者のロール」に属性を設定することで定義されます。「所
有者のロール」という属性は、新しいプロセスインスタンスを活性化する前にInterstage BPMサーバによって確認されます。
ProcessInstanceインタフェースのsetOwners()を使用して、実行中のプロセスインスタンスの所有者を設定します。実際に所有権を変更
する前に、このメソッドは新たに所有者となるユーザやグループの存在を確認します。新たな所有者が存在しない場合、プロセスイン
スタンスはエラー状態になります。
以下の例では、プロセスインスタンスの所有権を、ユーザリストの最初のユーザに割当てます。
プロセスインスタンスの所有権を変更する方法について説明します。
1. 既存の全ユーザグループのリストを作成し、最初のグループのユーザリストを取得します。
if (procInstList != null) {
String[] owners = null;
String role = "";
DirectoryServices ds = WFObjectFactory.getDirectoryServices(
adminSession, adminName, password);
String[] groups = ds.getUserGroups();
if (groups != null && groups.length > 0) {
role = groups[0];
}
owners = ds.getUserList(role);
if (owners != null) {
boolean assigned = false;
...
}
}
- 147 -
2. プロセスインスタンスの所有者を変更するために、編集モードを開始します。
for (int i = 0; i < procInstList.length; i++) {
procInstList[i].startEdit();
...
}
3. プロセスインスタンスに所有者を設定します。
procInstList[i].setOwners(owners);
4. 編集モードをコミットします。
procInstList[i].commitEdit();
assigned = true;
7.5.3 プロセスインスタンスのアーカイブ
アーカイブできるのは、終了、中止、またはエラー状態のプロセスインスタンスだけです。そのため、プロセスインスタンスをアーカイブ
する前に、プロセスインスタンスの現在の状態を確認する必要があります。ProcessInstanceインタフェースから定数STATE_CLOSEDを
使用するとプロセスインスタンスの終了状態を特定できます。定数STATE_ERRORまたはSTATE_ABORTEDを使用し、プロセスイン
スタンスがエラー状態であるか中止状態であるかを確認します。
プロセスインスタンスをアーカイブする方法について説明します。
1. プロセスインスタンスのリストから、終了、中止、またはエラー状態のプロセスインスタンスを取得します。そのためには、ProcessInstance
インタフェースのgetState()を使用してプロセスインスタンスの現在の状態を確認します。
if (procInstList[i].getState() == ProcessInstance.STATE_CLOSED) || ProcessInstance.STATE_ABORTED ||
ProcessInstance.STATE_ERROR
{
...
}
2. 終了状態のプロセスインスタンスをアーカイブするには、WFAdminSessionインタフェースのarchiveClosedProcess()を使用しま
す。
adminSession.archiveClosedProcess(procInstList[i].getId());
一度プロセスインスタンスをアーカイブした後も、以下のように再取得できます。
1. アーカイブ済のプロセスインスタンスのIDを再取得するには、アーカイブ済のプロセスインスタンスの全リストを取得します。
AllArchivedProcessesフィルタの基準を利用します。
2. 特 定 の ア ー カ イ ブ 済 の プ ロ セ ス イ ン ス タ ン ス を 取 得 す る に は 、 WFAdminSession
interface.
adminSession.getArchivedProcess(procInstList[i].getId())のgetArchivedProcess(id)を使用します。
アーカイブ済のプロセスインスタンスに対して実行できるのは、情報の取得など、一部の関数のみであることにご注意ください。プロセ
スインスタンスを変更する関数すべてが、アーカイブ済プロセスインスタンスでサポートされているわけではありません(setNameなど)。
7.5.4 プロセスインスタンスの一時停止
実行中のプロセスインスタンスを一時停止すると、インスタンスの状態がSTATE_SUSPENDEDに変わります。このプロセスインスタンス
にワークアイテムがあった場合は、それらも一時停止します。プロセスインスタンスに実行中のサブプロセスインスタンスがあった場合
は、それらも一時停止します。
プロセスインスタンスを一時停止する方法について説明します。
1. プロセスインスタンスの一覧で、実行中のプロセスインスタンスかどうかを確認します。そのためには、ProcessInstanceインタフェースの
getState()を使用してプロセスインスタンスの現在の状態を確認します。
if (procInstList[i].getState() == ProcessInstance.STATE_RUNNING)
{
- 148 -
...
}
2. 実行中のプロセスインスタンスを一時停止するには、ProcessInstanceインタフェースのsuspend()を使用します。
procInstList[i].suspend();
注意
プロセスインスタンスがSTATE_SUSPENDEDに変更される前に、プロセス定義レベルまたはアクティビティノードレベルで定義されている
Java Actionのセットが実行されることがあります。このJava Actionのセットは、suspend()コマンドを呼び出すとすぐに活性化されます。例
えば、通知メールがプロセスインスタンスの所有者に送信されたり、追加のログファイルエントリが書き込まれたりします。
onSuspendJavaActionSetの定義方法の詳細については、「6.3.11 中止時、一時停止時、および再開時アクションの使用」を参照してく
ださい。
ProcessInstanceインタフェースのresume()を使用して、一時停止しているプロセスインスタンスを再開することができます。プロセスイン
スタンスの状態は、STATE_RUNNINGに変わります。
ここでも、プロセスインスタンスがSTATE_RUNNINGに再び変更される前に、プロセス定義レベルまたはアクティビティノードレベルで
定義されているJava Actionのセットが実行されることがあります。このJava Actionのセットは、resume()コマンドを呼び出すとすぐに活性
化されます。
7.5.5 プロセスインスタンスの中止
プロセスインスタンスを中止すると、インスタンスの状態がSTATE_ABORTEDに変わります。このプロセスインスタンスにワークアイテム
があった場合は、すべて削除されます。プロセスインスタンスに実行中のサブプロセスインスタンスがあった場合は、それらも中止され
ます。
プロセスインスタンスを中止する方法について説明します。
1. ProcessInstanceインタフェースのabort()を使用します。
このメソッドは管理者、またはプロセスインスタンスの所有者だけが使用できます。ほかのユーザは、プロセスインスタンスの中止
を許可されていません。
例
以下の例では、ProcessInstanceインタフェースのgetState()を使用して、プロセスインスタンスのリスト内で実行中(定数STATE_RUNNING)
または一時停止中(定数STATE_SUSPENDED)のインスタンスをチェックします。getState()はプロセスインスタンスの現在の状態を返し
ます。次に、リスト内で最初に見つかった実行中、または一時停止中のプロセスインスタンスを中止します。
if (procInstList != null ) {
boolean aborted = false;
for (int i = 0; i < procInstList.length; i++) {
if (procInstList[i].getState() ==
ProcessInstance.STATE_RUNNING
|| procInstList[i].getState() == ProcessInstance.STATE_SUSPENDED)
{
procInstList[i].abort();
aborted = true;
}
}
}
注意
プロセスインスタンスがSTATE_ABORTEDに再び変更される前に、プロセス定義レベルまたはアクティビティノードレベルで定義されている
Java Actionのセットが実行されることがあります。このJava Actionのセットは、abort()コマンドを呼び出すとすぐに活性化されます。例え
ば、通知メールがプロセスインスタンスの所有者に送信されたり、追加のログファイルエントリが書き込まれたりします。onAbortJavaActionSet
の定義方法の詳細については、「6.3.11 中止時、一時停止時、および再開時アクションの使用」を参照してください。
- 149 -
7.5.6 プロセスインスタンスの削除
プロセスインスタンスの削除方法について説明します。
1. WFAdminSessionインタフェースのdeleteProcessInstance()を使用します。
このメソッドは、プロセスインスタンスのIDを使用してデータベースからプロセスインスタンスを削除します。
例
以下の例では、リスト内の最初の有効なプロセスインスタンスが削除されます。
if (procInstList != null ) {
boolean deleted = false;
for (int i = 0; i < procInstList.length; i++) {
adminSession.deleteProcessInstance
(procInstList[i].getId());
deleted = true;
break;
}
}
7.5.7 アーカイブ済のプロセスインスタンスの削除
データベースからアーカイブ済のプロセスインスタンスを削除する方法について説明します。
1. WFAdminSessionインタフェースのdeleteArchivedProcess()を使用します。
adminSession.deleteArchivedProcess(archivedProcInstList[i].getId());
7.6 ワークアイテム管理
ここでは、以下のワークアイテム管理タスクについて説明します。
・ ワークアイテムを別のユーザに再割当てする
・ ワークアイテムを更新する
7.6.1 ワークアイテムのユーザに再割当て
ワークアイテムを別のユーザに再割当てする方法について説明します。
1. WFSessionAdminインタフェースのreassign()を使用します。
例
以下の例では、ワークアイテムをあるユーザから別の既存のユーザに再割当てする方法を示しています。
if (workItemList != null && workItemList.length > 0) {
WorkItem workItem = workItemList[0];
UserInfo[] userList = listUsers();
String oldAssignee = "";
String newAssignee = "";
if (userList != null && userList.length > 0) {
oldAssignee = workItem.getAssignee();
newAssignee = userList[0].getName();
adminSession.reassign(oldAssignee, newAssignee,
workItem.getProcessInstanceId(),
workItem.getId(),false);
}
}
- 150 -
7.6.2 ワークアイテムの更新
管理者がロールにユーザを追加したり、削除したりする場合、この情報が自動的に関連する活性中のタスクのワークアイテムに転送さ
れることはありません。一般的な操作では、ワークアイテムは、アクティビティが開始された時点のグループに合わせて作成されます。
そして、ワークアイテム作成後のグループの変更は無視されます。しかし、作成されたワークアイテムを変更したグループメンバーに合
わせたい場合があります。この場合の情報を更新するには、管理者がワークアイテムを更新する必要があります。
タスクを完了するために、さまざまな反復処理が必要となるので、ワークアイテムを更新するにはある程度時間がかかります。したがっ
て、実行にかかる時間は、データベース内の活性中のタスクの量に依存します。実行時間を短縮するため、更新するワークアイテムを
選択する際には、以下のオプションがあります。
・ プロセスインスタンスのワークアイテム。
・ プロセス定義に属するすべてのプロセスインスタンスのワークアイテム。
・ グループのワークアイテム。
・ すべての既存のワークアイテム。
・ プロセスインスタンスのワークアイテムを更新する方法について説明します。
boolean ignoreActivityWithRoleScript = true;
String refreshResult = null;
if (procInst != null) {
long procInstId = procInst.getId();
refreshResult = adminSession.refreshWIforProcess(procInstId,
ignoreActivityWithRoleScript);
}
・ プロセス定義に属するすべてのプロセスインスタンスのワークアイテムを更新します。
if (procDef != null) {
long procDefId = procDef.getId();
refreshResult = adminSession.refreshWIforPlan(procDefId,
ignoreActivityWithRoleScript);
・ グループのワークアイテムを更新します。
String group = "SampleGroup";
refreshResult = adminSession.refreshWIforGroup(group,
ignoreActivityWithRoleScript);
・ すべてのワークアイテムを更新します。
refreshResult = adminSession.refreshWorkItems
(ignoreActivityWithRoleScript);
注意
Interstage BPMサーバの SupportGroupWorkItemパラメータにtrueが設定されている場合、Filter.MyActiveWorkItemsフィルタはサポー
トしません。したがって、このフィルタを使用してワークアイテムを取得することはできません。
この場合、更新するワークアイテムを取得する独自のフィルタを定義する必要があります。ワークアイテムのフィルタを構築する詳細に
ついては、「5.3.3 ワークアイテムリストの作成」を参照してください。SupportGroupWorkItemパラメータの詳細については、『Interstage BPM
サーバ 管理者ガイド』を参照してください。
更新結果はXMLの文字列としてフォーマットされ、操作が成功したか、失敗したかがリストで表示されます。以下にXML文字列の例を
示します。
<?xml version="1.0" encoding="UTF-8" ?>
<Processes>
<success>
- 151 -
<Process Name="procName" id="123"></Process>
</success>
<failed>
<Process Name="procName" id="456" Status="ignored"
message="error message" />
<Process Name="procName" id="123">
<Activities>
<Activity Id="123456" Name="activityName"
Status="ignored" message="error message" />
</Activities>
</Process>
</failed>
</Processes>
<success>タグには、ワークアイテムの更新に成功したプロセスインスタンスの一覧が含まれています。<failed>タグには、更新に失敗し
たプロセスインスタンスの一覧が含まれています。<Activities>タグには更新に失敗したプロセスインスタンスのアクティビティが含まれ
ています。
- 152 -
第8章 履歴情報の取得
各プロセスインスタンスは、ワークフローに関する情報を、teamflowdbというInterstage BPMのデータベースに保存します。teamflowdb
データベースのHistoryテーブルには、プロセスインスタンスのワークフロー内の各ステップが保存されています。
Historyテーブルから履歴情報を取得するには以下の方法があります。
・ Model APIを使用する
・ ハッシュテーブルから取得する
・ SQLステートメントを使用する
8.1 Model APIを使用した履歴情報の取得
Model APIを使用して、プロセスインスタンスから履歴情報を取得する方法について説明します。
1. 次のコードを基礎として使用します。
import com.fujitsu.iflow.model.workflow.ProcessInstance;
import com.fujitsu.iflow.model.util.IflowEnumeration;
int processHistoryFields[] = {
ProcessInstance.HISTORY_ID,
ProcessInstance.HISTORY_TIME_STAMP,
ProcessInstance.HISTORY_EVENT_CODE,
ProcessInstance.HISTORY_EVENT_TYPE,
ProcessInstance.HISTORY_RESPONSIBLE,
ProcessInstance.HISTORY_PRODUCER_TYPE,
ProcessInstance.HISTORY_PRODUCER_ID,
ProcessInstance.HISTORY_CONSUMER_TYPE,
ProcessInstance.HISTORY_CONSUMER_ID,
ProcessInstance.HISTORY_PROCESSINSTANCE_ID,
ProcessInstance.HISTORY_ISHANDLED_CODE,
ProcessInstance.HISTORY_EVENTDATA
};
ProcessInstance procInst =
WFObjectFactory.getProcessInstance(procID, session);
IflowEnumeration sElements =
processInstance.getHistory(processHistoryFields);
getHistory()は、関連するプロセスインスタンスから、すべての履歴データを取得します。取得する列は、INTEGER型の配列で
定義され、メソッドの引数に渡されます。
2. 取得したIflowEnumeration型のオブジェクトを検索し、履歴エントリの各行にアクセスします。
while(sElements.hasMoreElements())
{
Hashtable htblEvent = (Hashtable) sElements.nextElement();
// ここに、「ハッシュテーブルからの履歴情報の取得」のコードが入ります。
}
以下のテーブルは、ProcessInstanceクラスの定数とHistoryテーブルの列のマッピングを示しています。
列名
ProcessInstanceクラスの定数
HISTORY_ID
historyID
HISTORY_TIME_STAMP
CreatedTime
HISTORY_EVENT_CODE
EventCode
HISTORY_EVENT_TYPE
EventType
- 153 -
列名
ProcessInstanceクラスの定数
HISTORY_EVENTDATA
EventData
HISTORY_PRODUCER_TYPE
ProducerType
HISTORY_PRODUCER_ID
ProducerId
HISTORY_CONSUMER_TYPE
ConsumerType
HISTORY_CONSUMER_ID
ConsumerId
HISTORY_ISHANDLED_CODE
IsHandled
HISTORY_PROCESSINSTANCE_ID
ProcessInstanceId
HISTORY_RESPONSIBLE
Responsible
8.2 ハッシュテーブルからの履歴情報の取得
「8.1 Model APIを使用した履歴情報の取得」のコードを使用して、プロセスインスタンスからすべての履歴データを取得することができ
ます。結果は、ハッシュテーブルに保存されます。以降の各節では、ProcessInstanceクラスの単一定数の値を取得する方法を説明しま
す。
8.2.1 HISTORY_ID
エントリの履歴IDを取得するには、次のコードを使用します。
long historyId = ((Long)htblEvent.get
(new Integer(ProcessInstance.HISTORY_ID))).longValue();
Historyテーブルの各エントリには、固有の識別子が設定されています。
8.2.2 HISTORY_TIME_STAMP
エントリのタイムスタンプを取得するには、次のコードを使用します。
long timestamp = ((Long)htblEvent.get(
new Integer(ProcessInstance.HISTORY_TIME_STAMP))).longValue();
LONG型の日付の値を読みやすい形式に変換するには、標準のJavaステートメントを使用します。
8.2.3 HISTORY_EVENT_CODE
エントリのイベントコードを取得するには、次のコードを使用します。
long historyEventCode = ((Long) htblEvent.get
(new Integer(ProcessInstance.HISTORY_EVENT_CODE)).longValue();
イベントコードは、イベントの種類を表します。次の表は、イベントコードの値と、その意味を示しています。
イベントコード
説明
0
開始(デフォルト)
1
活性化
2
選択
3
承認
4
拒否
5
再割当て
6
終了
7
サブプロセスを作成
- 154 -
イベントコード
説明
8
ワークアイテムを一時停止
9
ワークアイテムを再開
10
作業開始
11
作業停止
12
投票完了
13
プロセス作成
14
プロセス移行
15
プロセス取戻し
16
ターゲットノードを非活性化
17
ソースノードを活性化
25
将来のワークアイテム作成
8.2.4 HISTORY_EVENT_TYPE
エントリのイベントタイプを取得するには、次のコードを使用します。
String eventType = (String) htblEvent.get(
new Integer(ProcessInstance.HISTORY_EVENT_TYPE));
イベントタイプは、Interstage BPMのアクティビティの名前または矢印の名前を特定します。たとえば、矢印にCreate Purchase Requisition
という名前が付けられている場合、HISTORY_EVENT_TYPEの結果は、Create Purchase Requisitionとなります。
8.2.5 HISTORY_EVENTDATA
イベントに関する追加データを取得するには、次のコードを使用します。
String eventData = (String) htblEvent.get(
new Integer(ProcessInstance.HISTORY_EVENTDATA));
取得した値は、ほとんどの場合、NULLとなります。
8.2.6 HISTORY_PRODUCER_ID
エントリのプロデューサIDを取得するには、次のコードを使用します。
long producerId = ((Long)htblEvent.get(
new Integer(ProcessInstance.HISTORY_PRODUCER_ID))).longValue();
プロデューサタイプに応じて、プロデューサIDは異なる種類の情報を指定します。
8.2.7 HISTORY_PRODUCER_TYPE
エントリのプロデューサタイプを取得するには、次のコードを使用します。
long lProdType=((Long)htblEvent.get(
new Integer(ProcessInstance.HISTORY_PRODUCER_TYPE))).longValue();
プロデューサタイプは、現在のイベントの作成に関与するイベントを示します。次の表は、プロデューサタイプの値と、その意味を示し
ています。
プロデューサタイプ
説明
0
矢印
3
アクティビティ
- 155 -
プロデューサタイプ
説明
7
プロセス
15
タイマ
8.2.8 HISTORY_CONSUMER_ID
エントリのコンシューマIDを取得するには、次のコードを使用します。
long consumerId = ((Long)htblEvent.get(
new Integer(ProcessInstance.HISTORY_CONSUMER_ID))).longValue();
コンシューマタイプに応じて、コンシューマIDは様々な種類の情報を指定します。詳細については、「8.2.13 履歴エントリの検索ルー
ル」を参照してください。
8.2.9 HISTORY_CONSUMER_TYPE
エントリのコンシューマタイプを取得するには、次のコードを使用します。
long lConsType = ((Long)htblEvent.get(
new Integer(ProcessInstance.HISTORY_CONSUMER_TYPE))).longValue();
コンシューマタイプは、イベントの対象となっているエレメントの種類を示します。次の表は、コンシューマタイプの値と、その意味を示し
ています。
コンシューマタイプ
説明
3
アクティビティ
7
プロセス
コンシューマタイプを解釈する方法の詳細については、「8.2.13 履歴エントリの検索ルール」を参照してください。
8.2.10 HISTORY_ISHANDLED_CODE
エントリのIsHandledの値を取得するには、次のコードを使用します。
long isHandledCode = ((Long)htblEvent.get(
new Integer(ProcessInstance.HISTORY_ISHANDLED_CODE)))
.longValue();
次の表は、IsHandledの値と、その意味を示しています。
説明
isHandledコード
0
未処理
1
処理済
2
無視
3
エラー
4
監査
5
一時停止
8.2.11 HISTORY_PROCESSINSTANCE_ID
エントリのプロセスインスタンスIDを取得するには、次のコードを使用します。
long procInstId = ((Long)htblEvent.get(
new Integer(ProcessInstance.HISTORY_PROCESSINSTANCE_ID)))
.longValue();
- 156 -
8.2.12 HISTORY_RESPONSIBLE
Historyテーブルへのエントリの要因となった作業者を取得するには、次のコードを使用します。
String responsible = (String) htblEvent.get(
new Integer(ProcessInstance.HISTORY_RESPONSIBLE));
取得可能な値は、次のとおりです。
・ __process
ワークフローエンジンのアクティビティを示すシステムユーザID
・ <userID>
アクションを実行したユーザIDを示す、有効なユーザID
8.2.13 履歴エントリの検索ルール
プロセスインスタンスのHistoryテーブルのエントリを検索するには、次のルールが定義されています。
ルール1
Historyテーブルのエントリを検索するには、以下の3条件のうちの1つを満たしているエントリだけが評価されます。
・ 活性化イベント
次の基準をすべて満たすものに適用されます。
- ConsumerTypeが、3と定義されている(アクティビティ)
- EventTypeが、__Activateと等しい
・ Activityノード
次の基準をすべて満たすものに適用されます。
- ConsumerTypeが、3と定義されている(アクティビティ)
- EventTypeが、__Activateと等しくない
- ProducerTypeが、7と定義されている(プロセス)
・ 矢印
次の基準をすべて満たすものに適用されます。
- ConsumerTypeが、3と定義されている(アクティビティ)
- EventTypeが、__Activateと等しくない
- ProducerTypeが、0と定義されている(矢印)
ルール2
タイプ1のエントリ、つまり、活性化イベントがある場合、タイムスタンプだけが取得されます。
ルール3
タイプ2のエントリ、つまり、Activityノードがある場合、コンシューマIDは、プロセスインスタンス内のノードインスタンスのIDを表します。
Model APIを使用して、ノードインスタンスを次のように取得することができます。
// CONSUMER_IDは、ノードインスタンスIDを表します。
long consumerId = ((Long)htblEvent.get(
- 157 -
new Integer(ProcessInstance.HISTORY_CONSUMER_ID))).longValue();
NodeInstance nodeInst = procInst.getNodeInstance(consumerId);
// NodeInstanceクラスのオブジェクトから引き続き
// 情報を取得します。
ルール4
タイプ3のエントリ、つまり、矢印がある場合、プロデューサIDは、プロセスインスタンス内の矢印インスタンスのIDを表します。Model API
を使用して、始点および終点のノードのノードインスタンスを次のように取得することができます。
// PRODUCER_IDは、矢印インスタンスIDを表します。
long producerId = ((Long)htblEvent.get(
new Integer(ProcessInstance.HISTORY_PRODUCER_ID))).longValue();
ArrowInstance arrow = procInst.getArrowInstance(producerId);
NodeInstance sourceNodeInst = arrow.getSourceNodeInstance();
NodeInstance targetNodeInst = arrow.getTargetNodeInstance();
// 矢印インスタンスのソースオブジェクトとターゲットオブジェクトから
// 引き続き情報を取得します。
8.3 履歴テーブル
履歴テーブルでは、プロセスインスタンスのワークフローでの各ステップは別々のエントリ(行)で定義されます。ステップは「プロセスイ
ンスタンスの作成」のようなシステムアクションや「承認に投票」のようなプロセス定義で明示的に定義されるアクティビティの実行で定義
されます。
注意
Interstage BPMの将来のバージョンではここで説明しているデータベーススキーマは変更されるかもしれません。データベーススキー
マに基づいてアプリケーションを開発する場合、データベーススキーマが変更されるとアプリケーションも変更する必要があります。
フィールド
値・サンプル
備考
historyID
888919
履歴テーブル各行で単一に識別
EventCode
0=Start (default)
1=Activate
2=MakeChoice
3=Accept
4=Decline
5=Reassign
6=Exit
7=CreateSubProcess
8=SuspendWorkItem
9=ResumeWorkItem
10=StartWork
11=StopWork
12=VotingComplete
13=ProcessCreated
14=ProcessMigrated
15=ProcessRecall
16=DeactivateTargetNode
各コードは別々のEventを一意に識別
- 158 -
フィールド
値・サンプル
備考
17=ActivateSourceNode
25=GenerateFutureWorkItems
EventType
"Approve"
または
"Submit Purchase Order:99198"
Event名
EventData
NULL
追加情報。ほとんどの場合はNULLで
す。
CreatedTime
"2004-11-12 13:19:12.820"
または
"22.12.2004 16:48"
このアクティビティ作成のタイマースタンプ
(文字列形式)
Responsible
"jim"
または
"__process"
イベント作成の原因となったユーザまた
はシステムの名前。ノードに割当てられ
たユーザグループがない場合はシステム
がノードを実行し、名前"__process"を使
用します。
IsHandled
0=notHandled
1=handled
2=ignored
3=Error
4=audit↓
Eventの状態
ProducerType
0: arrow
7: node↓
現在のEvent作成の原因となったエレメン
ト。矢印かノードのいずれか。
ProducerId
99130
ProducerType = 0の場合、ProducerIdは
現在のEventの矢印インスタンスIDを示し
ます。矢印インスタンスIDを使ってEvent
のソースとターゲットノードインスタンスを
取得できます。
ConsumerType
0=ArrowType
3=ActivityType
7=ProcessType
Eventが示すエレメントタイプ
ConsumerId
99116
ProducerType = 7の場合、ConsumerIdは
現在のノードのノードインスタンスIDを示
します。
ProducerType = 0の場合、ConsumerIdは
ターゲットノードのノードインスタンスIDを
示します。同じノードインスタンスを矢印
インスタンスから取得することができます。
ProcessInstanceId
88892
プロセスインスタンスの一意なID
ServerName
Localhost
これらのEventが生成・処理されるサーバ
名
applicationContainerId
2
プロセスインスタンスを含むアプリケーショ
ンの一意な識別子
8.4 SQLステートメントの履歴情報検索
teamflowdbデータベースでSQLステートメントを使用して履歴情報を検索できます。
・ 履歴テーブルに保存されたすべてのデータに関する全体像を得るには、以下のように設定します。
SELECT * HISTORY
- 159 -
・ 特定のプロセスインスタンスにリンクしたすべての行を検索するには、以下のように設定します。
SELECT * FROM HISTORY WHERE PROCESSINSTANCEID=<PROCID>
プロセスインスタンスの要求されたID(数字)で<PROCID>を置き換えます。
以下の図は完了したプロセスインスタンスに割り当てられた履歴テーブルへのすべてのエントリ例を示しています。
図8.1 履歴テーブルのエントリ
- 160 -
付録A Interstage BPMのサンプル
このマニュアルのサンプルでは、Model APIを使ってInterstage BPMのプログラミングを行うさまざまな方法を示します。Interstage BPM
サ ー バ を イ ン ス ト ー ル す る と 、 <Interstage BPM サ ー バ の イ ン ス ト ー ル デ ィ レ ク ト リ > デ ィ レ ク ト リ (Windows の 場 合 C:¥Fujitsu
¥InterstageBPM、SolarisまたはLinuxの場合/opt/FJSVibpm)に以下のサブディレクトリが作成されます。
¥client\samples¥examples¥sources (Windowsの場合)、/client/samples/examples/sources (SolarisまたはLinuxの場合)
¥ client\samples¥examples¥classes (Windowsの場合)、/client/samples/examples/classes (SolarisまたはLinuxの場合)
¥ client\samples¥examples¥bin (Windowsの場合)、/client/samples/examples/bin (SolarisまたはLinuxの場合)
各サブディレクトリの内容については、次の節で詳しく説明します。
注意
SaaSモードでサンプルプログラムを使用するには、<Interstage BPM インストールディレクトリ>/client/ フォルダ内のiFlowClient.properties
のTenantNameプロパティに適切な値を設定してください。
A.1 /client/samples/examples/sources
このディレクトリにはこのマニュアル中で使用される例のJavaソースコードが格納されています。 例の実行方法は、Interstage BPMサー
バのインストールディレクトリの/client/samples/examples/sourcesサブディレクトリにあるサンプルソースコードを参照してください。
以下は、利用できるサンプルソースのリストと、このマニュアル中での説明箇所です。
A.1.1
プロセスのモデル化と実行に関連したサンプル
SimplePlan.java
このサンプルは単純なInterstage BPMプロセス定義を作成します。
「5.1 基本的なプロセス定義のデザイン」に追加情報があります。
ComplexPlan.java
このサンプルは、ユーザ定義属性やVoting Activityノードの追加方法、Java Actionの使い方など、複雑なInterstage BPMプロセス定
義の作成方法を示します。
このサンプルに関する追加情報については、以下を参照してください。
「5.2 応用的なプロセス定義のデザイン」
「6.3 Java Action」
「6.4 フィルターとソートのAPI」
「6.7 特別なユーザ定義属性のプロパティ」
「6.8 拡張属性の使用」
「6.9 トランザクション制御」に追加情報があります。
ProcessExecution.java
このサンプルは新しいプロセスインスタンスの開始とワークアイテム実行の方法を示します。
「5.3 プロセスインスタンス」
「6.9 トランザクション制御」に追加情報があります。
- 161 -
注意
このサンプルにはInterstage BPMサーバインストールディレクトリへのpath を含むINSTALL_ROOT定数があります。デフォルトでは、path
の値にはC:\Fujitsu\InterstageBPM が設定されます。UNIXまたはLinuxを使用している場合、もしくは、Interstage BPMサーバを違う
場所にインストールした場合は、この値を調整する必要があります。
SampleJavaActions.java
このサンプルには、ComplexPlan.javaで作成したプロセス定義で定義されたJava Action(メールの送信など)の使用方法が含まれま
す。
「6.3 Java Action」に追加情報があります。
TriggerTimerSample.java
このサンプルはトリガ、タイマーおよびビジネスカレンダーの使用を示します。トリガで始まるプロセス定義を作成します。
「6.10 トリガ」
「6.16 タイマーの使用」に追加情報があります。
RemoteSubProcess.java
このサンプルは、リモートサブプロセスを定義、使用する方法を示しています。Remote Subprocessノードとリモートサブプロセスとして使
用される別のプロセス定義を含むプロセス定義を作成します。
「6.17 リモートサブプロセスのモデル化」に追加情報があります。
AgentSimulator.java and AgentSimulator.xpdl
AgentSimulator.xpdlは、簡単な銀行ローン承認プロセスをモデル化するプロセス定義です。AgentSimulator.javaはローンを決定する
担当をシミュレーションするエージェントクラスの例です。さらなる情報はAgentSimulator.java ソースファイルと「6.15 エージェントの使
用」を参照してください。
HTTPAgentExample
HTTPAgentExampleサブディレクトリにはHTTPエージェントを実行するためにあらかじめ設定されたHTTP Exampleがあります。 例の
エージェントではHTTPエージェントの完全な機能性を示します。さらなる詳細情報はHTTPAgentExampleInstructions.txtファイルと
「6.15.5 HTTPエージェントの使用」を参照してください。
A.1.2
System Administration に関連したサンプル
Administration.java
このサンプルはユーザリスト作成、ユーザログアウト、ユーザディレクトリからのデータをリセット、プロセス定義の発行・保存などのような
様々な管理アクティビティを示します。
注意
このサンプルは既存のプロセス定義とプロセスインスタンスで実行します。確実にすべてのプロセス定義が有効で実行可能であるよう
にしてください。さらに、このサンプルが新しいインスタンスを開始し、既存のインスタンスの状態を変更するようにしてください。
「第7章 運用管理」に追加情報があります。
SampleLocalUserManagement.java
このサンプルはローカルユーザとグループを作成、グループにユーザを配属、他のグループにグループを関連づけるなどのローカル
ユーザとグループ管理を示します。
「7.3 ユーザおよびグループ管理」に追加情報があります。
- 162 -
A.1.3
JMS インタフェースに関連したサンプル
注意
非SaaSモードでだけ、JMSインタフェースの機能を使用できます。
JMSインタフェースはModel APIのようなInterstage BPMサーバへのインタフェースです。Model APIですべてのInterstage BPMオペ
レーションを実行するオブジェクトをモデル化するためにメソッドに呼び出すことができます。Model APIはInterstage BPMサーバへの
主要インタフェースですが、オプションとしてJMSインタフェースを使用することによって、よりダイレクトに情報交換ができます。しかしJMS
インタフェースの機能はいくつかの主要なInterstage BPMオペレーションに制限されます。
JMSインタフェースの基本トピックは2つあります。
・ Interstage BPMコマンドトピック
・ Interstage BPM応答トピック
JMSクライアントはコマンドトピックに要求メッセージを掲示します。このメッセージにはInterstage BPMコマンドとその実行に必要な情報
が入っています。JMSクライアントから要求を受け入れるためにコマンドトピックを構成し、処理のためにInterstage BPMサーバに移しま
す。JMS APIはInterstage BPMサーバへの要求されたアクションを実行し、応答を取得します。適切な形式のすべての要求への応答
メッセージは、必要な情報を含んでいて、応答トピックに掲示されます。その情報はその後JMSクライアントに伝えられます。
要求と応答JMSメッセージはInterstage BPM JMSインタフェーススキーマiFlowJMS.xsdによりフォーマットされなければならないXML
です。<Interstage BPMのインストールディレクトリ>/client/samples/docs/jmsにiFlowJMS.xsdと関連するドキュメントがあります。
JMS Interface を使用する場合は、以下の手順に従います。
1. JMS Client の設定
- JMSインタフェースをランスルーしたいInterstage BPMコマンドにXMLに書き込む必要があるInterstage BPM情報を集めま
す。
必要な情報を決定するとき、ガイドとしてInterstage BPM JMSインタフェーススキーマiFlowJMS.xsdと、関連するドキュメント
を使用します。
- 実行するInterstage BPMコマンドにXMLを書き込みます。
もう一度ガイドとして、Interstage BPM JMSインタフェーススキーマと関連するドキュメントを使用します。任意で、XMLに
Interstage BPMインストール時に作成したデフォルト応答トピックと異なる応答トピックを指定できます。
- JMSクライアントをセットアップし、コマンドトピックに書きこんだXMLを掲示します。PATHとCLASSPATH設定のガイドとして
サンプルを使用します。アプリケーションのサーバ特定クライアントプロパティファイルをCLASSPATHに必ず追加します。
- これでコマンドトピックに書きこんだXMLを掲示する準備ができました。
2. コマンドトピックへの掲示要求
<Interstage BPM Installation Directory>/samples/examples/sourceディレクトリのInterstage BPMインスタレーションで利用可能な
様々なJMSに関連するサンプルがあります。これらのサンプルファイルはJms*.javaファイル名で認識されます。
注意
Interstage BPMのJMSインタフェースにはプロセス定義を作成するための機能がありません。ぞのため、プロセス定義の作成を示した
別のサンプルcreatePlan.javaを用意します。
Interstage BPMサンプルのビルドと実行の方法については「B.3 トリガでサポートするJavaScript関数」を参照してください。
JMS インタフェースに関連したサンプルの一覧
注意
いくつかのJMSサンプルが<Interstage BPMのインストールディレクトリ>/samples/configurationにあるサーバプロパティファイル
server.propertiesを参照します。このファイルは以下の属性の読み込み、またアップデートに使用されます。
- 163 -
planId、processId、workitemId、choiceName、UdaName
createPlanサンプルファイルによって作成されたプロセス定義を使用しない場合、対応するJMSサンプルを実行する前にこのファイルを
アップデートできます。
例: JmsAcceptWorkItemサンプルを実行している場合、server.propertiesで特定されたworkitemidが有効になっている必要があります。
JmsGetMyWorkItemsは適切なworkitemidでserver.propertiesをアップデートします。このように適切なworkitemidでserver.propertiesファ
イルをアップデートされるようにJmsAcceptWorkItemの前にJmsGetMyWorkItemsを実行する必要があります。
注意
JMS インタフェース に関連したサンプルは以前のプログラムで生成されたワークフローオブジェクトを使用するため、特定の順序で実
行する必要があります。例えば、createPlan はJmsGetMyPlans の前にJmsGetMyPlans を実行する必要があります。
JmsGetMyPlans
ログインユーザによって所有されたプロセス定義のリストを取得します。
JmsGetPlanState
プロセス定義の状態を取得します。
JmsGetPlanUDA
プロセス定義を使用してUDAを取得します。
JmsCreateProcess
プロセスインスタンスを作成します。
JmsStartProcess
プロセスインスタンスを開始します
JmsGetMyProcesses
ログインユーザによって所有されたプロセス定義のリストを取得します。
JmsGetProcessState
プロセス定義の状態を取得します。
JmsGetProcessUDA
プロセス定義を使用してUDAを取得します。
JmsGetMyWorkItems
ログインユーザに割当てられたワークアイテムのリストを取得します。
JmsAcceptWorkItem
ワークアイテムを受理します
JmsGetWorkItemState
ワークアイテムの状態を取得します。
JmsDeclineWorkItem
ワークアイテムを拒否します。
注意
このサンプルの前に、以下のサンプルを上から順番に実行してください。
・ JmsCreateProcess
・ JmsStartProcess
・ JmsGetMyWorkItems
JmsGetWorkItemUDA
ワークアイテムを使用してUDAを取得します。
JmsMakeChoice
Make choiceオペレーションを実行します。
注意
このサンプルの前に、以下のサンプルを上から順番に実行してください。
・ JmsCreateProcess
・ JmsStartProcess
・ JmsGetMyWorkItems
JmsPublishPlan
プロセス定義を発行します。
JmsObsoletePlan
プロセス定義を「廃止」状態に設定します。
- 164 -
JmsSuspendProcess
プロセスインスタンスの実行を一時停止します。
JmsResumeProcess
プロセスインスタンスの実行を再開します。
JmsAbortProcess
プロセスインスタンスの実行を停止します。
A.1.4
決定表に関連したサンプル
DecisionTableAPI.java
このサンプルは、決定表・条件変数・結果変数・決定ルールの作成、決定表の正当性確認・評価、決定表の保存、決定表ファイルの
読み込みなど、決定表の管理に関連するさまざまな操作を行います。決定表に関する詳細は、「6.21 決定表」を参照してください。
A.2 /client/samples/examples/classes
/client/samples/examples/classesサブディレクトリはサンプルのために保存されたクラスファイルを含んでいます。
A.3 /client/samples/examples/bin
Windowsの¥client¥samples¥examples¥binサブディレクトリ(SolarisまたはLinuxの場合は/client/samples/examples/bin)には、次の2つの
バッチファイルが格納されています。
StartSamples.bat: サンプルファイルの実行を開始します。SolarisまたはLinuxの場合は、StartSamples.shファイルを使用してください。
必ず実行する前に、このバッチファイルを編集し、JAVA_HOME変数にJDKをインストールするディレクトリを設定してください。さらに、
CLASSPATH変数が、iflow.jarファイルおよびアプリケーションサーバ特定のjarファイルが格納されている正確なディレクトリを指して
いることを確認してください。WeblogicとJBossのパスの例については、ファイルStartSamples.batまたはStartSamples.shを参照してくださ
い。
バッチファイルを実行する場合、サンプルファイル名(以下を参照)、管理者権限を持つユーザ名とパスワード、Interstage BPMサーバ
の名前を指定する必要があります。これらは、IBPMPROPERTIESの表またはibpm.propertiesファイルにあるものと同一でなければなり
ません。
BuildSamples.bat: Javaソースファイル用のクラスファイルを作成します。SolarisまたはLinuxの場合は、BuildSamples.shファイルを使用
してください。
この場合も、JAVA_HOME変数とCLASSPATH変数が正しいディレクトリを指していることを確認してください。
- 165 -
付録B JavaScript関数
Interstage BPMには、Java Action、トリガ、およびComplex Conditionalノードに使用できるJavaScript関数のセットが用意されています。
ここでは、これらの要素に対してどの関数を使用できるかを説明します。
ここに挙げられている関数とは別に、ECMA標準で定義しているJavaScriptの関数を使用することもできます。ECMA標準の情報につ
いては、Interstage BPMのインストールファイルに含まれているecma-262.pdfを参照してください。
注意
JavaScriptで使用するメソッドが保有しているサイズが、Java Virtual Machine (JVM)により制限されている場合があります。現在では、
そのメソッドバイトコードサイズは、65535バイト(64キロバイト)に制限されています。これ以上のサイズのメソッドを使用している場合に
は、JVMによりエラーが返されます。メソッドのサイズを縮小してから、再度JavaScriptを実行してください。
B.1 JavaScript関数
ここで説明するJavaScript関数は、Java Action、トリガ、およびComplex Conditionalノードに使用できます。
注意
数値がNumber型の値として扱われるため、JavaScriptでは、以下の範囲の整数のみ使用可能です。
・ 最低値:-9007199254740992
・ 最高値:9007199254740992
Long型の以下の最高値、最低値は、サポートしておりません。
・ 最低値:Packages.java.lang.Long.MIN_VALUE
・ 最高値:Packages.java.lang.Long.MAX_VALUE
new Packages.java.util.Date()
詳細については、J2SE Development Kit (以降、JDKと呼びます。)に付属しているJavadocを参照してください。
Date DateAdd(DateまたはNumber date, Number offset, String field)
日付にoffset値を加えた結果の日時を含むJavaScript Dateオブジェクトを返します。fieldの値には、offset値の基準となる単位を指定し
ます。有効なfield値は以下のとおりです。
説明
field値
"ss"
秒
"mi"
分
"hh"
時
"dd"
日
例:
var now = Packages.java.util.Date();
uda.Date = DateAdd (now, 1, "dd");
注意
この例が正しく機能するのは、UDA DateがDATE型の場合だけです。
- 166 -
nowが以下の値であるとします。
Tue Jul 01 2006 14:02:59 GMT-0800 (PST)
この場合、tomorrow ( DateAdd ( now, 1, "dd" ) )の値は以下のようになります。
Wed Jul 02 2006 14:02:59 GMT-0800 (PST)
dateがNUMBER型である場合、その値は1970年1月1日以降のミリ秒として解釈されます。
Boolean DateCompare(DateまたはNumber date1, String operator, DateまたはNumber date2)
2つのDate値を比較し、その結果に応じてtrueまたはfalseを返します。有効な演算子は以下のとおりです。
演算子
説明
">"
より大きい
"<"
より小さい
">="
以上
"<="
以下
"=="
と等しい
"!="
と等しくない
例:
var now = Packages.java.util.Date();
var tomorrow = DateAdd (now, 1, "dd");
if (DateCompare (now,"<", tomorrow)) ...; //...DateCompareの結果がtrueのため実行する。
date1とdate2がNUMBER型である場合、それらの値は1970年1月1日以降のミリ秒として解釈されます。
Number DateDiff(DateまたはNumber date1, DateまたはNumber date2, String field)
date1からdate2を減算します。fieldの値に応じて、差分を日、時、分、または秒で返します。有効なfield値は以下のとおりです。
説明
field値
"ss"
秒
"mi"
分
"hh"
時
"dd"
日
例:
var now = Packages.java.util.Date();
var tomorrow = DateAdd (now, 1, "dd");
var diff = DateDiff (tomorrow, now, "dd")); //差の値は1。
date1とdate2がNUMBER型である場合、それらの値は1970年1月1日以降のミリ秒として解釈されます。
例:
var date = DateDiff (20000000,10000000,"ss");
BigDecimal DecimalAdd(BigDecimal value1, BigDecimal value2)
指定したパラメータの合計であるJavaScript BigDecimalオブジェクトを返します。この結果は、パラメータの最大有効桁の精度を継承し
ます。
結果をUDAに割り当てる場合は、そのUDAがBIGDECIMAL型であることを確認してください。
- 167 -
ほかのデータ型をパラメータとして渡した場合、この関数はパラメータをBigDecimalに変換します。
例:
int x = 39;
var z = DecimalAdd ("3.1416",x);
zがBigDecimalである場合、その値は42.1416になります。
Boolean DecimalCompare(BigDecimal value1, String operator, BigDecimal value2)
2つのBigDecimal値を比較し、その結果に応じてtrueまたはfalseを返します。
有効な演算子は以下のとおりです。
演算子
説明
">"
より大きい
"<"
より小さい
">="
以上
"<="
以下
"=="
と等しい
"!="
と等しくない
結果をUDAに割り当てる場合は、そのUDAがBIGDECIMAL型であることを確認してください。
ほかのデータ型をパラメータとして渡した場合、この関数はパラメータをBigDecimalに変換します。
例:
var smallDecimal = "1.11";
var largeDecimal = "22.22";
if (DecimalCompare (smallDecimal,"<", largeDecimal)) ...; //DecimalCompareの結果がtrueのため実行する。
BigDecimal DecimalDivide(BigDecimal value1, BigDecimal value2, Number scale )
value1をvalue2で除算し、その結果を返します。scaleには、丸めの有効桁数を指定します。scaleの値には任意の数値を使用できます。
デフォルト値は2です。
丸めは常に四捨五入で行われ、両方の近接値から等距離である場合以外は、“最近接値”に丸められます。両方の近接値から等距
離である場合は切り上げられます。
結果をUDAに割り当てる場合は、そのUDAがBIGDECIMAL型であることを確認してください。
ほかのデータ型をパラメータとして渡した場合、この関数はパラメータをBigDecimalに変換します。
BigDecimal DecimalMultiply(BigDecimal value1, BigDecimal value2, Number scale)
value1をvalue2で乗算し、その結果を返します。scaleには、丸めの有効桁数を指定します。scaleには任意の数値を使用できます。デ
フォルト値は2です。
丸めは常に四捨五入で行われ、両方の近接値から等距離である場合以外は、“最近接値”に丸められます。両方の近接値から等距
離である場合は切り上げられます。
結果をUDAに割り当てる場合は、そのUDAがBIGDECIMAL型であることを確認してください。
ほかのデータ型をパラメータとして渡した場合、この関数はパラメータをBigDecimalに変換します。
BigDecimal DecimalSubtract(BigDecimal value1, BigDecimal value2)
value1からvalue2を減算します。差分はBigDecimalとして返されます。
- 168 -
boolean toBoolean(StringまたはNumber value)
valueをJavaScript Booleanに変換します。値は、"true"または"false"を含むSTRINGか、ゼロ(true)またはゼロ以外(true)を含むNUMBER
です。渡したパラメータに応じて、trueまたはfalseを返します。valueをBooleanに変換できない場合は、falseが返されます。
BigDecimal toDecimal(BigDecimal value, Number scale)
valueをBigDecimalオブジェクトに変換します。変換結果を、scaleで指定した有効桁数に返します。scaleには任意の数値を使用できま
す。デフォルト値は2です。
結果をUDAに割り当てる場合は、そのUDAがBIGDECIMAL型であることを確認してください。
ほかのデータ型をパラメータとして渡した場合、この関数はパラメータをBigDecimalに変換します。
Packages.java.lang.Float.parseFloat
詳細については、JDKに付属しているJavadocを参照してください。
Packages.java.lang.Integer.parseInt
詳細については、JDKに付属しているJavadocを参照してください。
Packages.java.lang.String.valueOf
詳細については、JDKに付属しているJavadocを参照してください。
注意
JavaScriptでは数値はNumber型となるため、整数としては以下の範囲までしか扱うことができません。
・ 最小値:-9007199254740992
・ 最大値:9007199254740992
JavaScript式でLong型の以下の最小値および最大値を使用することはできませんので、ご注意ください。
・ 最小値:Packages.java.lang.Long.MIN_VALUE
・ 最大値:Packages.java.lang.Long.MAX_VALUE
B.2 Java ActionでサポートするJavaScript関数
Java Actionでは、「B.1 JavaScript関数」で説明されている関数と、以下に示す関数を使用できます。
以下に示す関数は、Server Enactment Context APIのcom.fujitsu.iflow.server.intf.ServerEnactmentContextを使用して、ワークフロー情
報へのアクセスを提供します。詳細については、『API Javadocマニュアル』を参照してください。
void sec.addAttachment(String attachmentName, String attachmentPath)
void sec.addProcessXMLAttributeSubstructure(String udaName, String xPath, String value)
void sec.addProcessXMLAttributeSubstructureByIdentifier(String identifier, String xPath, String value)
void sec.deleteAttachment(String attachmentName)
void sec.deleteProcessXMLAttributeSubStructure(String udaName, String xPath)
void sec.deleteProcessXMLAttributeSubStructureByIdentifier(String identifier, String xPath)
void sec.escalateActivity(String assignees)
String sec.getActivityActor(String activityName)
Array sec.getActivityAssignees()
String sec.getActivityName()
String sec.getActor()
Array sec.getAllAttachmentNames()
Array sec.getAllAttributeNames()
String sec.getAttachment(String attachmentName)
Number sec.getCurrentActivityId()
Number sec.getCurrentProcessId()
Array sec.getGroupMembers(String groupName)
- 169 -
String sec.getProcessAttribute(String attName)
String sec.getProcessAttributeByIdentifier(String identifier)
String sec.getProcessAttributeStringType(String udaName)
String sec.getProcessDefinitionId()
String sec.getProcessDefinitionName()
String sec.getProcessDescription()
String sec.getProcessInitiator()
String sec.getProcessName()
Array sec.getProcessOwners()
Number sec.getProcessPriority()
Number sec.getActivityPriority()
String sec.getProcessTitle()
String sec.getProcessXMLAttributeElementValue(String udaName, String xPath)
String sec.joinString(Array)
Array sec.resolveRelationship(String relationship, String sourceValue)
void sec.sendEmail(String to, String from, String cc, String bcc, String subject, String body, String mimeType)
void sec.setActivityAssignees(Array assignees)
void sec.setOwners(Array users)
void sec.setProcessAttribute(String name, String value)
void sec.setProcessAttributeByIdentifier(String identifier, String value)
void sec.setProcessDescription(String description)
void sec.setProcessName(String name)
void sec.setProcessOwners(Array users)
void sec.setProcessPriority(Number priority)
void sec.setActivityPriority(Number priority)
void sec.setProcessTitle(String title)
void sec.setProcessXMLAttributeElementValue(String udaName, String xPath, String value)
void sec.setProcessXMLAttributeElementValueByIdentifier(String identifier, String xPath, String value)
void sec.setProcessXMLAttributeSubstructure(String udaName, String xPath, String value)
void sec.setProcessXMLAttributeSubstructureByIdentifier(String identifier, String xPath, String value)
void sec.validateProcessXMLAttributeValue(String udaName)
void sec.validateProcessXMLAttributeValueByIdentifier(String identifier)
Array sec.splitString(String commaSeparatedList)
UDAを使用する
JavaScriptでプロセス定義に追加したUDAを使用できます。以下の構文を使用します。
uda.<UDA識別子名>
JavaScriptでは、変数名としてマルチバイト文字を使用できないため、UDA名ではなく識別子を使用してください。
以下の例では、変数を作成し、その変数をUDAの値に初期化します。
var someVariable = uda.Price;
以下の例は、変数の値をUDAに割り当てる方法を示しています。
var lastName = "Jones";
uda. udaIdentifier = lastName;
メソッドuda.get、uda.setを使用すると、それらの名前で、UDAにアクセスすることができます。
・ uda.getでは、指定したUDAの値が返されます。
var value = uda.get("<UDA名>");
・ uda.setでは、UDAの値を指定した値に設定します。
uda.set("<UDA名>", "<UDA値>");
JavaScriptの戻り値をUDAに割り当てるときには、それぞれのデータ型が一致していることを確認してください。データ型が一致してい
ない場合は、割当てに失敗します。
- 170 -
注意
変換などのエラーによってターゲットUDAへの値の割当てに失敗した場合は、エラーの詳細がIBPMServer.logに記録されます。その
場合、ターゲットUDAは更新されず、前の値が維持されます。
UDAのデータ型が以下のJavaデータ型にマッピングされます。
・ BIGDECIMAL型のUDAは、Packages.java.math.BigDecimalオブジェクトにマッピングされます。
・ DATE型のUDAは、Packages.java.util.Dateオブジェクトにマッピングされます。
Javaオブジェクトの詳細については、JDKに付属しているJavadocを参照してください。
B.3 トリガでサポートするJavaScript関数
トリガでは、JavaScript式を使用して制御条件を指定できます。制御条件により、トリガが実行される時期を限定します。
「B.1 JavaScript関数」で説明されている関数と、以下で説明されている関数を使用できます。
String eventData.getXMLData(String xpath)
XPath式で指定されているXMLのテキスト値を返します。
例:
以下にXMLフラグメントの例を示します。
<Customer> <Data> <Name>John</Name> </Data> </Customer>
以下のステートメントは、XMLエレメント<Name>のテキスト値"John"を、変数nameに割り当てます。
var name = eventData.getXMLData ( "/Customer/Data/Name/text()");
- 171 -
付録C トラブルシューティング
C.1 ログファイルの情報
Interstage BPMの運用中に問題が発生した場合の情報採取のために、次のログファイルを確認してください。
・ IBPMServer.log -このファイルには、Interstage BPM サーバにおける、すべてのエラーが出力されます。このログファイルを参照す
ることで、問題解決のための有益な手がかりが得られます。例えば、データベースサーバが停止していることがわかります。
・ AnalyticsError.log -このファイルには、Interstage BPM Analyticsとの連携に関するエラーが出力されます。
これらのファイルは、Interstage BPM サーバマシンの以下のフォルダに格納されます。
<Interstage BPMサーバインストールディレクトリ>/ server/instance/default/logs
C.2 特定のエラー状態を解決
C.2.1
Interstage BPMサーバの起動の失敗
<Interstage BPMサーバインストールディレクトリ>/server/instance/default/logsディレクトリ内のIBPMServer.logを確認します。
エラー
対処方法
DbService : setConnection: Connection to database server
failed. Is the database server running and reachable through the
network? {ORA-01089: immediate shutdown in progress - no
operations are permitted.
データベースが実行中であることを確認します。また、データ
ベースが別のコンピュータで実行されている場合は、Interstage
BPMサーバがインストールされているコンピュータからデータ
ベースにアクセスできることも確認します。サーバホストコン
ピュータからtelnet <Database Server Hostname> <Port> を使
用して、データベースホスト/ポートへの接続が確立可能である
ことを確認できます。
LdapBroker : getContext: Could not create the directory
services. {[LDAP: error code 49 - Invalid Credentials]}
Interstage BPMサーバのLDAPAccessUserID /
LDAPAccessUserPasswordパラメータでユーザ名とパスワード
が正しく指定され、それらのユーザ名とパスワードを使用して
ディレクトリサーバにログインできることを確認します。
LdapBroker : getGroupMembersByDN: Could not retrieve the
user groups. {Could not create the directory services.
{[LDAP: error code 49 - Invalid Credentials]}}
LdapBroker : Could not retrieve the user groups. {Could not
create the directory services. {[LDAP: error code 49 Invalid Credentials]}}
getContext: Could not create the directory services.
LdapBroker : getGroupMembersByDN: Could not retrieve the
user groups. {Could not create the directory services.
LdapBroker : Could not retrieve the user groups. {Could not
create the directory services.
IflowStartup : @( Failed to execute the IBPM startup routine
task) Unable to deliver the message for the requested eventClass.
{javax.naming.ServiceUnavailableException: A
communication failure occurred while attempting to obtain an
initial context with the provider URL: "iiop://<サーバ名>:<ポー
ト番号>". Make sure that any bootstrap address information in
the URL is correct and that the target name server is running. A
bootstrap address with no port specification defaults to port
2809. Possible causes other than an incorrect bootstrap address
or unavailable name server include the network environment and
workstation network configuration.}
Interstage BPMサーバのLDAPServerパラメータで指定した
ポートでLDAPサーバが実行中であることを確認します。サー
バホストコンピュータからtelnet ldapServerHostName portを使
用して、ホスト/ポートへの接続が確立可能であることを確認で
きます。
これはInterstage BPM サーバの設定ファイルに、WebSphere
アプリケーションサーバが使用している
BOOTSTRAP_ADDRESSポートが設定されていないのが原因
です。
1. WebSphere 管 理 コ ン ソ ー ル か ら
BOOTSTRAP_ADDRESS ポ ー ト を 確 認 し て く だ さ い
(サーバ > アプリケーションサーバ > <サーバ名> > ポー
ト)。
2. iflowClient.properties と ibpm.properties の 以 下 の パ ラ
メータへ、BOOTSTRAP_ADDRESSポートを設定してく
- 172 -
エラー
対処方法
ださい。そして、インポートスクリプトを使って
ibpm.propertiesをデータベースへ格納してください。
・ JMSNamingProviderURL ( 記 述 形 式 : iiop://< ホ ス ト 名
>:<BOOSTRAP_ADDRESS ポート>)
・ NamingProviderURL ( 記 述 形 式 : iiop://< ホ ス ト 名
>:<BOOSTRAP_ADDRESS ポート>)
C.2.2
IBPMServer.logのエラー
<Interstage BPMサーバインストールディレクトリ>/server/instance/default/logsディレクトリ内のIBPMServer.logを確認してください。
エラー
getGroupMembersByDN: Could not retrieve the user groups.
{[LDAP: error code 32 - No Such Object]}
C.2.3
対処方法
原因:ディレクトリサーバ(LDAPサーバ)からユーザを削除した
が、グループ内にユーザが登録されたままになっている。
JavaScript実行中の時間切れ
大きなJavaScriptsの実行時に、WebLogicおよびWebSphere Application Server用に設定されている現在のトランザクション時間切れ(120
秒)が不十分です。この設定が原因で、スクリプトの実行が「トランザクション時間切れ」で失敗します。
使用方法の要件に対応して、アプリケーションサーバ管理者は、トランザクション時間切れを長くして、たとえば200秒にすることができ
ます。この設定は、次の場所で変更できます。
・ WebLogic Application Server:
<WebLogicインストールディレクトリ>/../config/config.xml/<jta>/<時間切れ秒数>
・ WebSphere Application Server:
WebSphereコンソール:[サーバ] > [アプリケーションサーバ] > [サーバ1](デフォルト名) > [コンテナサービス] > [トランザクショ
ンサービス] > [トランザクションの合計存続時間の時間切れ]。
C.2.4
Oracleデータベースへの書き込み時のエラー
プロセスインスタンスのアーカイブ時などにOracleデータベーステーブルの更新が失敗した場合は、<Oracleインストールディレクトリ>/
admin/<DBインスタンス名>/bdumpディレクトリに存在するOracleアラートログファイルを確認してください。たとえば、次の場所です。
C:\ProgramFiles\Oracle\admin\orcl\bdump\alert_orcl.log
以下のエラーが見つかる場合があります。
{Database add/create request failed.(データベース追加/作成リクエストが失敗しました。){ORA-08103: object no longer exists(オブジェ
クトはもう存在しません)}}
このエラーは、データファイルのサイズがデータベースサーバのハードディスクにおけるファイルサイズ制限に達したために発生した可
能性があります。
システム管理者は、データベースサーバハードディスクのファイルサイズを大きくする必要があります。
C.2.5
Interstage Applicationサーバの警告、エラーメッセージ
Interstage BPM サーバをInterstage Application Serverで実行している際に、イベントログまたはシステムログに警告メッセージが出力さ
れる場合があります。
それらのメッセージと同じ時刻に、Interstage BPMサーバまたは、コンソールワークユニットのコンテナログにもメッセージが出力されて
いるなら、Interstage BPMに原因がある可能性があります。
しかしながら、そのメッセージに、以下に示すエラーや警告のいずれかが含まれるなら、無視できます。
- 173 -
Error/
Details
Warning
1. 1.
・ イベントログまたはシスログに出力されたメッセージ: od60002
・ Interstage BPMサーバのEJBコンテナログに出力されたメッセージ:
IJServer21104 と IJServer21092
・ Interstage Application Serverの無通信監視機能により時間が超過したEJBオブジェクトが削除されました。
Interstage BPM サーバが自動的に代わりのEJBオブジェクトを作成しますので、メッセージを無視して構いませ
ん。
C.3 インストール、配備時および構成時に発生するエラー
ここでは、Interstage BPMのインストール、配備時および構成時に発生するトラブルの事例およびその対処について説明します。
なお、データベースにSymfowareを使用している場合は、イベントログにエラーの原因が出力されますので、それに従ってください。
以前のバージョンをアンインストールした後、新しいInterstage BPMのインストールに失敗する
I
原因
・ アンインストーラを使用せずに、Interstage BPMのインストールディレクトリを削除した。また
はアンインストールが失敗した。
対応
Windowsの場合:
以前のInterstage BPMのレジストリエントリを、以下のように手動で削除してください。:
1. スタート メニューから、ファイル名を指定して実行 を選択します。"regedit"と入力し、OKを
クリックします。
2. レジストリ エディタにおいて、HKEY_LOCAL_MACHINE > SOFTWARE > Fujitsu > Install
> Interstage BPM Serverを開きます。
3. Installキー配下にあるInterstage BPM Serverのレジストリエントリを削除します。
4. HKEY_LOCAL_MACHINE > SOFTWARE > Microsoft > Windows > CurrentVersion >
Uninstall >Interstage Business Process Manager xx.xを開きます。
5. Uninstallキーの配下にあるInterstage Business Process Manager xx.xレジストリエントリを削
除します。これによって、レジストリエントリを完全に削除できます。
・ Solarisの場合:
・ Solarisのパッケージ情報を、以下のように手動で削除してください。:
1. コマンドプロンプトを開き、任意のSolarisマシンからpkginfo -l FJSVibpmのコマンドを実行
してください。そして、Solarisパッケージ情報がまだ存在しているかどうかをチェックしてく
ださい。
2. もしSolarisパッケージ情報が表示された場合、以下の手順でパッケージ情報を削除して
ください。
a. /tmp配下にibpm.uninstという名前のファイルを作成します。
b. Solarisパッケージを削除するために、pkgrm FJSVibpmコマンドを実行してください。
c. 再度、pkginfo -l FJSVibpmコマンドを実行して、Solarisパッケージの削除が成功し
ていることを確認してください。もし何も表示さければ、SolarisパッケージがSolarisか
ら完全に削除されたことになります。
・ Linuxの場合:
・ RPMのパッケージ情報を、以下のように手動で削除してください。:
1. コマンドプロンプトを開き、任意のLinuxマシンからrpm -qi FJSVibpmコマンドを実行してく
ださい。そして、RPMパッケージがまだ存在しているかどうかをチェックしてください。
- 174 -
2. もしRPMパッケージ情報が表示された場合、rpm -e FJSVibpmコマンドを使用してパッケー
ジ情報を削除してください。
3. 再度、rpm -qi FJSVibpmコマンドを実行して、RPMパッケージの削除が成功していること
を確認してください。もし何も表示されなれば、RPMパッケージが完全に削除されたことに
なります。
LinuxでInterstage BPMインストールプログラムが起動できない
I
原因
libXp-1.0.0-8.i386.rpmパッケージがLinuxマシンにインストールされていません。
対応
Linuxマシンで以下の操作を行ってください。
1. Red Hat Enterprise LinuxのCDまたはウェブサイトから、libXp-1.0.0-8.i386.rpmパッケージ
をダウンロードしてください。
2. rpm -i libXp-1.0.0-8.i386.rpmコマンドを使用して、パッケージをインストールしてください。
3. Linux用のInterstage BPMインストールプログラムを再実行してください。
Interstage BPMのデータベースの作成/更新時のエラー
I
原因
配備時に指定した以下のいずれかの値に誤りがあります。
・ データベース管理者のユーザ名
・ データベース管理者のパスワード
対応
Interstage BPMの配備前に作成したデータベースのバックアップから、データベースを復元しま
す。
配備ツールを再実行し、[Welcome]画面で[Database Configuration]を選択します。これにより、
Interstage BPMを再度配備することなく、データベースが構成されます。
II
原因
配備時に指定した以下のいずれかの値に誤りがあります。
・ データベースサーバのホスト名
・ データベースSID(データベースインスタンス名)
・ データベースポート
対応
Interstage BPMの配備前に作成したデータベースのバックアップから、データベースを復元しま
す。
アプリケーションサーバからInterstage BPMを削除し、配備ツールを使用して再度配備してくだ
さい。
III
原因
データベースサーバが起動していません。
対応
データベースサーバを起動します。
配備ツールを再実行し、[Welcome]画面で[Database Configuration]を選択します。これにより、
Interstage BPMを再度配備することなく、データベースが構成されます。
importLDAP.batの実行時に発生したエラー
I
原因
配備時に指定した以下のいずれかの値に誤りがあります。
・ LDAPキー
・ LDAPの組織単位(OU)
対応
アプリケーションサーバからInterstage BPMを削除し、配備ツールを使用して再度配備してください。
- 175 -
importAD.batの実行時のエラー
I
原因
配備時に指定した以下のいずれかの値に誤りがあります。
・ Active Directoryキー
・ Active Directoryの組織単位(OU)
対応
アプリケーションサーバからInterstage BPMを削除し、配備ツールを使用して再度配備してください。
C.4 Interstage BPMサーバの起動時のエラー
ここでは、Interstage BPMサーバの起動時に発生するトラブルの事例およびその対処について説明します。起動に失敗した場合、以
下の原因が考えられます。原因を調査し、それぞれ対処してください。
Active Directoryに関連するエラー
I
II
原因
リモートコンピュータにActive Directoryが配備されているため、Active Directoryが実行され
ていません。
対応
Active Directoryを起動してから、Interstage BPMサーバを起動します。
原因
配備時に指定した以下のいずれかの値に誤りがあります。
・ ディレクトリサービスのログインアカウントのユーザ名
・ ディレクトリサービスのログインアカウントのパスワード
これらの値は、importAD.batファイルにnet userコマンドの引数として使用されています。
III
対応
アプリケーションサーバからInterstage BPMを削除し、配備ツールを使用して再度配備してく
ださい。
原因
配備時に指定した以下のいずれかの値が誤っているため、Interstage BPMがActive Directory
に接続できません。
・ Active Directoryキー
・ Active Directoryの組織単位(OU)
対応
アプリケーションサーバからInterstage BPMを削除し、配備ツールを使用して再度配備してく
ださい。
Sun Java System Directory Serverに関連するエラー
I
原因
配備時に指定した以下のいずれかの値が誤っているため、Interstage BPMがLDAPサーバ
に接続できません。
・ LDAPキー
・ LDAPの組織単位(OU)
対応
アプリケーションサーバからInterstage BPMを削除し、配備ツールを使用して再度配備してく
ださい。
データベースに関連するエラー
I
II
原因
データベースサーバが起動していません。
対応
データベースサーバを起動してから、Interstage BPMサーバを起動します。
原因
Symfowareを使用している場合、データベースユーザがロックされたため「JYP1011E 利用者
の認証ができません。」のエラーが出力される場合があります。
対応
データベースユーザのロックを解除するために、データベースサーバで以下のSQL文を実
行してください。詳細については、『Symfoware Server SQLリファレンス』を参照してください。
- 176 -
・ ALTER USER
データベースユーザのロックを解除したあとで、Interstage BPMサーバを再起動してくださ
い。
ホスト名変更に関連するエラー
I
原因
Interstage BPMサーバをインストールしたコンピュータのホスト名を変更しました。ホスト名が
Interstage BPMサーバのパラメータ名やパラメータ値に設定されている場合は、そのサーバ
にアクセスすることができません。
対応
Interstage BPMデータベースユーザのIBPMPropertiesテーブルに以下の変更を行ってくだ
さい。
・ PROPERTYKEYカラムで、サフィックにホスト名があるすべてのパラメータ名を変更して
ください。
パ ラ メ ー タ の フ ォ ー マ ッ ト は 、 <PARAMETER_NAME>.<HOSTNAME> ま た は 、
<PARAMETER_NAME>.<HOSTNAME>.<SERVERNAME>です。
・ PROPERTYVALUEカラムで、ホスト名を含むすべてのパラメータ値を変更してください。
IBPMPropertiesを更新する場合は、適切なデータベースコマンドまたは、データベース
クライアントを使用してください。
C.5 問題が解決できない場合
問題を解決できない場合は、以下の手順に従ってください。
1. 以下の手順に従って、Interstage BPMサーバのDebugLevelパラメータに2を設定します。
a. 以下のURLを使用して、Interstage BPMサーバ設定ツールを起動します。
http://<ホスト名>:<ポート>/fujitsu-ibpm-config-webapp/IBPMConfigServlet
b. Interstage BPMのスーパーユーザでログインしてください。
c. DebugLevelパラメータに2を設定します。
d. [Save and Reload properties]をクリックします。
2. エラーの原因となった操作を再度実行します。
3. 以下の情報を用意して、富士通技術員に連絡してください。
一般情報
- オペレーティングシステム
- ディレクトリサービス(種類とバージョン)
- データベースサーバ(種類とバージョン)
- JDKまたはJREのバージョン
- アプリケーションサーバ(種類とバージョン)
- Interstage BPM Edition、バージョンとビルド番号
- 主な問題領域
- 問題の優先度
- 問題が発生する環境
設定情報
- Interstage BPMサーバからエクスポートした設定ファイル
ログファイル
- 177 -
- <Interstage BPMサーバインストールディレクトリ>/server/instance/default/logsにあるすべてのログファイル
- Interstage Application Serverの使用時:<Interstageインストールディレクトリ>/J2EE/var/deployment/ijserver/<ユーザのワーク
ユニット>/logにあるすべてのログファイル
- WebLogicの使用時: <WebLogicインストールディレクトリ>/user_projects/domain/<お使いのドメイン>/servers/AdminServer/logs
にあるすべてのログファイル
- WebSphereの使用時: <WebSphereインストールディレクトリ>/profiles/<お使いのアプリケーションサーバプロファイル>/logs/<
お使いのサーバ>にあるすべてのログファイル
OSシステムログ
- イベントビューアから取得したWindowsイベントログ
- /var/adm/messagesに保存したUNIXシステムログ
- /var/log/messagesに保存したLinuxシステムログ
問題の説明
- 問題が発生する前に実行した手順の説明
- 問題が発生する頻度
問題の詳細
- エラーが発生するアプリケーションプログラムとそのソースコード
- エラーが発生するプロセス定義のXPDLファイル
- プロセス定義で定義されたJava Action、タイマー、エージェントに関する情報
- プロセスインスタンスがエラー状態になる場合、プロセスインスタンス履歴のスクリーンショット
- 例外が表示されたときのスタックトレース
Interstage BPMコンソールに表示されたエラーページの[詳細]をクリックすると、スタックトレースを取得できます。
- 表示されたすべての例外のスクリーンショット
- プロセスインスタンスがエラー状態になった場合、または予期しない状態になった場合、そのプロセスインスタンスのスクリー
ンショット(グラフィカルビュー)
- タイマーを使用する場合は、カレンダーファイル(*.cal)
- エージェントを使用する場合は、agentsConfig.xmlファイル
- 178 -
用語集
ACID特性
トランザクション処理システムに必須とされる4つの特性です(Atomicity(原子性)、Consistency(一貫性)、Isolation(隔離性)、
Durability(永続性))。
Activityノード
アクティビティをグラフィカルに表すノードです。
ANDノード
プロセス内の複数のブランチの同期をとるノードです。
API
Application Programming Interface (アプリケーションプログラミングインタフェース)の略です。開発者がユーザアプリケーションを
作成する際にサーバへアクセスするために使用するインタフェースやメソッドです。
ASAP
Asynchronous Service Access Protocol(非同期サービスアクセスプロトコル)の略です。ASAPはSOAPに基づく通信プロトコルであ
り、長時間実行されるサービスの開始、管理、およびモニタリングに使用されます。
BPR
Business Process Reengineeringの略です。プロセスの観点から、業務をどのように再定義するかを検討する研究分野のことです。
Chained-Processノード
親プロセス定義で定義されているタスクから独立して完了させることのできるサブプロセス実行を表すノードです。
Complex Conditionalノード
分岐条件がJavaScript式として指定されているConditionalノードです。
Conditionalノード
特定の条件に基づいて複数の選択肢から1つを選択し、プロセスフローを導くノードです。
DBノード
JDBCを使って、外部のデータベースにアクセスするノードです。
Delayノード
プロセスの実行を一定の時間一時停止するノードです。
EJB
Enterprise JavaBeansの略です。
Emailノード
あらかじめ定義されたEmailを送信するノードです。
Exitノード
プロセスの終了を示すノードです。1つのプロセス定義は複数のExitノードをもつことができます。
GUI
Graphical User Interface(グラフィカルユーザインタフェース)の略です。
- 179 -
Interstage BPMコンソール
ユーザがプロセスインスタンス、プロセス定義を作成し、ワークアイテムにアクセスして反応するためのユーザインタフェ-スです。
Interstage BPMスーパーユーザが、Interstage BPMを管理するためにも使います。
Interstage BPMフォーム
HTMLファイルを生成するXMLレイアウト定義とJavaアダプタクラスです。Interstage BPMフォームは、Interstage BPMフォームエディ
タを使用して作成および設計します。
Java Action
繰り返し利用する機能をプログラム化したコンポーネントです。
LDAP
Lightweight Directory Access Protocol(軽量ディレクトリアクセスプロトコル)の略です。
OnAbortアクション
プロセスインスタンスが中断される前に実行されるJava Actionです。
OnResumeアクション
プロセスインスタンスが再開される前に実行されるJava Actionです。
OnSuspendアクション
プロセスインスタンスが一時停止される前に実行されるJava Actionです。
ORノード
プロセスフローを複数の平行ブランチに分けるノードです。
Remote Subprocessノード
リモートワークフローサーバで実行されるサブプロセスを表すノードです。
SOAP
Simple Object Access Protocol(シンプルオブジェクトアクセスプロトコル)の略です。SOAPは、アプリケーション間でXMLメッセージ
を送信するための標準の通信プロトコルです。たとえば、Webサービスへのアクセスに使用されます。
SQL
Structured Query Language(構造化クエリ言語)の略です。
Startノード
プロセスの開始を示すノードです。1つのプロセスは1つのStartノードしかもつことができません。
Subprocessノード
サブプロセス実行を表すノードです。そのタスクの詳細は、別のプロセス定義で定義されます。
SWAP
Simple Workflow Access Protocol(シンプルワークフローアクセスプロトコル)の略です。SWAPは、ワークフローサーバ間で、HTTP
を介してXMLメッセージをやり取りします。
Voting Activityノード
ユーザ同士が連携して1つのアクティビティを処理できるようにするノードです。
- 180 -
Web Serviceノード
Webサービスからデータを取得し、そのデータを処理できるようにするノードです。
WSDL
Web Services Description Language(Webサービス記述言語)の略です。WSDLは、組織が提供するWebサービスを記述するXML
ベースの言語です。WSDLは、Webサービスへのアクセス方法についても記述します。
XMLアクション
たとえば、XMLの下部構造の追加、XMLのテキストまたは属性値の設定、XMLデータからのUDA値の抽出のような、XMLタイプの
UDAに対する特定の動作を行うJava Actionです。
XPath
XML Path Language(XMLパス言語)の略です。XPathは、XML文書内の情報を見つけるための言語であり、エレメントや属性をた
どってゆくために使用されます。
XPDL
XML Process Definition Language(XMLプロセス定義言語)の略です。
アクティビティ
アクティビティは、あるプロセスの中で実行される作業を記述したものです。アクティビティはワークアイテムで表されます。
アクティビティ時間
ある特定のアクティビティを処理するのにかかる時間です。
アノテーション
プロセス定義に説明やコメントを追加するために付加するものです。
エージェント
外部のシステムに非同期にアクセスするためのInterstage BPMのコンポーネントです。
エラーアクション
プロセス定義レベル、リモートサブプロセスレベル、およびJava Actionレベルでの特定のエラーに対処するために使われるJava Action
です。
関係者
あるプロセスに含まれている(関与している)の人です。
起案者
プロセスインスタンスを開始した人です。
期限
活性状態になったアクティビティが完了する期限を指定します。また、期限に到達したときにそのアクティビティがまだ完了していな
い場合の処理についても指定します。
業務プロセス
「プロセス」を参照してください。
グループ
同じカテゴリのアクティビティを視覚的にグループ化したものです。
- 181 -
グループウェア
ユーザ同士の連携を支援するソフトウェアです。
サーバ
Interstage BPM においては、ワークフローエンジンがプロセスを実行するための実行環境を提供しているコンピュータ上の、ワーク
フロー管理システムのコンポーネントです。
サーバアクション
Interstage BPMサーバとの情報のやり取りを可能にするJava Actionです。
シミュレーションのシナリオ
プロセス定義で定義されたビジネスプロセスの実行をローカルコンピュータでシミュレートするための情報を定義したものです。
所有者
「プロセス定義所有者」および「プロセスインスタンス所有者」を参照してください。
スイムレーン
同じロールによって実行されるアクティビティを視覚的にグループ化するものです。
タイマー
指定された間隔が経過した後、または指定された日時になると期限が切れます。タイマーの期限が切れると、特定のアクションがト
リガされます。
タスク
プロセス内の1つのアクティビティです。通常、人間の関与が要求されます。
担当者
あるアクティビティを実行するために割り当てられた1人または複数の人です。
通知アクション
プロセス実行に関連するイベントをユーザに通知するJava Actionです。プロセスやアクティビティの開始などを、Emailでユーザに
通知することかできます。
ディレクトリサービス(DS)
全ネットワークの認証データや設定データを格納するリポジトリです。
データベースアクション
Interstage BPMから独立している外部のデータベースとの相互作用を実現するJava Actionです。
添付文書
アプリケーションによって生成された、プロセスインスタンスに関連付けられた文書ファイルです。
統合アクション
プロセス定義内から外部機能へのアクセスを可能にするJava Actionです。
投票ルール
Voting Activityノードで定義される投票ルールです。
ネーミングサービス
クライアントに対して名前でオブジェクトを見つける機能を提供するサービスです。
- 182 -
ノード
プロセスの各段階をグラフィカルに表します。Interstage BPMのノードのタイプには、Activityノード、ANDノード、Subprocessノード、
Conditionalノードなどがあります。
ビジネスカレンダー
営業日および営業時間を指定したカレンダーです。
フォーム
アクティビティ、プロセスインスタンス、またはプロセス定義に関連付けることができる、HTMLまたはXMLファイルです。フォームは
Interstage BPMを使用して作成できますが、その外観は任意のXML編集ツールまたはHTML編集ツールを使用して変更できま
す。
フレームワークアダプタ
デ ィ レ ク ト リ サ ー ビ ス ア ダ プ タ と DMS ア ダ プ タ を 統 合 し ま す 。 DD ア ダ プ タ と 呼 ば れ る こ と も あ り ま す
("DD"は、"Document"と"Directory"の頭文字を繋げた略語)。ディレクトリサービスと文書管理システム(DMS)に対して統合された
ユーザ認証を実現します。
プロジェクト
プロセス定義、フォーム、シミュレーションのシナリオ、添付ファイルなどのコンテナです。ファイルシステムレベルでは、1つのプロ
ジェクトが1つのフォルダになります。
プロセス
業務目標を達成するために実行される一連の手順です。プロセスはプロセス定義でモデル化されます。
プロセスインスタンス
プロセスインスタンスは、あるプロセス定義から生成された1つの実体です。プロセスインスタンスの構造は、基となるプロセス定義の
構造と同一です。
プロセスインスタンス期限
プロセスインスタンスの期限です。
プロセスインスタンス所有者
デフォルトでは、プロセスインスタンスの所有者は、そのプロセスインスタンスが生成されたプロセス定義の所有者です。
プロセス関係者
「関係者」を参照してください。
プロセス起案者
「起案者」を参照してください。
プロセス定義
業務プロセスを表現するための記述で、操作の自動化をサポートします。プロセス定義は、プロセス内の制御のフローを含め、生
成されるプロセスインスタンスのふるまいやプロパティを定義します。
プロセス定義所有者
プロセス定義を作成(または最後に編集)した人です。
文書管理システム(DMS)
Document Management System(文書管理システム)の略です。Interstage BPMと連携して、添付文書やフォームなどを格納するた
めに使用されるシステムです。DMSアダプタはDMSとInterstage BPMを接続します。
- 183 -
補正アクション
例えば、システムをクリーンアップし、トランザクションに関与している外部システムの安定した状態を保障するような、通常のJava Action
に対する補強として定義できるJava Actionです。
無処理Java Action
動作を指定しない、組み込みのJava Actionです。
矢印
あるノードと別のノードを繋ぐものです。矢印は、ノードからノードへ、プロセスフローを導きます。
ユーザ定義属性(UDA)
顧客データや発注番号など、プロセス関係者がアクセスしたり、修正や追加する必要があるデータです。ユーザ定義属性は、プロ
セス定義の中で定義されます。
ユーザグループ
共通の特徴を持つユーザの集合です。グループは、Interstage BPMのローカルグループストア、ディレクトリサービス、またはその
両方のシステムで定義されます。
ユーザプロファイル
ユーザ固有の設定情報です。ユーザがEmail通知を受信するかどうかの情報や、Emailアドレス、デフォルトのディレクトリがありま
す。
ルール
ルールが定義されたアクティビティにおいて選択肢を決定するための方法です。
ロール
プロセスに関連付けられたタスクを処理すべき責任がある、個人またはグループの総称です(「マネージャー」など)。すべてのプロ
セスの作業(アクティビティ)には、ロールが定義されています。ロールは、Interstage BPMのローカルグループストアやディレクトリ
サービスで定義されるグループに相当します。
ワークアイテム
ワークリストに表示されるアクティビティのことです。
ワークフロー
業務プロセス中に存在する一連のアクティビティの連なりです。
ワークフローアプリケーション
プロセス定義、フォーム、シミュレーションシナリオ、添付文書からなるプロセスソリューションです。Interstage BPMは、定義済みの
構造を持つワークフローアプリケーションプロジェクトの作成を実現します。このアプリケーションは、Interstage BPMクライアントがア
クセスできるInterstage BPMサーバ上に配備できます。
ワークフローサーバ
プロセスを実行するための実行環境を提供する、Interstage BPMのコンポーネントです。
ワークリスト
アクティビティのリストです。
- 184 -
索 引
[A]
ACID特性.........................................................................21,179
Activityノード....................................................................14,179
Activity ノード..........................................................................58
Activityノード 開始アクションを割当てる................................66
Activityノード ロール...............................................................11
ANDノード.........................................................................16,179
ANDノード addNote()...............................................................48
API..........................................................................................179
ASAP......................................................................................179
Interstage BPMフォーム.........................................................180
Interstage BPM マニュアル一覧................................................ii
Interstage BPM 利点..................................................................1
Interstage BPM連携ユーザ...................................................119
Iterated ノード.........................................................................131
Iteratorノード......................................................................59,130
[J]
Java Action...................................................................11,63,180
Java Action:サポートされるJavaScript関数...........................169
Java Actions assigning エラーアクション..................................73
Java Actions assigning 補償アクション.....................................72
Java Actions エラー..................................................................70
Java Actions エラー処理..........................................................71
Java Actions 構造.....................................................................74
Java Action 一時停止..............................................................77
Java Action 開始......................................................................66
Java Action 組込み..................................................................68
JavaAction 再開.......................................................................77
Java Action 終了......................................................................67
Java Action タイプ....................................................................64
Java Action 中止......................................................................77
Java Action プロセス所有者....................................................64
JavaScript関数........................................................................166
JavaScript関数:Java Actionでのサポート.............................169
JavaScript関数:一般..............................................................166
JavaScript関数:トリガでのサポート........................................171
Javaアクション.............................................................................5
JDBC..........................................................................................4
JMSインタフェース.................................................................163
JMS リスナ..............................................................................101
[B]
BPR.........................................................................................179
[C]
CentraSite 連携..........................................................................6
Chained-Processノード.......................................................18,179
Chained-Processノード addNode()............................................52
Complex Conditionalノード....................................................179
Compound Activityノード.........................................................19
Conditionalノード..........................................................17,48,179
[D]
DBノード.................................................................................179
Delayノード...................................................................15,58,179
Delayノード addNode().............................................................51
[E]
EJB..........................................................................................179
Emailノード.............................................................................179
Event Activityノード.................................................................16
Event Activityノード プログラム例...........................................96
Exitノード......................................................................14,59,179
[L]
LDAP...................................................................................4,180
[F]
FTPエージェント..............................................................104,106
fujitsu-ibpm-engine-ejb_jar_client.jar.................................28,30
[M]
Model API..................................................................................5
Model API アプリケーションの実行.........................................37
Model API アーキテクチャー...................................................38
Model API システム環境.........................................................28
Model API トランザクション制御..............................................93
[G]
GUI.........................................................................................179
[H]
history.....................................................................................112
HTTPエージェント...........................................................107,108
[O]
OnAbortアクション..................................................................180
OnResumeアクション..............................................................180
OnSuspendアクション..............................................................180
ORノード............................................................................16,180
ORノード addNote()..................................................................48
[I]
iFlow.jar....................................................................................28
Interstage Analytics....................................................................5
Interstage BPM...........................................................................1
Interstage BPM 主な機能..........................................................2
Interstage BPM 外部アプリケーションと統合する...................61
Interstage BPM 概要..................................................................1
Interstage BPM 基礎知識..........................................................8
Interstage BPM 基本設計..........................................................2
Interstage BPMコンソール.....................................................180
Interstage BPM コンポーネントアーキテクチャ......................2,3
Interstage BPM サブプロセス機能..........................................26
[R]
Remote Subprocessノード..................................................18,180
Route Nodes.............................................................................58
[S]
Server Enactment Context........................................................65
SOAP......................................................................................180
SQL.........................................................................................180
- 185 -
拡張属性 名前.........................................................................89
拡張属性 名前空間.................................................................91
拡張属性 割当て......................................................................87
カスタムEJB................................................................................4
関係者....................................................................................181
管理者 ログアウト...................................................................138
管理者 ログイン......................................................................138
管理 ユーザとグループ..........................................................139
完了アクション..........................................................................64
起案者....................................................................................181
期限........................................................................................181
キャッシュをクリア...................................................................142
業務プロセス..........................................................................181
組込みJava Action...................................................................68
グループ.................................................................................181
グループウェア.......................................................................182
グループ管理......................................................................4,139
グループキャッシュ クリア.......................................................142
決定表.............................................................................124,126
決定表の管理........................................................................127
決定表の仕様........................................................................126
Startノード.....................................................................14,59,180
Subprocessノード...............................................................17,180
Subprocessノード addNode()....................................................50
SWAP.....................................................................................180
[T]
Triggerノード.............................................................................59
[U]
UDA 追加.................................................................................46
[V]
Voting Activityノード........................................................15,180
Voting Activityノード addNode().............................................47
Voting Activityノード 閾値......................................................47
Voting Activityノード ルール..................................................47
Voting Activityノード ロール...................................................11
Votingノード.............................................................................58
[W]
Web Serviceノード..................................................................181
Webサービス..............................................................................5
WSDL.....................................................................................181
[さ]
再開時アクション.................................................................64,77
再割当てモード........................................................................27
サーバ....................................................................................182
サーバアクション....................................................................182
閾値..........................................................................................47
実行エンジン..............................................................................4
シミュレーションのシナリオ.....................................................182
終了アクション.....................................................................11,64
終了アクション 割当て..............................................................67
将来のワークアイテム..............................................................24
初期化アクション......................................................................64
所有者....................................................................................182
所有者アクション......................................................................64
スイムレーン............................................................................182
セキュリティモード....................................................................26
セッション 管理者...................................................................138
セッション ユーザ...................................................................138
接続性........................................................................................4
絶対時刻タイマー....................................................................12
相対時刻タイマー....................................................................12
ソート.........................................................................................77
ソート順 追加............................................................................79
[X]
XMLアクション.......................................................................181
XMLデータ..............................................................................84
XPath......................................................................................181
XPDL......................................................................................181
[あ]
アクティビティ..........................................................................181
アクティビティ時間..................................................................181
アクティビティノード................................................................131
アノテーション.........................................................................181
アプリケーション開発 ストラテジ................................................1
アーキテクチャ........................................................................2,3
一時停止時アクション..............................................................77
一時停止時アクション.........................................................64,77
一括処理..................................................................................81
インタフェース DataItemRef................................................80,86
インタフェース WFAdminSession..........................................142
インタフェース WFObjectList...................................................54
インタフェース WorkItem.........................................................56
インタフェース プロセスインスタンス......................................147
エラーアクション.................................................11,64,70,72,181
エラー処理 Java Actions..........................................................74
エラー処理 Java Actionsにおいて...........................................71
エラー処理 リモートサブプロセス用......................................119
エージェント.....................................................................102,181
[た]
タイマー....................................................................................12
タイマー....................................................................109,112,182
タイマーアクション....................................................................64
タスク.......................................................................................182
担当者....................................................................................182
中止時アクション......................................................................65
通知アクション........................................................................182
定期タイマー............................................................................12
ディレクトリサービス.........................................................139,182
ディレクトリサービスへの接続性................................................4
Emailリスナ...............................................................................99
[か]
開始アクション.....................................................................11,64
開始アクション 割当て..............................................................66
Activityノード 終了アクションを割当てる................................67
外部システム..............................................................................5
拡張属性..................................................................................86
拡張属性 値の取得.................................................................88
拡張属性 取得.........................................................................88
- 186 -
添付文書...........................................................................22,182
添付文書の処理......................................................................59
添付文書を処理する................................................................59
データベースアクション..........................................................182
データベースへの接続性..........................................................4
統合アクション........................................................................182
投票ルール.......................................................................47,182
トラブルシューティング...........................................................174
トラブルシューティング:Interstage BPMサーバの起動........176
トランザクションAPI...................................................................93
トランザクション制御.................................................................92
トリガ..........................................................................................93
トリガ:サポートされるJavaScript関数.....................................171
トリガ 定義.................................................................................94
プロセス起案者......................................................................183
プロセスコメント.........................................................................82
プロセス定義.......................................................................8,183
プロセス定義EJB........................................................................4
プロセス定義 XPDLファイルからインポートする...................145
プロセス定義 XPDLファイルにエクスポートする..................146
プロセス定義 アーカイブ.......................................................144
プロセス定義 アーカイブ済の削除.......................................145
プロセス定義 検証...................................................................43
プロセス定義 公開する..........................................................144
プロセス定義 最新バージョンを取得する...............................54
プロセス定義 削除.................................................................145
プロセス定義 作成...................................................................43
プロセス定義識別子................................................................10
プロセス定義 状態.....................................................................9
プロセス定義 所有権...............................................................12
プロセス定義所有者..............................................................183
プロセス定義 属性.....................................................................8
プロセス定義 デザイン.............................................................39
プロセス定義の版数管理........................................................10
プロセス定義 フィルタ..............................................................54
プロセス定義 フィルタの条件................................................143
プロセス定義 変更する............................................................19
プロセス定義 編集モード.........................................................42
プロセス定義 変数データ........................................................13
プロセス定義 リストを作成する...............................................143
プロセス編集............................................................................25
フローコントロール....................................................................10
文書管理システム..................................................................183
変数データ ユーザ定義属性..................................................13
補償アクション................................................................11,64,72
補正アクション........................................................................184
本書の目的.................................................................................i
[な]
ネーミングサービス.................................................................182
ノード..................................................................................10,183
ノード Conditionalノード...........................................................48
ノードインスタンス.....................................................................21
ノードタイプ...............................................................................13
ノード リモートサブプロセスノード..........................................116
[は]
バッチ処理を行う......................................................................80
ビジネスカレンダー.........................................................112,183
ビジネス相対時刻タイマー......................................................12
ビジネス定期タイマー..............................................................12
ファイルリスナ...........................................................................97
フィルタ.....................................................................................25
フィルタ プロセスインスタンス................................................147
フィルタ プロセス定義.......................................................54,143
フィルタ ワークアイテム............................................................55
フィルター.................................................................................77
フィルター 追加........................................................................79
フォーム.............................................................................11,183
フレームワークアダプタ..........................................................183
プログラミングサンプル..........................................................161
プロジェクト.............................................................................183
プロセス..................................................................................183
プロセスインスタンス.......................................................8,19,183
プロセスインスタンスEJB............................................................4
プロセスインスタンス UDAの取得...........................................81
プロセスインスタンス アーカイブ............................................148
プロセスインスタンス アーカイブ済の削除............................150
プロセスインスタンス 一時停止する......................................148
プロセスインスタンス 開始する................................................54
プロセスインスタンス 再開する..............................................149
プロセスインスタンス 削除......................................................150
プロセスインスタンス 状態........................................................21
プロセスインスタンス 所有権....................................................22
プロセスインスタンス所有者...................................................183
プロセスインスタンス 所有者を変更する...............................147
プロセスインスタンス 中止......................................................149
プロセスインスタンスの属性.....................................................20
プロセスインスタンス フィルタの条件.....................................147
プロセスインスタンス リストを作成する...................................147
プロセス関係者......................................................................183
[ま]
無処理Java Action ................................................................184
[や]
矢印..............................................................................10,24,184
矢印 addArrow()......................................................................43
矢印 makeChoice()...................................................................56
矢印インスタンス......................................................................21
ユーザエージェントEJB.............................................................3
ユーザ管理..........................................................................4,139
ユーザキャッシュ クリア..........................................................142
ユーザグループ................................................................11,184
ユーザ定義属性................................................................13,184
ユーザ定義属性 (UDA) タイプXMLの...................................84
ユーザ定義属性 追加..............................................................46
ユーザプロファイル................................................................184
ユーザ リストを作成する.........................................................142
ユーザ ログアウト......................................................................41
ユーザ ログイン........................................................................41
[ら]
リストの更新通知......................................................................81
リスト ワークアイテム.................................................................55
リモートグループストア...........................................................140
- 187 -
リモートサブプロセス..............................................................115
リモートサブプロセス エラー処理..........................................119
リモートサブプロセス 認証.....................................................119
リモートサブプロセスノード....................................................116
リモートユーザストア...............................................................139
履歴情報................................................................................153
履歴テーブル.........................................................................158
ルール...............................................................................47,184
例外処理..................................................................................38
ログアウト...........................................................................41,138
ログイン..............................................................................41,138
ローカルグループ管理..........................................................140
ローカルグループストア.........................................................140
ローカルユーザ管理..............................................................140
ローカルユーザストア.............................................................139
ロール.....................................................................................184
ロールアクション..................................................................11,64
[わ]
ワークアイテム...................................................................22,184
ワークアイテム 活性.................................................................23
ワークアイテム 完了.................................................................24
ワークアイテム 拒否.................................................................24
ワークアイテム 更新する........................................................151
ワークアイテム 再割当てする................................................150
ワークアイテム 実行する..........................................................56
ワークアイテム 受理.................................................................23
ワークアイテム 状態.................................................................23
ワークアイテム 属性.................................................................22
ワークアイテム 外向き矢印の取得..........................................81
ワークアイテムの取戻し...........................................................56
ワークアイテム 非活性.............................................................24
ワークアイテム フィルタ............................................................55
ワークアイテム フィルタの条件................................................55
ワークアイテム モード...............................................................22
ワークアイテム 読取り...............................................................23
ワークアイテム リストを作成する...............................................55
ワークフロー...........................................................................184
ワークフローアプリケーション.................................................184
ワークフローアプリケーションの操作.........................................8
ワークフローエレメント..............................................................10
ワークフロー 概要......................................................................1
ワークフローサーバ................................................................184
ワークリスト..............................................................................184
ワークリストUDA..................................................................80,85
- 188 -