• 検索結果がありません。

JBoss jBPM 3.1 プログラミング入門

N/A
N/A
Protected

Academic year: 2021

シェア "JBoss jBPM 3.1 プログラミング入門"

Copied!
78
0
0

読み込み中.... (全文を見る)

全文

(1)

© 2007 Hewlett-Packard Development Company, L.P.

The information contained herein is subject to change without notice

JBoss jBPM 3.1

プログラミング入門

オープンソース・コンピテンシ・センター

日本ヒューレットパッカード株式会社

(2)

内容

プログラミング入門

Hello World アプリケーション

Hello World アプリケーション(プロセスの永続化)

webプログラミング入門

サンプル

webアプリケーション(概要・実習)

GPDを使ったプロセスの作成

webアプリケーションの実装例

(3)

プログラミング入門

(4)

HelloWorld アプリケーション

プロセスのステータスを進めるだけの簡単な例

処理内容

JBoss jBPM のAPIを使って、プロセス定義(JPDL)をメモリ上

に作成

DBにデプロイせずに、メモリ上に保持(DBは不使用)

プロセス定義をインスタンス化し、プロセスを開始

単純なノード

(stateノード)を進めてプロセスを終了させる

(5)

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>

(6)

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());

}

(7)

プログラミング入門

HelloWorld アプリケーション

(プロセスの永続化)

(8)

HelloWorld DB アプリケーションで行う内容

Hello Worldアプリケーションと同じプロセスを使用するが、プ

ロセスの定義とプロセスの状態をデータベースに保存する。

DBはメモリ上で動作するHSQLDB

処理内容

JBoss jBPM のAPIを使って、プロセス定義(JPDL)をメモリ上に作成

プロセス定義を

DBにデプロイする

プロセス定義を

DBから取得、インスタンス化し、プロセスを開始

単純なノード

(stateノード)を進める

プロセスの状態を

DBへ保存

プロセスインスタンスを

DBから取得し、プロセスを進め、完了させる

(9)

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 アプリケーショ用

プロセスと同じ

(10)

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)

11 平成19年4月25日

HelloWorld DB アプリケーション (2/5)

アプリケーション本体

public void testSimplePersistence() {

// 1

つのメソッド内で

helloworld

プロセスの開始から終了までを実行する

// helloworld

プロセスをデータベースにデプロイする

deployProcessDefinition();

// helloworld

プロセスのプロセスインスタンスを生成し、

// "s"

ノードまで進める

processInstanceIsCreatedWhenUserSubmitsWebappForm();

// helloworld

プロセスを完了させる

theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();

}

(12)

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)

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();

}

}

(14)

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();

}

(15)

webプログラミング入門

(16)

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)

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

(18)

サンプル

Webアプリケーション :

サンプルプロセス

(19)

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 user1

web.xml

JSF (

Myfaces)

faces-config.xml

jbpm.sar

Managed Bean

JSP

プロセス

インスタンス

(20)

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)

21 平成19年4月25日

jbpm.sar

JBoss Application Serverに組み込む場合に使用

JbpmConfigurationインスタンスを保持

jBPMをJBossと連携させるために必要

jBPM関係のjarファイル

DBの設定(hiberante.cfg.xml)

(22)

サンプル

Webアプリケーション :

フロー例

JBoss AS

Tomcat

JbpmContextFilter

JBoss jBPM

Hib

ernate

ActionHandler

JbpmConfiguration

user_name mgr_name isUrgentapproval 申請確定 Start-state End-state 品目入力 承認 item price token user1

JSF (

Myfaces)

faces-config.xml

Managed

Bean

JSP

プロセス

インスタンス

HTTPリクエスト

jbpmContext

の生成

jbpmContext

のクローズ

HTTPレスポンス

action="#{hogeBean.aMetho

d}"

HogeBean#aMethod(

)

プロセスの処理

HttpSession HttpReque st

戻り値

遷移先

(23)

サンプル

Webアプリ

ケーションの実習

(24)

サンプル

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)

25 平成19年4月25日

ログイン画面

(26)

webオーダー画面へ進む

(27)

27 平成19年4月25日

新しい

webオーダーの入力

プロセスの

状態

(28)

別ユーザでのログイン

Orderの承認はernieに依頼された。

ernieでログインする。

(29)

29 平成19年4月25日

Ernieのログイン画面

(30)

Orderのチェック

プロセスの

状態が変化!

(31)

webプログラミング入門

(32)

