© 2007 Hewlett-Packard Development Company, L.P.
The information contained herein is subject to change without notice
JBoss jBPM 3.1
プログラミング入門
オープンソース・コンピテンシ・センター
日本ヒューレットパッカード株式会社
内容
•
プログラミング入門
−
Hello World アプリケーション
−
Hello World アプリケーション(プロセスの永続化)
•
webプログラミング入門
−
サンプル
webアプリケーション(概要・実習)
−
GPDを使ったプロセスの作成
•
webアプリケーションの実装例
プログラミング入門
HelloWorld アプリケーション
•
プロセスのステータスを進めるだけの簡単な例
•
処理内容
−
JBoss jBPM のAPIを使って、プロセス定義(JPDL)をメモリ上
に作成
•
DBにデプロイせずに、メモリ上に保持(DBは不使用)
−
プロセス定義をインスタンス化し、プロセスを開始
−
単純なノード
(stateノード)を進めてプロセスを終了させる
5 平成19年4月25日
HelloWorld アプリケーション用 プロセス
プロセス定義 (JPDL表記)
<process-definition
name="helloworld">
<start-state name="start">
<transition to="s" />
</start-state>
<state name="s">
<transition to="end" />
</state>
<end-state name="end" />
</process-definition>
HelloWorld アプリケーション
public void testHelloWorldProcess() {
//
プロセス定義の生成
/
取得
ProcessDefinition processDefinition =
ProcessDefinition.parseXmlString(
"<process-definition>" +
"<start-state name='start'>" + "<transition to='s' />" +
"</start-state>" +
"<state name='s'>" + "<transition to='end' />" + "</state>" +
"<end-state name='end' />" +"</process-definition> );
//
プロセスインスタンスの生成
ProcessInstance processInstance =
new ProcessInstance(processDefinition);
//
ルートトークンを取得
Token token = processInstance.getRootToken();
assertSame(processDefinition.getStartState(), token.getNode());
//
トークンにシグナルを送り、プロセスを進める
token.signal();
assertSame(processDefinition.getNode("s"), token.getNode());
token.signal();
assertSame(processDefinition.getNode("end"), token.getNode());
}
プログラミング入門
HelloWorld アプリケーション
(プロセスの永続化)
HelloWorld DB アプリケーションで行う内容
•
Hello Worldアプリケーションと同じプロセスを使用するが、プ
ロセスの定義とプロセスの状態をデータベースに保存する。
−
DBはメモリ上で動作するHSQLDB
•
処理内容
−
JBoss jBPM のAPIを使って、プロセス定義(JPDL)をメモリ上に作成
−
プロセス定義を
DBにデプロイする
−
プロセス定義を
DBから取得、インスタンス化し、プロセスを開始
−
単純なノード
(stateノード)を進める
−
プロセスの状態を
DBへ保存
−
プロセスインスタンスを
DBから取得し、プロセスを進め、完了させる
9 平成19年4月25日
HelloWorld DB アプリケーション用
プロセス
<process-definition
name="helloworld">
<start-state name="start">
<transition to="s" />
</start-state>
<state name="s">
<transition to="end" />
</state>
<end-state name="end" />
</process-definition>
プロセス定義 (JPDL表記)
HelloWorld アプリケーショ用
プロセスと同じ
HelloWorld DB アプリケーション (1/5)
JbpmConfiguration : データベースの設定
public class HelloWorldDbTest extends TestCase {
static JbpmConfiguration jbpmConfiguration = null;
static { jbpmConfiguration = JbpmConfiguration.parseXmlString( "<jbpm-configuration>" + " <jbpm-context>" + " <service name='persistence' " + " factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />" + " </jbpm-context>" + " <string name='resource.hibernate.cfg.xml' " + " value='hibernate.cfg.xml' />" + " <string name='resource.business.calendar' " + " value='org/jbpm/calendar/jbpm.business.calendar.properties' />" + " <string name='resource.default.modules' " + " value='org/jbpm/graph/def/jbpm.default.modules.properties' />" + " <string name='resource.converter' " + " value='org/jbpm/db/hibernate/jbpm.converter.properties' />" + " <string name='resource.action.types' " + " value='org/jbpm/graph/action/action.types.xml' />" + " <string name='resource.node.types' " + " value='org/jbpm/graph/node/node.types.xml' />" + " <string name='resource.varmapping' " + " value='org/jbpm/context/exe/jbpm.varmapping.xml' />" + "</jbpm-configuration>" ); }
public void setUp() {
JbpmConfiguration
• JBoss jBPMの設定管理用クラス
• 永続化サービス(データベース)などの
各種サービスの設定やファクトリとして
使われる
• スレッドセーフ
• 通常は クラスパスに通した
jbpm.cfg.xml に設定内容を記述し、次
の様にして JbpmConfigurationインス
タンスを取得する
JbpmConfiguration
jbpmConfiguration =
JbpmConfiguration.getInstance();
11 平成19年4月25日
HelloWorld DB アプリケーション (2/5)
アプリケーション本体
public void testSimplePersistence() {
// 1
つのメソッド内で
helloworld
プロセスの開始から終了までを実行する
// helloworld
プロセスをデータベースにデプロイする
deployProcessDefinition();
// helloworld
プロセスのプロセスインスタンスを生成し、
// "s"
ノードまで進める
processInstanceIsCreatedWhenUserSubmitsWebappForm();
// helloworld
プロセスを完了させる
theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();
}
HelloWorld DB アプリケーション (3/5)
プロセスのデプロイ
public void deployProcessDefinition() {
ProcessDefinition processDefinition =
ProcessDefinition.parseXmlString(
"<process-definition name='helloworld'>" +
" <start-state name='start'>" + "<transition to='s' />" +
"</start-state>" +
" <state name='s'>" + "<transition to='end' />" + "</state>" +
" <end-state name='end' />" +
"</process-definition>" );
JbpmContext jbpmContext =
jbpmConfiguration.createJbpmContext();
try {
// helloworld
プロセスをデータベースにデプロイ
jbpmContext.deployProcessDefinition(processDefinition);
} finally {
jbpmContext.close();
}
}
JbpmContext
• プロセスを永続的に操作する
ために使用
•
JbpmConfiguration#createJb
pmContext()を使って生成
• トランザクション境界を定める
ことが可能。デフォルトでは
Hibernateセッションが生成さ
れ、トランザクションが開始す
る。
• スレッドごとに生成・使用する
• try-finallyブロックを使用して、
必ずclose()処理をする
。
13 平成19年4月25日
HelloWorld DB アプリケーション (4/5)
プロセスインスタンスの生成
/プロセスを進める
public void processInstanceIsCreatedWhenUserSubmitsWebappForm() {
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
GraphSession graphSession = jbpmContext.getGraphSession();
//
プロセス定義の取得とプロセスインスタンスの生成
ProcessDefinition processDefinition =
graphSession.findLatestProcessDefinition("helloworld");
ProcessInstance processInstance = new ProcessInstance(processDefinition);
//
ルートトークンを取得
Token token = processInstance.getRootToken();
assertEquals("start", token.getNode().getName());
//
トークンにシグナルを送ることでプロセスを進める
token.signal();
assertEquals("s", token.getNode().getName());
//
プロセスインスタンス
(
プロセスの状態
)
をデータベースに保存
jbpmContext.save(processInstance);
} finally {
jbpmContext.close();
}
}
HelloWorld DB アプリケーション (5/5)
プロセスを進める
/完了させる
public void theProcessInstanceContinuesWhenAnAsyncMessageIsReceived() {
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
GraphSession graphSession = jbpmContext.getGraphSession();
ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition("helloworld");
// helloworld
プロセスのプロセスインスタンスをすべて取得
List processInstances = graphSession.findProcessInstances(processDefinition.getId());
// 1
つしかないことが分かっているので
1
番目のプロセスインスタンスを取得
ProcessInstance processInstance = (ProcessInstance) processInstances.get(0);
//
プロセスを進める。プロセスインスタンスにシグナルを送ることはルートトークンにシグナルを送る
のと同じ。
processInstance.signal();
//
プロセス
(
インスタンス
)
の完了を確認
assertTrue(processInstance.hasEnded());
} finally {
jbpmContext.close();
}
webプログラミング入門
JBoss jBPM サンプルWebアプリケーションとは
•
JBoss jBPM が提供するWebアプリケーションのサンプル
−
JBoss jBPMスターターキット内に付属
−
簡単な社内購買システム(
websaleアプリケーション)
−
簡単なプロセス管理機能も付属
•
JBoss jBPM スターターキット
−
URL
http://sourceforge.net/project/showfiles.php?group_id=70542
ファイル名:
jbpm-starters-kit-3.1.4.zip
−
ソースディレクトリ
•
$JBPM_KIT_HOME/jbpm
−
起動ディレクトリ
•
$JBPM_KIT_HOME/jbpm-server
•
サンプル
Webアプリケーション等すべてデプロイ済みのJBossAS(4.0.3SP1
)
17 平成19年4月25日
JBoss jBPM スターターキットでのセットアップ手順
•必要なもの
−
JDK 5.0 Update 11
• ファイル: jdk-1_5_0_11-windows-i586-p.exe • ダウンロード元: http://java.sun.com/javase/downloads/ind ex_jdk5.jsp−
JBoss jBPM 3.1.4 スターターキット
• ファイル: jbpm-starters-kit-3.1.4.zip • ダウンロード元: http://sourceforge.net/project/showfiles.ph p?group_id=70542 •セットアップ手順
−
JDKのインストール
−
スターターキットのセットアップ
•実行手順
−
JBossASの起動
•起動確認
−
JBossASの起動後、Webブラウザで、次
の
URLにアクセスします。
•
http://localhost:8080/jbpm/
> cd C:¥
> mkdir jboss
> cd jboss
> jar xvf C:¥jboss_archive¥jbpm-starters-kit-3.1.4.zip
> cd C:¥jboss¥jbpm-starters-kit-3.1.4
> cd jbpm-server
> start.bat
サンプル
Webアプリケーション :
サンプルプロセス
19 平成19年4月25日
サンプル
Webアプリケーション :
ソフトウェアスタック
JBoss AS
Tomcat
JbpmContextFilter
JBoss jBPM
Hib
ernate
ActionHandler
JbpmConfiguration
user_name mgr_name isUrgentapproval 申請確定 Start-state End-state 品目入力 承認 item price token user1web.xml
JSF (
Myfaces)
faces-config.xml
jbpm.sar
Managed Bean
JSP
プロセス
インスタンス
JbpmContextFilter
•
jbpmContextの生成とクローズを実施
•
JBoss jBPM に付属のServlet Filter
•
クライアントからの
HTTPリクエスト受付
時に
JbpmContextを生成
−
生成された
JbpmContextはスレッドに割
り当てられる
(ThreaLocal)
•
クライアントに
HTTPレスポンスを返す前
に、
JbpmContextをクローズ
web.xml
... <filter> <filter-name>JbpmContextFilter</filter-name> <filter-class>org.jbpm.web.JbpmContextFilter </filter-class> </filter> <filter-mapping> <filter-name>JbpmContextFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ...public class JbpmContextFilter implements Filter, Serializable { ...
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
JbpmContext jbpmContext = getJbpmConfiguration().createJbpmContext(jbpmContextName);
try { if (isAuthenticationEnabled) { jbpmContext.setActorId(actorId); } filterChain.doFilter(servletRequest, servletResponse); } finally { jbpmContext.close();
JbpmContextFilter.java
21 平成19年4月25日
jbpm.sar
•
JBoss Application Serverに組み込む場合に使用
•
JbpmConfigurationインスタンスを保持
−
jBPMをJBossと連携させるために必要
−
jBPM関係のjarファイル
−
DBの設定(hiberante.cfg.xml)
サンプル
Webアプリケーション :
フロー例
JBoss AS
Tomcat
JbpmContextFilter
JBoss jBPM
Hib
ernate
ActionHandler
JbpmConfiguration
user_name mgr_name isUrgentapproval 申請確定 Start-state End-state 品目入力 承認 item price token user1JSF (
Myfaces)
faces-config.xml
Managed
Bean
JSP
プロセス
インスタンス
HTTPリクエスト
jbpmContext
の生成
jbpmContext
のクローズ
HTTPレスポンス
action="#{hogeBean.aMetho
d}"
HogeBean#aMethod(
)
プロセスの処理
HttpSession HttpReque st戻り値
遷移先
サンプル
Webアプリ
ケーションの実習
サンプル
Webアプリケーションの起動手順
•
実行手順(
JBossASの起動)
•
起動確認
−
JBossASの起動後、Webブラ
ウザで、次の
URLにアクセス
します。
•
http://localhost:8080/jbpm/
> set JAVA_HOME=c:¥java¥15011
> cd C:¥jboss¥jbpm-starters-kit-3.1.3
> cd jbpm-server
> start.bat
25 平成19年4月25日
ログイン画面
webオーダー画面へ進む
27 平成19年4月25日
新しい
webオーダーの入力
プロセスの
状態
別ユーザでのログイン
Orderの承認はernieに依頼された。
ernieでログインする。
29 平成19年4月25日
Ernieのログイン画面
Orderのチェック
プロセスの
状態が変化!
webプログラミング入門
GPDを使ったプロセスの作成で行う内容
•
JBoss jBPM プロセスデザイナー(GDP)を使用したプロセスの
作成
−
タスク処理
−
プロセス変数・タスクインスタンス変数の処理
−
ユーザーのアサイン
•
JBoss jBPM プロセスデザイナーを使用したプロセスのデプロ
イ
−
サンプル
Webアプリケーションがデプロイされた JBoss AS にプロセス
をデプロイ
•
作成・デプロイしたプロセスの実行
•
サンプル
Webアプリケーションに付属のプロセス管理画面の
紹介
33 平成19年4月25日
作成するプロセス
: HelloWorld プロセス
"cookie monster"
ユーザでログインし、プ
ロセス開始。プロセス
変数を設定
(msg)する。
"ernie" ユーザ
でログインし、
プロセス変数
(msg)を確認し
てタスクを終了
JBoss jBPMによ
り、タスクが
"ernie" ユーザ
にアサインされ
る
①
③
②
実習に必要なソフトウェアのインストール概要
1.
JDK のインストール
2.
Eclipse SDK のインストール
3.
JBoss jBPM スターターキットのインストール
4.
JBoss jBPM プロセスデザイナー(GPD)のインストール
5.
JBoss jBPM プロセスデザイナー(GPD)の設定
35 平成19年4月25日
実習の準備
: 必要なもの
•
JDK
−
jdk-1_5_0_11-windows-i586-p.exe
•
http://java.sun.com/javase/downloads/index_jdk5.jsp
•
Eclipse SDK
−
eclipse-SDK-3.2.2-win32.zip
•
http://www.eclipse.org/downloads/
•
JBoss jBPM スターターキット
−
jbpm-starters-kit-3.1.4.zip
•
http://sourceforge.net/project/showfiles.php?group_id=70542
•
JBoss jBPM プロセスデザイナー(GPD)
−
jbpm-jpdl-designer-3.0.13.zip
•
http://sourceforge.net/project/showfiles.php?group_id=70542
実習の準備
: 詳細 1/3
1.
JDKのインストール
−
インストールしたフォルダを環境変数
JAVA_HOME に設定してください。
2.
Eclipse SDKのインストール
−
今回はインストールしたフォルダを環境変数
ECLIPSE_HOME に設定し
ます。
3.
JBoss jBPM スターターキットのセットアップ
4.
JBoss jBPM プロセスデザイナーのインストール
> cd C:¥
> mkdir jboss
> cd jboss
> jar xvf C:¥jboss_archive¥jbpm-starters-kit-3.1.4.zip
> cd %ECLIPSE_HOME%
37 平成19年4月25日
実習の準備
: 詳細 2/3
6.
JBoss jBPM プロセスデザイナー(GPD)の設定
(1)インストール確認
−
Eclipseの起動
•
Window
•
Preferences
(2) 設定
−
Add
−
Name
任意
(JBoss jBPM3.1.4)
−
Location
C:¥jboss¥jbpm-starters-kit-3.1.4¥jbpm
−
OK
(3) チェックボックスをチェックして、
JBoss jBPM本体を有効にする
(2)
(3)
(1)
実習の準備
: 詳細 3/3
7.
サンプルアプリがデプロイされた
JBoss
ASの起動
−
起動手順(
JBossASの起動)
−
起動確認
•
JBossASの起動後、Webブラウザで、
次の
URLにアクセスします。
−
http://localhost:8080/jbpm/
> cd C:¥jboss¥jbpm-starters-kit-3.1.4
> cd jbpm-server
> start.bat
[メモ] コンソールに表示されるJBoss ASのログレベルがTRACEになってい ます。INFOに変更するには、 jbpm-server¥server¥jbpm¥conf¥log4j.xml を以下のように変更します。 (旧)<param name="Threshold" value="TRACE"/>
39 平成19年4月25日
実習
: (1) Process Project の作成
Eclipseから
•
File
•
New
•
Other
•
JBoss jBPM
•
Process Project
•
Next
•
Project Name
−
HelloWorldProcess
•
Finish
実習
: (2) Process Definition(JPDL)の新規作成
•
Java Perspective
•
Package Explorer
•
HelloWorldProcess
プロジェクト
•
src/main/jpdl を右クリック
•
New
•
Other
•
JBoss jBPM
•
Process Definition
•
Process Name
−
HelloWorld
•
Finish
41 平成19年4月25日
実習
: (3) プロセスの作成
•
HelloWorldProcessプロジェクト
•
src/main/jpdl/HelloWorld
•
processdefinition.xmlを
右クリック
•
Open With
•
jBPM Graphical Process
Designer
•
各ノードを選択、貼り付け
−
Startノードを1つ
−
Task Nodeを1つ
−
Endノードを1つ
•
ノード間を
Transitionで連結
実習
: (4) StartノードにTaskを追加
•
Startノードを右クリック
•
Add Task
•
Outline Viewを表示
•
taskを右クリック
•
Properties
−
Controller
•
Add
•
Name : msg
•
Read : チェック
•
Write : チェック
•
Required : チェック
•
OK
43 平成19年4月25日
実習
: (5) Taks NodeにTaskを追加しアクター
をアサイン
•
Task Nodeを右クリック
•
Add Task
•
Outline Viewを表示
•
task1を右クリック
•
Properties
−
Controller
•
Add
•
Name : msg
•
Read : チェック
•
Write/Required : オフ
−
Assignment
•
type : Expression
•
expression : user(ernie)
•
OK
File → Save でプロセスを保存します
実習
: (6) プロセスのデプロイ
•
Deployment タブ
•
Server Deployer
−
(旧) /jbpm-console/upload
−
(新) /jbpm/upload
•
Test Connection
45 平成19年4月25日
実習
: (7) プロセスの実行 1/8
•
サンプルアプリにアクセス
−
http://localhost:8080/jbpm/
実習
: (7) プロセスの実行 2/8
47 平成19年4月25日
実習
: (7) プロセスの実行 3/8
•
msg フィールド(msg プロセス変数)に、
"Hello jBPM と入力"
•
"Save and Close Task"
ボタンを押してタクスを
終了させる
実習
: (7) プロセスの実行 4/8
•
自動的に
Home画面に戻る
•
ログアウトするために、
"Login as another
user"
49 平成19年4月25日
実習
: (7) プロセスの実行 5/8
実習
: (7) プロセスの実行 6/8
•
"Tasklist" に "task1" がリストされていること
を確認
51 平成19年4月25日
実習
: (7) プロセスの実行 7/8
•
msg フォームに、
"cookie monster"
ユーザが入力した文
字列が表示されてい
ることを確認
•
"Save and Close
Task" ボタンを押して
タクスを終了
実習
: (7) プロセスの実行 8/8
53 平成19年4月25日
実習
: (8) プロセス管理画面 1
購買申請アプリケーション
•
備品を購入するための申請・承認システム
−
登場人物:社員(申請者)、上司(承認者)
•
社員
−
購買申請処理
•
商品と値段の入力
•
承認する上司の選択
•
承認が緊急であるかどうかを入力
−
緊急の場合は、承認者にメールが自動送信される
−
申請履歴の参照
•
承認結果を参照
•
上司
−
申請の承認処理
•
承認結果は、申請者にメールで知らされる
57 平成19年4月25日
購買申請アプリケーションのユースケース
<上司:承認処理>
Step1 : システムにログイン
Step2 : 承認処理メニューへ進む
Step3 : 申請を承認するか否かを選択し、確定
−
承認結果が社員にメール送信される
Step4 : ログアウト
<社員:申請履歴参照>
Step1 : システムにログイン
Step2 : 購買申請履歴メニューへ進む
Step3 : 過去の申請IDを入力すると、申請のステー
タスが表示される
− 申請ID(プロセスID) − 品目、価格 − ステータス(承認済、未承認、却下)Step4 : ログアウト
<社員:購買申請>
Step1 : システムにログイン
Step2 : 購買申請メニューへ進む
Step3 : 購買品目情報を入力し、次の画面へ
−品名、価格Step4 : 次の情報を選択し、購買申請を送信
−承認依頼する上司 •外部システムにアクセスし、価格に応じて選択可能な上司の 一覧が表示される −緊急かどうか •緊急な場合は上司にメールが送信されるStep5 : 申請確認画面が表示される
−申請ID、品名、価格、上司名Step6 : ログアウト
購買申請アプリケーション用
ビジネスプロセス
59 平成19年4月25日
購買申請アプリケーション全体図
プロセスインスタンス jbpmConfigurationJVM
DBセッション/トランザクション 生成 user_name mgr_name isUrgent approval 申請確定 Start-state End-state 品目入力 承認 上司選択 承認依頼のメール送信 承認結果のメール送信 <task-node> <task-node> <task-node> item price SelectMgr ActionHandler SendMail ActionHandler SendMail ActionHandler UserAssignment Handler UserAssignment Handler MgrAssignment Handler トークン user1 user1 manager1 jBPM DB EIS 設定情報 緊急の場合 メール送信 メール送信 jbpmContext ログイン ログアウト ログイン ログアウト ログイン ログアウト購買申請プログラム
申請履歴参照プログラム
承認プログラム
購買申請プログラム
申請内容確認画面が表示される •申請ID、品名、価格、上司名 Step1 : 購買申請メニューへ進む 購買品目情報を入力し、 次の画面へ •品名、価格 次の情報を選択し、購買申請 を送信 •承認依頼する上司 •緊急かどうか ログアウト<社員:購買申請>
システムにログイン Step2 : Step3 : Step4 : Step5 : Step6 : 購買申請プログラム ユーザ"user1"でログイン ログアウト jbpmConte xt jbpmContext 取得 プロセスインスタンスの生成 トークンを取得 トークンにシグナルを送る プロセスインスタンスを保存 jbpmContext クローズ プロセス変数user_nameに ユーザ名user1を登録 user1に割り当てられた タスクを取得 申請情報を入力 user1に割り当てられた タスクを取得 申請依頼をする上司を選択 申請が緊急かどうかを選択 jbpmContext 取得 タスクを終了させる プロセスインスタンスを保存 jbpmContext クローズ jbpmContext 取得 タスクを終了させる プロセスインスタンスを保存 jbpmContext クローズ プロセスインスタンス jbpmConfigurationJVM
DBセッション/トランザクション 生成 user_name mgr_name isUrgent approval 申請確定 Start-state End-state 品目入力 承認 上司選択 承認依頼のメール送信 承認結果のメール送信 <task-node> <task-node> <task-node> item price SelectMgr ActionHandler SendMail ActionHandler SendMail ActionHandler UserAssignment Handler UserAssignment Handler MgrAssignment Handler トークン トークン トークン トークン user1 user1 アサイン manager1 プロセス変数 "user_name"の値を アサイン プロセス変数 “mgr_name”の値を アサイン jBPM DB EIS 設定情報 ①上司問合せ ②"manager1" ③プロセス変数 "mgr_name"に "manager1"を登録 緊急の場合 メール送信61 平成19年4月25日 ログアウト Step5 : Step6 :
購買申請アプリケーションの
Webアプリ化
システムにログイン 購買申請メニューへ進む 購買品目情報を入力 上司、緊急度を選択し購 買申請を送信 Step4 : 申請確認画面が表示さ れる プロセスインスタンス jbpmConfigurationTomcat
ServletContext mgr_name isUrgent approval 申請確定 Start-state End-state 品目入力 承認 上司選択 承認依頼のメール送信 承認結果のメール送信 <task-node> <task-node> <task-node> item price SelectMgr ActionHandler SendMail ActionHandler SendMail ActionHandler UserAssignment Handler UserAssignment Handler MgrAssignment Handler トークン トークン トークン トークン user1 user1 manager1 jBPM DB EIS 緊急の場合 メール送信 ログイン ログアウト jbpmConte xt jbpmContext 取得 プロセスインスタンスの生成 トークンを取得 トークンにシグナルを送る プロセスインスタンスを保存 jbpmContext クローズ プロセス変数user_nameに ユーザ名user1を登録 • user1に割り当てられたタ スクを取得 • 申請情報を入力 • user1に割り当てられた タスクを取得 • 申請依頼をする上司を選択 • 申請が緊急かどうかを選択 jbpmContext 取得 •タスクを終了させる •プロセスインスタンスを保存 •jbpmContext クローズ jbpmContext 取得 •タスクを終了させる •プロセスインスタンスを保存 •jbpmContext クローズ user_name HttpSession ログイン 履歴 申請 次へ 申請確定 ログアウト HTTPリクエスト/ レスポンス Step1 : Step2 : Step3 : HttpSessionの user_name 属性にログイン ユーザー名を登録 HttpSessionの user_name"属性 値をアサイン Servlet Filter 生成と 削除Webアプリケーションのソフトウェアスタック例:
JBoss AS と Seasar2 と連携させた場合
JBoss AS
Tomcat
S2Container
JbpmContextFilter
JBoss jBPM
Hib
ernate
HTML
S2ContainerFilter
Action
クラス
Logic
クラス
プロセス
S2JSF
ActionHandler
JbpmConfiguration
user_name mgr_name isUrgentapproval 申請確定 Start-state End-state 品目入力 承認 item price token user1 Step3 : 購買品目 情報を入力 次へ 品目入力app.dicon
web.xml
JSF
Myfacesfaces-config.xml
63 平成19年4月25日 ログアウト Step5 : Step6 :
Step3 : 購買品目情報を入力
システムにログイン 購買申請メニューへ進む 購買品目情報を入力 上司、緊急度を選択し購 買申請を送信 Step4 : 申請確認画面が表示さ れる プロセスインスタンス jbpmConfigurationTomcat/JBossAS
ServletContext mgr_name isUrgent approval 申請確定 Start-state End-state 品目入力 承認 上司選択 承認依頼のメール送信 承認結果のメール送信 <task-node> <task-node> <task-node> item price SelectMgr ActionHandler SendMail ActionHandler SendMail ActionHandler UserAssignment Handler UserAssignment Handler MgrAssignment Handler トークン トークン user1 user1 manager1 jBPM DB EIS ログイン ログアウト jbpmConte xt jbpmContext 取得 プロセスインスタンスの生成 トークンを取得 トークンにシグナルを送る プロセスインスタンスを保存 jbpmContext クローズ プロセス変数user_nameに ユーザ名user1を登録 • user1に割り当てられたタ スクを取得 • 申請情報を入力 • user1に割り当てられた タスクを取得 • 申請依頼をする上司を選択 • 申請が緊急かどうかを選択 jbpmContext 取得 •タスクを終了させる •プロセスインスタンスを保存 •jbpmContext クローズ jbpmContext 取得 •タスクを終了させる •プロセスインスタンスを保存 •jbpmContext クローズ user_name HttpSession ログイン 履歴 申請 次へ 申請確定 ログアウト HTTPリクエスト/ レスポンス Step1 : Step2 : Step3 : Servlet Filter 緊急の場合 メール送信Step3 : 購買品目情報を入力
システム制御フロー
JBoss AS
Tomcat
S2Container
JbpmContextFilter
JBoss jBPM
Hib
ernate
HTML
S2ContainerFilter
Action
クラス
Logic
クラス
プロセス
S2JSF
ActionHandler
JbpmConfiguration
user_name mgr_name isUrgentapproval 申請確定 Start-state End-state 品目入力 承認 item price token user1 Step3 : 購買品目 情報を入力 次へ 品目入力jbpmContext
の生成
UserAction#input()
BpmLogic#input()
jbpmContext
のクローズ
戻り値
user_confirm
HTTPリクエスト
user_input.htmlHTTPレスポンス
user_confirm.html品目と値段を
DTOに設定
JSF
Myfaces戻り値の
user_confirmを
元に遷移先画面
参照資料
JBoss jBPM のホームページ
http://www.jbpm.org/index.html
JBoss jBPM のドキュメントのページ
http://www.jbpm.org/docs.html
JBoss jBPM のユーザフォーラム
http://sourceforge.net/forum/forum.php?forum_id=240085
JBoss jBPM のWiki
http://wiki.jboss.org/wiki/Wiki.jsp?page=JbpmWiki
JBoss jBPM getting started guide
http://wiki.jboss.org/wiki/Wiki.jsp?page=JbpmGettingStarted
JBoss jBPM API(Javadoc)
67 平成19年4月25日
日本ヒューレット・パッカード株式会社の
JBoss/オープンソースに関連するURL
JBossのページ
http://www.hp.com/jp/jboss/
Open Source & Linuxのページ
69 平成19年4月25日
サンプル
Webアプリケーション :
プロセス定義の取得
•
http://localhost:8080/jb
pm/
•
"cookie monster" で"Log
In"
•
home.jsp
<h4>Start New Process Execution</h4>
<h:dataTable value="#{homeBean.latestProcessDefinitions}" var="processDefinition" ...>
<f:facet name="header">
<h:outputText value="Start Process Link" /> </f:facet>
<h:commandLink action="#{homeBean.startProcessInstance}">
<f:param name="processDefinitionId" value="#{processDefinition.id}"/>
<h:outputText value="#{processDefinition.taskMgmtDefinition.startTask.name}" /> </h:commandLink> </h:column> ... <h:outputText value="#{processDefinition.name}" /> ... <h:outputText value="#{processDefinition.version}" />
home.jsp 抜粋
サンプル
Webアプリケーション :
プロセス定義の取得
(HomeBean)
HomeBean.java 抜粋
public class HomeBean {
...
JbpmContext jbpmContext;
GraphSession graphSession;
TaskMgmtSession taskMgmtSession;
public HomeBean() {
this.jbpmContext = JbpmContext.getCurrentJbpmContext();
this.graphSession = jbpmContext.getGraphSession();
this.taskMgmtSession = jbpmContext.getTaskMgmtSession();
}
...
public List getLatestProcessDefinitions() {
return graphSession.findLatestProcessDefinitions();
}
71 平成19年4月25日
サンプル
Webアプリケーション :
プロセスインスタンスの生成
•
"create new web sale
order" をクリック
•
task.jsp へ遷移する
<h4>Start New Process Execution</h4>
<h:dataTable value="#{homeBean.latestProcessDefinitions}" var="processDefinition" ...>
<f:facet name="header">
<h:outputText value="Start Process Link" />
</f:facet>
<h:commandLink action="#{homeBean.startProcessInstance}">
<f:param name="processDefinitionId" value="#{processDefinition.id}"/>
<h:outputText value="#{processDefinition.taskMgmtDefinition.startTask.name}" />
</h:commandLink>
</h:column>
クリック
サンプル
Webアプリケーション :
プロセスインスタンスの生成
(HomeBean)
HomeBean.java 抜粋
public String startProcessInstance() {
// Get the task instance id from request parameter
long processDefinitionId = JsfHelper.getId("processDefinitionId");
ProcessDefinition processDefinition =
graphSession.loadProcessDefinition(processDefinitionId);
// create a new process instance to run
ProcessInstance processInstance = new ProcessInstance(processDefinition);
// create a new taskinstance for the start task
TaskInstance taskInstance = processInstance.getTaskMgmtInstance().createStartTaskInstance();
// Save the process instance along with the task instance
jbpmContext.save(processInstance);
// Fill the task backing bean with useful information
taskBean.initialize(taskInstance);
return "task";
73 平成19年4月25日
サンプル
Webアプリケーション :
タスク処理
•フォームのフィールドに入力
−
item : book
−
quantity : 1
•
"Save and Close Task" をク
リック
<h:form id="taskform">
<h:inputHidden id="taskInstanceId" value="#{taskBean.taskInstanceId}" /> <h2><h:outputText value="#{taskBean.taskInstance.name}" /></h2><hr />
<h:dataTable value="#{taskBean.taskFormParameters}" var="formParameter">
<h:column>
<h:outputText value="#{formParameter.label}" />
...
<h:outputText value="#{formParameter.description}" /> ...
<h:inputText value="#{formParameter.value}" readonly="#{formParameter.readOnly}" />
...
</h:dataTable> <hr />
...
<h:commandButton id="transitionButton" action="#{taskBean.saveAndClose}" value="Save and Close Task"/>
...
task.jsp 抜粋
タスクインスタンス変数を取得
サンプル
Webアプリケーション :
タスクインスタンス変数を取得する
(TaskBean)
public List getTaskFormParameters() {
return taskFormParameters;
}
public void initialize(TaskInstance taskInstance) {
this.taskInstance = taskInstance;
this.taskInstanceId = taskInstance.getId();
// set the parameters
this.taskFormParameters = new ArrayList();
TaskController taskController = taskInstance.getTask().getTaskController();
if (taskController!=null) {
List variableAccesses = taskController.getVariableAccesses();
Iterator iter = variableAccesses.iterator();
while (iter.hasNext()) {
VariableAccess variableAccess = (VariableAccess) iter.next();
String mappedName = variableAccess.getMappedName();
Object value = taskInstance.getVariable(mappedName);
TaskFormParameter tfp = new TaskFormParameter(variableAccess, value);
taskFormParameters.add(tfp);
}
// store the parameters in the session
JsfHelper.setSessionAttribute("taskFormParameters", taskFormParameters);
75 平成19年4月25日
サンプル
Webアプリケーション :
タスクインスタンス変数を保存する
(TaskBean)
public String saveAndClose() {
// save
save();
// close the task instance
String transitionButton =
JsfHelper.getParameter("taskform:transitionButton"); TaskInstance taskInstance =
taskMgmtSession.loadTaskInstance(taskInstanceId); if ("Save and Close Task".equals(transitionButton)) { taskInstance.end(); ... } ... jbpmContext.save(taskInstance); return "home"; }
TaskBean.java 抜粋
public String save() { ...
// submit the parameters in the jbpm task controller
TaskInstance taskInstance =
taskMgmtSession.loadTaskInstance(taskInstanceId);
// collect the parameter values from the values that were updated in // the parameters by jsf.
Iterator iter = taskFormParameters.iterator(); while (iter.hasNext()) { TaskFormParameter taskFormParameter = (TaskFormParameter) iter.next(); if ((taskFormParameter.isWritable()) && (taskFormParameter.getValue() != null)) { taskInstance.setVariable(taskFormParameter.getLabel(), taskFormParameter.getValue()); ... } }
// save the process instance and hence the updated // task instance variables
jbpmContext.save(taskInstance);
// remove the parameters from the session
JsfHelper.removeSessionAttribute("taskFormParameters"); return "home";
サンプル
Webアプリケーション :
タスクの取得
<h4>Tasklist</h4>
<h:dataTable value="#{homeBean.taskInstances}" var="taskInstance" ...>
<h:column >
<f:facet name="header"> <h:outputText value="Task Form Link" /> </f:facet> <h:commandLink action="#{homeBean.selectTaskInstance}">
<f:param name="taskInstanceId" value="#{taskInstance.id}"/>
<h:outputText value="#{taskInstance.name}" /> </h:commandLink> </h:column> ... <h:outputText value="#{taskInstance.taskMgmtInstance.taskMgmtDefinition.processDefinition.name}" /> ... <h:outputText value="#{taskInstance.taskMgmtInstance.taskMgmtDefinition.processDefinition.version}" />
•
http://localhost:8080/jbp
m/
•
"ernie" で"Log In"
•
home.jsp
77 平成19年4月25日
サンプル
Webアプリケーション :
タスクの取得
(HomeBean)
HomeBean.java 抜粋
public class HomeBean {
...
JbpmContext jbpmContext;
GraphSession graphSession;
TaskMgmtSession taskMgmtSession;
public HomeBean() {
this.jbpmContext = JbpmContext.getCurrentJbpmContext();
this.graphSession = jbpmContext.getGraphSession();
this.taskMgmtSession = jbpmContext.getTaskMgmtSession();
}
...
public List getTaskInstances() {
return taskMgmtSession.findTaskInstances(userBean.getUserName());
}