BEA ホーム | 製品 | デベロッパ・センタ | support | askBEA
 ドキュメントのダウンロード   サイト マップ   用語集 
検索

BPM クライアント アプリケーション プログラミング

 前 次 目次 索引 PDFで表示  

手動によるワークフローの開始

この章では、ワークフローを手動で開始する方法について説明します。内容は以下のとおりです。

注意: ワークフローの開始は、外部またはタイムアウト イベント、または 1 つのワークフローを別のワークフローから開始する ワークフロー開始アクション ActionStartWorkflow のいずれかのメカニズムを使って自動化することもできます。後者のメソッドでは、呼び出したワークフローがこれまでに開始されたかどうかをビジネス ルールを使って判断できるため、制御の幅が広くなります。またこのメカニズムにより、XML の内容を使用する変数の設定、および複数のワークフローの開始が可能になります。ワークフローの開始に使用できるアクションの詳細については、テンプレート定義 DTD、または『WebLogic Integration Worklist ユーザーズ ガイド』の「アクションの定義」を参照してください。

WebLogic Integration Worklist を使ってワークフローを手動で開始する場合の説明は、『WebLogic Integration Worklist ユーザーズ ガイド』の「ワークフローを使った作業」を参照してください。

注意: Worklist クライアント アプリケーションは、このリリースの WebLogic Integration からは非推奨になります。Worklist クライアント アプリケーションに代わる機能については、『WebLogic Integration リリース ノート』を参照してください。

 


開始可能なワークフローの取得

ワークリストまたはカスタムの実行時管理クライアントから手動で開始可能なすべてのワークリストを取得するには、次の com.bea.wlpi.server.worklist.Worklist メソッドを使用します。