GPDを使ったプロセスの作成で行う内容

JBoss jBPM プロセスデザイナー(GDP)を使用したプロセスの

作成

タスク処理

プロセス変数・タスクインスタンス変数の処理

ユーザーのアサイン

JBoss jBPM プロセスデザイナーを使用したプロセスのデプロ

サンプル

Webアプリケーションがデプロイされた JBoss AS にプロセス

をデプロイ

作成・デプロイしたプロセスの実行

サンプル

Webアプリケーションに付属のプロセス管理画面の

紹介

(33)

33 平成19年4月25日

作成するプロセス

: HelloWorld プロセス

"cookie monster"

ユーザでログインし、プ

ロセス開始。プロセス

変数を設定

(msg)する。

"ernie" ユーザ

でログインし、

プロセス変数

(msg)を確認し

てタスクを終了

JBoss jBPMによ

り、タスクが

"ernie" ユーザ

にアサインされ

(34)

実習に必要なソフトウェアのインストール概要

1.

JDK のインストール

2.

Eclipse SDK のインストール

3.

JBoss jBPM スターターキットのインストール

4.

JBoss jBPM プロセスデザイナー(GPD)のインストール

5.

JBoss jBPM プロセスデザイナー(GPD)の設定

(35)

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

(36)

実習の準備

: 詳細 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)

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)

(38)

実習の準備

: 詳細 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)

39 平成19年4月25日

実習

: (1) Process Project の作成

Eclipseから

File

New

Other

JBoss jBPM

Process Project

Next

Project Name

HelloWorldProcess

Finish

(40)

実習

: (2) Process Definition(JPDL)の新規作成

Java Perspective

Package Explorer

HelloWorldProcess

プロジェクト

src/main/jpdl を右クリック

New

Other

JBoss jBPM

Process Definition

Process Name

HelloWorld

Finish

(41)

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で連結

(42)

実習

: (4) StartノードにTaskを追加

Startノードを右クリック

Add Task

Outline Viewを表示

taskを右クリック

Properties

Controller

Add

Name : msg

Read : チェック

Write : チェック

Required : チェック

OK

(43)

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 でプロセスを保存します

(44)

実習

: (6) プロセスのデプロイ

Deployment タブ

Server Deployer

(旧) /jbpm-console/upload

(新) /jbpm/upload

Test Connection

(45)

45 平成19年4月25日

実習

: (7) プロセスの実行 1/8

サンプルアプリにアクセス

http://localhost:8080/jbpm/

(46)

実習

: (7) プロセスの実行 2/8

(47)

47 平成19年4月25日

実習

: (7) プロセスの実行 3/8

msg フィールド(msg プロセス変数)に、

"Hello jBPM と入力"

"Save and Close Task"

ボタンを押してタクスを

終了させる

(48)

実習

: (7) プロセスの実行 4/8

自動的に

Home画面に戻る

ログアウトするために、

"Login as another

user"

(49)

49 平成19年4月25日

実習

: (7) プロセスの実行 5/8

(50)

実習

: (7) プロセスの実行 6/8

"Tasklist" に "task1" がリストされていること

を確認

(51)

51 平成19年4月25日

実習

: (7) プロセスの実行 7/8

msg フォームに、

"cookie monster"

ユーザが入力した文

字列が表示されてい

ることを確認

"Save and Close

Task" ボタンを押して

タクスを終了

(52)

実習

: (7) プロセスの実行 8/8

(53)

53 平成19年4月25日

実習

: (8) プロセス管理画面 1

(54)
(55)
(56)

購買申請アプリケーション

備品を購入するための申請・承認システム

登場人物:社員(申請者)、上司(承認者)

社員

購買申請処理

商品と値段の入力

承認する上司の選択

承認が緊急であるかどうかを入力

緊急の場合は、承認者にメールが自動送信される

申請履歴の参照

承認結果を参照

上司

申請の承認処理

承認結果は、申請者にメールで知らされる

(57)

57 平成19年4月25日

購買申請アプリケーションのユースケース

<上司:承認処理>

Step1 : システムにログイン

Step2 : 承認処理メニューへ進む

Step3 : 申請を承認するか否かを選択し、確定

承認結果が社員にメール送信される

Step4 : ログアウト

<社員:申請履歴参照>

Step1 : システムにログイン

Step2 : 購買申請履歴メニューへ進む

Step3 : 過去の申請IDを入力すると、申請のステー

タスが表示される