public java.util.List getStartableWorkflows( 
java.lang.String orgId
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException

getStartableWorkflows() メソッドのパラメータを次の表に示します。

表20-1 getStartableWorkflows() メソッドのパラメータ

パラメータ

説明

有効な値

orgId

開始可能なワークフローの名前を取得するオーガニゼーションの ID

有効なオーガニゼーション ID を指定する文字列。

すべてのオーガニゼーション ID のリストの取得方法については、アクティブなオーガニゼーションの管理を参照。


 

このメソッドは、以下の com.bea.wlpi.common.TemplateInfo オブジェクトのリストを返します。

そのテンプレート定義情報にアクセスするには、TemplateInfo オブジェクトに記載の TemplateInfo オブジェクトのメソッドを使用します。

たとえば、次のコードでは、オーガニゼーション ID の ORG1 で指定したオーガニゼーションに対して開始可能なすべてのワークフローのリストが取得されます。このコード例では、worklistWorklist EJB への EJBObject 参照を表します。

List template = worklist.getStartableWorkflows(“ORG1”);

getStartableWorkflows() メソッドの詳細については、Javadoc の com.bea.wlpi.server.worklist.Worklist を参照してください。

 


手動によるワークフローの開始

ワークフローを手動で開始するには、以下のいずれかの com.bea.wlpi.server.worklist.Worklist メソッドを使用します。

メソッド 1

public java.lang.String instantiateWorkflow( 
java.lang.String orgId,
java.lang.String templateId
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException

メソッド 2

public java.lang.String instantiateWorkflow( 
java.lang.String orgId,
java.lang.String templateId,
java.lang.String xml,
java.util.Map initialValues,
java.util.Map pluginData
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException

メソッド 3

public java.lang.String instantiateWorkflow( 
java.lang.String orgId,
java.lang.String templateId,
java.lang.Object transactionId
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException

メソッド 4

public java.lang.String instantiateWorkflow( 
java.lang.String orgId,
java.lang.String templateId,
java.lang.String xml,
java.util.Map initialValues,
java.util.Map pluginData,
java.lang.Object transactionId
) throws java.rmi.RemoteException,
com.bea.wlpi.common.WorkflowException

第 1 のメソッドは、非クラスタ化環境で使用できます。クラスタ化環境では第 2 のメソッドを使用することをお勧めします。この場合、トランザクションがコミットされた後、またはサーバ クラッシュやフェイル オーバーが発生した後に、メソッドが再発行されないよう、指定された ID を使用してメソッドの実行状態が追跡されます。

instantiateWorkflow() メソッドのパラメータを次の表に示します。

表20-2 instantiateWorkflow() メソッドのパラメータ

パラメータ

説明

有効な値

orgId

ユーザが開始するワークフローに関連したオーガニゼーションの ID

有効なオーガニゼーション ID を指定する文字列。

すべてのオーガニゼーション ID のリストの取得方法については、アクティブなオーガニゼーションの管理を参照。

templateId

ワークフローを開始するワークフロー テンプレートの ID

有効なテンプレート ID を指定する文字列。

テンプレート ID を取得するには、次の com.bea.wlpi.common.TemplateInfo メソッドを使用する。

public final String getId()

getId() メソッドは、templateId を返す。各 templateId には、複数の定義が含まれる可能性がある。どのテンプレート定義を使用するか判断するために、WebLogic Integration はアクティブ テンプレート定義セットの中から、もっとも有効で適切な日付(現在または過去の日付)と終了日(現在または将来の日付)を持つバージョンを選択する。テンプレート定義に有効日および終了日を定義し、テンプレート定義をアクティブ化する方法については、テンプレート定義 DTD、または『WebLogic Integration Studio ユーザーズ ガイド』を参照。

TemplateInfo オブジェクトを取得する方法については、オーガニゼーションのテンプレートの取得を参照。TemplateInfo オブジェクトで選択可能なメソッドの詳細については、TemplateInfo オブジェクトを参照。

xml

ワークフロー インスタンスの初期設定値

ワークフロー インスタンスに有意な初期設定値を含む XML ドキュメント。初期設定値が不要の場合は null。

initialValues

ワークフロー変数の初期値

キーとして初期設定される変数、および値として必要な値を指定する「key-value」ペアを持つマップ オブジェクト。変数の初期設定が不要の場合は null を指定するマップ オブジェクト。

pluginData

プラグイン インスタンス データ

キーとしてプラグイン名を指定し、および値としてインスタンス データを指定する「key-value」ペアを持つマップ オブジェクト。プラグイン データの定義が不要な場合は、null を指定するマップ オブジェクト。

BPM プラグインのプログラミングの詳細については、『WebLogic Integration BPM プラグイン プログラミング ガイド』を参照。

transactionId

トランザクションの ID

注意: このパラメータは、クラスタ化環境においてのみ必要です。

ユニークなトランザクション ID を指定するオブジェクト。

ユニークなトランザクション ID を生成するには、次のコンストラクタを使用して新しい com.bea.wlpi.client.common.GUID オブジェクトを作成する。

GUID transactionId = new GUID();

GUID クラスの詳細については、Javadoc の com.bea.wlpi.client.common.GUID を参照。


 

instantiateWorkflow() メソッドは、ワークフロー テンプレートの呼び出しの他に、テンプレート定義の中でリストアップされているそれぞれの手動による Start (開始) ノードに対し、テンプレート定義内で指定されている場合に、以下のタスクを実行します。

テンプレート定義の作成、および呼び出し時に実行するタスクの定義については、ワークフロー テンプレート定義の作成および管理を参照してください。

instantiateWorkflow() メソッドは、クライアント要求 DTD に準拠し、また以下のそれぞれのテンプレート定義インスタンスの情報を含む XML ドキュメントを返します。

クライアント要求 DTD の詳細については、クライアント要求 DTDを参照してください。

たとえば、次のコードでは、activeOrgId および templateId の変数で指定されたオーガニゼーションに対して、テンプレート定義が呼び出されます。このコード例では、worklistWorklist EJB への EJBObject 参照を表します。

String clientReq = worklist.instantiateWorkflow(activeOrgId, templateId);

複数のテンプレート定義が同じ templateId で表されている場合、WebLogic Integration はアクティブで、また有効日および終了日がもっとも適切なバージョンを選択します。

instantiateWorkflows() メソッドの詳細については、Javadoc の com.bea.wlpi.server.worklist.Worklist を参照してください。

 


手動によるワークフロー開始のサンプル

この節では、コマンドラインおよび JSP Worklist サンプルから抜粋して、ワークフローを手動で開始する方法を示します。

注意: コマンドラインおよび JSP Worklist サンプルの詳細については、BPM API のサンプルを参照してください。

コマンドラインの Worklist サンプル

ワークフローの開始方法を示すコマンドライン Worklist サンプルから抜粋したものを以下に示します。

注意: コマンドライン Worklist サンプルの詳細については、コマンドライン Worklist サンプルを参照してください。

このサンプルでは、ユーザと通信するための入力ストリームが定義されており、ユーザは以下のアクションのいずれかを指定するよう求められます。

重要なコード行は、太字で強調されています。このコード例では、worklistWorklist EJB への EJBObject 参照を表します。

/* ユーザとの通信のための入力ストリームを作成する */
stdIn = new BufferedReader( new InputStreamReader( System.in ) );

/* ツール タイトルを表示する */
System.out.print( "¥n--- Command Line Worklist v1.2 ---" );

/* メイン メニューを表示してユーザと交信する */
while( true ) {
/* メニューを表示する */
System.out.println( "¥n--- Main Menu ---" );
System.out.println( "¥nEnter choice:" );
System.out.println( "1) Organizations" );
System.out.println( "2) Workflows" );
System.out.println( "3) Tasks" );
System.out.println( "Q) Quit" );
System.out.print( ">> " );
.
.
.
public static void mngWorkflows( ) {
String templateId;

/* ユーザとの通信のための入力ストリームを作成する */
BufferedReader stdIn = new BufferedReader(
new InputStreamReader( System.in ) );

try {
/* メイン メニューを表示してユーザと交信する */
while( true ) {
/* メニューを表示する */
System.out.println( "¥n¥n--- Workflows ---" );
System.out.println( "¥nEnter choice:" );
System.out.println( "1) List Startable workflow templates" );
System.out.println( "2) Start a workflow" );
System.out.println( "B) Back to previous menu" );
System.out.println( "Q) Quit" );
System.out.print( ">> " );

/* ユーザの選択を取得する */
String line = stdIn.readLine( );

/* ユーザが選択を行わないで〔Enter〕を押したか ? */
if( line.equals( "" ) )
continue;
/* ユーザが複数の文字を入力したか ? */
else if( line.length( ) > 1 ) {
System.out.println( "*** Invalid choice" );
continue;
}

/* 大文字および文字へのコンバート*/
char choice = line.toUpperCase( ).charAt( 0 );

/* ユーザの選択を処理する */
switch( choice ) { ...

開始可能なワークフローを取得する

開始可能なワークフローのリストを取得する方法を示します。

         /*開始可能なワークフロー テンプレートをリストアップする */
case '1' :
/* WLPI 公開 API メソッド */
/* 注意 : 発生した例外を取り込むコードを
* 追加するとよい */
String activeOrgId = worklist.getActiveOrganization( );
List templateList;

/* WLPI 公開 API メソッド */
/* 注意 : 発生した例外を取り込むコードを
* 追加するとよい */
templateList = worklist.getStartableWorkflows( activeOrgId );

/* 開始可能なワークフローがあるか ? */
if( templateList.size( ) == 0 )
System.out.println( "¥nNo Startable Workflows." );
else
System.out.println( "¥nStartable Workflows:" );

/* リストを処理して、開始可能なワークフローを表示する */
for( int i = 0; i < templateList.size( ); i++ ) {
/* リストから要素を取り出す */
TemplateInfo templateInfo = (
TemplateInfo )templateList.get( i );

/* テンプレート ID と名前を取り出して表示する */
System.out.println( "- ID: " + templateInfo.getId( ) +
" Name: " + templateInfo.getName( ) );
}
break; ...

ワークフローを手動で開始する

ワークフローを手動で開始する方法を示します。

         /* ワークフロー テンプレートのインスタンス化 */
case '2' :
/* インストタンス化するワークフローのテンプレート ID を取得する */
if( ( templateId = askQuestion(
"¥nEnter Workflow Template ID" ) ) == null ) {
/* ユーザによる操作の取り消し */
System.out.println( "*** Cancelled" );
break;
}

try {
/* WLPI 公開 API メソッド */
/* アクティブなオーガニゼーション ID を取り出す */
activeOrgId = worklist.getActiveOrganization( );

/* WLPI 公開 API メソッド */
/* ワークフローをインスタンス化する */
String clientReq = worklist.instantiateWorkflow(
activeOrgId, templateId );

/* 正常終了(例外の発生なし) */
System.out.println( "- Success" );
// System.out.println( "- Client Request:¥n" + clientReq );

/* クライアントの要求 (もしあれば) を処理するために、
* サーバからの応答を解析する */
parser.handleRequest( clientReq );
}
catch( Exception e ) {
System.out.println(
"*** Failed to instantiate Workflow Template (ID: " +
templateId + ")" );
System.err.println( e );
}
break;

/* 前のメニューに戻る */
case 'B' :
return;

/* ツールを終了 */
case 'Q' :
/* サーバから切断 */
disconnect( );
System.exit( 1 );

default:
System.out.println( "*** Invalid choice" );
}
}
}
/* 「Unhandled」例外 */
catch( Exception e ) {
System.err.println( e );
}
return;
}

JSP Worklist サンプル

ここでは、JSP Worklist サンプルの抜粋から、ワークフローを手動で開始する方法を示します。

重要なコード行は、太字で強調されています。このコード例では、worklistWorklist EJB への EJBObject 参照を表します。

JSP Worklist へのプライマリ インタフェースの図に示すように、ユーザが JSP Worklist 内の Start Workflow リンクをクリックして、開始可能なワークフローを選択すると、ワークフローが開始されます。次のように、Start Workflow リンクは startworkflow.jsp ファイルを参照します。

<a href=“startworkflow.jsp”><font color= “white”>Start Workflow</font></a>

次のサンプルでは、JSP Worklist サンプル内の startworkflow.jsp ファイルの抜粋から、ワークフローの開始方法を示します。

<%@ page import="
javax.ejb.*,
java.rmi.RemoteException,
java.util.*,
com.bea.wlpi.common.*
com.bea.wlpi.server.worklist.*
" session="true"%>

<jsp:usebean id="responseParser" class="jsp_servlet._worklist.ResponseParser" scope="session"/>

<%
Worklist worklist = null;
String name;
String error = null;
String currentOrg = (String)session.getValue("currentOrg");
worklist = (Worklist)session.getValue("worklist");
name = (String)session.getValue("name");

if (worklist != null) {
Hashtable h = new Hashtable();
h.put(javax.naming.Context.SECURITY_PRINCIPAL, name);
h.put(javax.naming.Context.SECURITY_CREDENTIALS,
(String)session.getValue("password"));
new javax.naming.InitialContext(h);

start 変数は、ユーザが開始するワークフロー テンプレート定義のテンプレート ID を格納するために使用されます。始めに JSP がロードされると、start 変数はnull に設定され、開始ワークフローの try ループはスキップされます。次に、開始可能なワークフローがリストされます。ユーザが開始可能なワークフローを選択すると、startworkflow.jsp ファイルが呼び出され、その start 変数は、TemplateInfo オブジェクトから取得するテンプレート ID の値に設定されます。結果の XML ファイル(これはクライアント要求 DTDに準拠)は、instantiateWorkflow() メソッドの呼出しから返され、解析のためにレスポンス パーサーの ResponseParser に渡されます。レスポンス パーサーの詳細については、タスクを割り当てるを参照してください。

      /* 開始パラメータが設定された場合にワークフローを開始する */
String start = request.getParameter("start");
if (start != null)
try {
responseParser.parse(worklist.instantiateWorkflow(
currentOrg, start));
session.removeValue("error");
if (responseParser.isQuery())
pageContext.forward("query.jsp");
else
pageContext.forward("worklist.jsp");
return;
} catch (Exception e) {
error = e.getMessage();
} out.println(error);
%>
<html>
<title>eProcess Integrator</title>
<head>
</head>

<body bgcolor=#ffffff>
<font face="Arial" size="4">


<table dir="ltr" border="0" cellpadding="1" cellspacing="1">
<tr>
<td><img src="logo.gif"></td>
<td>
<font color="red" size="7"><strong><em>Weblogic</em></strong></font>
<font color="black" size="7"><strong><em>Process Integrator
</em></strong></font></td>
</tr>
<tr>
<td bgcolor="navy" valign="top">
<table dir="ltr" border="0" cellpadding="2" cellspacing="2" >
<tr>
<td><font color="yellow"><strong>Go ...</strong></font></td>
</tr>
<tr>
<td><a href="worklist.jsp?worklist">
<font color="white">Worklist</font></a></td>
</tr>
<tr>
<td><a href="logoff.jsp"><font color="white">Logoff</font></a></td>
</tr>
</table>
</td>

<td valign="top">
<table dir="ltr" border="0" cellpadding="2" cellspacing="2" valign="top">
<tr>
<td><font color="navy" size="5" face="Arial">
Start Workflow</font></td>
</tr>

開始可能なワークフローがリストされます。ユーザが開始可能なワークフローを選択すると、startworkflow.jsp ファイルが呼び出され、その start 変数は、TemplateInfo オブジェクトから取得するテンプレート ID の値に設定されます。

/* 開始可能なワークフロー名を取得し、それらをリストアップする /*
<%
try {
List templates = worklist.getStartableWorkflows(currentOrg);
for (int i = 0; i < templates.size(); i++) {
TemplateInfo info = (TemplateInfo)templates.get(i);
%>
<tr>
<td><a href="startworkflow.jsp?start=<%=info.getId()%>">
<%=info.getName()%></a></td>
</tr>
<%
}
} catch (Exception e) {
out.print("Error 3: " + e);
}
}
%>
</table>
</td>
</tr>
</table>
</font>
</body>
</html>

 

ページの先頭 前 次