− 申請ID(プロセスID) − 品目、価格 − ステータス(承認済、未承認、却下)

Step4 : ログアウト

<社員:購買申請>

Step1 : システムにログイン

Step2 : 購買申請メニューへ進む

Step3 : 購買品目情報を入力し、次の画面へ

−品名、価格

Step4 : 次の情報を選択し、購買申請を送信

−承認依頼する上司 •外部システムにアクセスし、価格に応じて選択可能な上司の 一覧が表示される −緊急かどうか •緊急な場合は上司にメールが送信される

Step5 : 申請確認画面が表示される

−申請ID、品名、価格、上司名

Step6 : ログアウト

(58)

購買申請アプリケーション用

ビジネスプロセス

(59)

59 平成19年4月25日

購買申請アプリケーション全体図

プロセスインスタンス jbpmConfiguration

JVM

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 ログイン ログアウト ログイン ログアウト ログイン ログアウト

購買申請プログラム

申請履歴参照プログラム

承認プログラム

(60)

購買申請プログラム

申請内容確認画面が表示される •申請ID、品名、価格、上司名 Step1 : 購買申請メニューへ進む 購買品目情報を入力し、 次の画面へ •品名、価格 次の情報を選択し、購買申請 を送信 •承認依頼する上司 •緊急かどうか ログアウト

<社員:購買申請>

システムにログイン Step2 : Step3 : Step4 : Step5 : Step6 : 購買申請プログラム ユーザ"user1"でログイン ログアウト jbpmConte xt jbpmContext 取得 プロセスインスタンスの生成 トークンを取得 トークンにシグナルを送る プロセスインスタンスを保存 jbpmContext クローズ プロセス変数user_nameに ユーザ名user1を登録 user1に割り当てられた タスクを取得 申請情報を入力 user1に割り当てられた タスクを取得 申請依頼をする上司を選択 申請が緊急かどうかを選択 jbpmContext 取得 タスクを終了させる プロセスインスタンスを保存 jbpmContext クローズ jbpmContext 取得 タスクを終了させる プロセスインスタンスを保存 jbpmContext クローズ プロセスインスタンス jbpmConfiguration

JVM

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)

61 平成19年4月25日 ログアウト Step5 : Step6 :

購買申請アプリケーションの

Webアプリ化

システムにログイン 購買申請メニューへ進む 購買品目情報を入力 上司、緊急度を選択し購 買申請を送信 Step4 : 申請確認画面が表示さ れる プロセスインスタンス jbpmConfiguration

Tomcat

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 生成と 削除

(62)

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

Myfaces

faces-config.xml

(63)

63 平成19年4月25日 ログアウト Step5 : Step6 :

Step3 : 購買品目情報を入力

システムにログイン 購買申請メニューへ進む 購買品目情報を入力 上司、緊急度を選択し購 買申請を送信 Step4 : 申請確認画面が表示さ れる プロセスインスタンス jbpmConfiguration

Tomcat/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 緊急の場合 メール送信

(64)

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.html

HTTPレスポンス

user_confirm.html

品目と値段を

DTOに設定

JSF

Myfaces

戻り値の

user_confirmを

元に遷移先画面

(65)
(66)

参照資料

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)

67 平成19年4月25日

日本ヒューレット・パッカード株式会社の

JBoss/オープンソースに関連するURL

JBossのページ

http://www.hp.com/jp/jboss/

Open Source & Linuxのページ

(68)
(69)

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 抜粋

(70)

サンプル

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)

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>

クリック

(72)

サンプル

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)

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 抜粋

タスクインスタンス変数を取得

(74)

サンプル

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)

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";

(76)

サンプル

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)

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());

}

(78)

参照

関連したドキュメント

平成 28 年 7 月 4

第1回 平成27年6月11日 第2回 平成28年4月26日 第3回 平成28年6月24日 第4回 平成28年8月29日

[r]

・1事業所1登録:全てのEPAに対し共通( 有効期限:2年 ) ・登録申請書の作成⇒WEB上での電子申請( 手数料不要 )

【①宛名 ②購入金額 ③但し書き ④購入年月日

2011年(平成23年)4月 三遊亭 円丈に入門 2012年(平成24年)4月 前座となる 前座名「わん丈」.

更新 新許 許可 可申 申請 請書 書及 及び び 優 優良 良認 認定 定申 申請 請書 書提 提出

(申込締切)②助成部門 2017 年9月 30 日(土) ②学生インターン部門 2017 年7月 31