jBPM関連Tips(タスク編)
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
] [
Twitter
]
開始行:
→jBPM Suite関連Tips
#contents
※以下のTipsは jBPM Ver.6.0.1(コミュニティ版)で調査した...
*関連Web [#bb4fd608]
-[[How to add users/groups to Human Task Service in BRMS ...
-[[How to implement a custom UserGroupCallback in BPM Sui...
-[[How to implement Task Event Listeners in BPM Suite 6.0...
*タスクからタスク変数を参照する [#j66e5531]
//このやり方で一応取得できるようですが、もっと簡単な方...
public Map<String, Object> getTaskVariable(KieSession k...
TaskService taskService, TaskSumm...
Task t = taskService.getTaskById(task.getId());
TaskData td = t.getTaskData();
long contentId = td.getDocumentContentId();
Content content = taskService.getContentById(contentI...
byte[] contBytes = content.getContent();
Environment env = ksession.getEnvironment();
@SuppressWarnings("unchecked")
Map<String, Object> data = (Map<String, Object>)
ContentMarshallerHelper.unmarshall(contBytes,...
return data;
}
-もっと簡単なやり方として、以下でも同じ効果がある
--TaskServiceをInternalTaskServiceにキャストする
--InternalTaskService#getTaskContent(taskId)を呼ぶ
-WorkItemを取得して getParameter でも良い。
-なおタスク変数を使うには、タスクノードのプロパティでタス...
・ioSpecification
・dataInputAssociation
・dataOutputAssociation
-タスク変数に独自の型(自分で作ったクラス)を指定したい場...
-似たやり方でWorkItemIdも取得できるが、このIDでWorkItemを...
public long getWorkItemIdFromTask(TaskService taskServi...
Task t = taskService.getTaskById(task.getId());
TaskData td = t.getTaskData();
long wid = td.getWorkItemId();
return wid;
}
-タスク変数のアウトプット側変数のセットは、TaskService#co...
-【重要】プロセス変数とタスク変数のInputでマップするとき...
*ヒューマンタスクからWorkItemを取得するには [#p0904e27]
-サンプルその1
@SuppressWarnings("restriction")
private void dispHumanTaskWorkItem(ProcessInstance proce...
WorkflowProcessInstance wpi = (WorkflowProcessInstance...
NodeInstance ni = wpi.getNodeInstance(tid);
if ( ni instanceof HumanTaskNodeInstance ) {
HumanTaskNodeInstance htni = (HumanTaskNodeInstance)...
WorkItem wi = htni.getWorkItem();
System.out.println("wi=" + wi.toString());
} else {
System.out.println("Not Human Task error");
}
}
-サンプルその2
@SuppressWarnings("restriction")
private void dispHumanTaskParams(ProcessInstance proces...
System.out.println("WorkItemによるparameter表示開始");
WorkflowProcessInstance wpi = (WorkflowProcessInstanc...
Collection<NodeInstance> ndis = wpi.getNodeInstances();
for( NodeInstance ni : ndis) {
if ( ni instanceof HumanTaskNodeInstance ) {
HumanTaskNodeInstance htni = (HumanTaskNodeInstan...
WorkItem wi = htni.getWorkItem();
Map<String,Object> prms = wi.getParameters();
for (String key : prms.keySet()) {
System.out.println(key + " = " + prms.get...
}
// 試しにこんなふうに パラメータ値をいじって...
// 実際にタスク定義している値には反映されな...
WorkItemImpl wip = (WorkItemImpl)wi;
wip.setParameter("GroupId", "admins"); // グ...
wip.setParameter("input1", "modified value");...
//htni.setVariable("GroupId", "admins"); // ...
}
}
System.out.println("WorkItemによる表示終了");
}
*ヒューマンタスクのWorkItemHandlerの実装は? [#t0746159]
-org.jbpm.services.task.wih.LocalHTWorkItemHandler
--RuntimeManagerで管理されているもの。これが本筋と見られる
-java.org.jbpm.services.task.wih.NonManagedLocalHTWorkIte...
--RuntimeManagerで管理されていないもの。互換のためにある...
*xmlファイルからのタスクパラメータの読み込み [#k444d18b]
-このあたりでやっている模様
--org.jbpm.bpmn2.xml.TaskHandler
*タスクのポテンシャルオーナーを追加するサンプル [#labf85ab]
-AssignmentServiceのソースが参考になる
-ただし、この方法で追加してもtaskService#getTaskByIdでタ...
package org.jbpm.services.task.internals.rule;
import java.util.List;
import org.kie.api.task.model.Group;
import org.kie.api.task.model.OrganizationalEntity;
import org.kie.api.task.model.Task;
import org.kie.internal.task.api.TaskModelProvider;
import org.kie.internal.task.api.model.InternalOrganizat...
public class AssignmentService {
public void assignTask(Task task) {
List<OrganizationalEntity> potentialOwners = tas...
potentialOwners.clear();
Group group = TaskModelProvider.getFactory().new...
((InternalOrganizationalEntity) group).setId("Cr...
potentialOwners.add(group);
}
}
*タスクの担当GroupID,ActorIDを動的に変更する方法 [#z049e0...
-プロセス定義の時点でGroupIDやActorIDに以下の書式でプロセ...
#{processVar}
-このprocessVarをプロセス変数として定義し、プログラムから...
*TaskService の実装解析メモ [#q61e7475]
-InternalTaskService は TaskService を実装しているが、こ...
-このインターフェイスは addGroup や addUser というメンバ...
-しかしこのメソッドは セッション全体に対するもので、タス...
-org.jbpm.runtime.manager.impl.task.SynchronizedTaskServi...
-実際の処理は CommandBasedTaskService でやっているが、Com...
-たとえば、 TaskService#activate メソッドの処理の実態は A...
-これをさらに手繰っていくと TaskInstanceServiceImpl#activ...
-この処理は LifeCycleManager というインターフェイスに渡さ...
-さらに同クラスの evalCommands > commands が呼ばれる
-実装の階層は
SynchronizedTaskService>InternalTaskService>TaskServi...
-参考:TaskService#claim を呼んだ場合のスタックトレースの...
at org.jbpm.services.task.internals.lifecycle.
MVELLifeCycleManager.evalCommand(MVELLifeCycleManager...
at org.jbpm.services.task.internals.lifecycle.
MVELLifeCycleManager.taskOperation(MVELLifeCycleManag...
at org.jbpm.services.task.identity.
UserGroupLifeCycleManagerDecorator.taskOperation(User...
at org.jbpm.services.task.impl.TaskInstanceServiceImpl.c...
at org.jbpm.services.task.commands.ClaimTaskCommand.exec...
at org.jbpm.services.task.commands.ClaimTaskCommand.exec...
at org.jbpm.services.task.commands.
TaskCommandExecutorImpl$SelfExecutionCommandService.exe...
at org.drools.core.command.impl.AbstractInterceptor.exec...
at org.jbpm.services.task.persistence.TaskTransactionInt...
at org.jbpm.services.task.commands.
TaskCommandExecutorImpl.execute(TaskCommandExecutorImpl...
at org.jbpm.services.task.impl.command.CommandBasedTaskS...
at org.jbpm.runtime.manager.impl.task.SynchronizedTaskSe...
at com.sample.ProcessTest.testProcess(ProcessTest.java:97)
*claimについて [#cb90c077]
-他のユーザがclaim済み(ステータス=Reserved)のタスクを他...
-メッセージの例
org.jbpm.services.task.exception.PermissionDeniedExcepti...
User '[UserImpl:'mary']' does not have permissions to
execution operation 'Start' on task id 1
-また、claim したユーザはそのタスクの ActualOwner に設定...
-同じユーザで2回claimするのもダメです。同様のエラーにな...
*delegateとforwardの違い [#va1e6d27]
-delegateは ActualOwner から任意の他のユーザーへActualOwn...
-delegateで引き継ぎ先に指定されたユーザーはポテンシャルオ...
-delegateの引き継ぎ元、引き継ぎ先にはグループは指定できな...
-delegateの引き継ぎ先ユーザーはタスクで候補指定されたグル...
-forwardはポテンシャルオーナー(ActorId)に登録されているユ...
-フォワード先のユーザーはActualOwnerにはならず、ポテンシ...
-フォワード元のユーザーはフォワードしたらポテンシャルオー...
-フォワード元のユーザーはプロセスのGroupIdに指定されたグ...
-フォワード先にグループも指定できる。ただしこのグループは...
-フォワード先にユーザーを指定する場合は、フォワード元のユ...
-フォワード元にグループは指定できない。
-つまり、delegateとforwardを組み合わせることによって、候...
*stop/releaseについて [#t90bad8e]
-stopは、startしてInProgressになっているタスクをReserved...
-ちなみに、ReservedからReadyに戻すにはreleaseする。(forwa...
終了行:
→jBPM Suite関連Tips
#contents
※以下のTipsは jBPM Ver.6.0.1(コミュニティ版)で調査した...
*関連Web [#bb4fd608]
-[[How to add users/groups to Human Task Service in BRMS ...
-[[How to implement a custom UserGroupCallback in BPM Sui...
-[[How to implement Task Event Listeners in BPM Suite 6.0...
*タスクからタスク変数を参照する [#j66e5531]
//このやり方で一応取得できるようですが、もっと簡単な方...
public Map<String, Object> getTaskVariable(KieSession k...
TaskService taskService, TaskSumm...
Task t = taskService.getTaskById(task.getId());
TaskData td = t.getTaskData();
long contentId = td.getDocumentContentId();
Content content = taskService.getContentById(contentI...
byte[] contBytes = content.getContent();
Environment env = ksession.getEnvironment();
@SuppressWarnings("unchecked")
Map<String, Object> data = (Map<String, Object>)
ContentMarshallerHelper.unmarshall(contBytes,...
return data;
}
-もっと簡単なやり方として、以下でも同じ効果がある
--TaskServiceをInternalTaskServiceにキャストする
--InternalTaskService#getTaskContent(taskId)を呼ぶ
-WorkItemを取得して getParameter でも良い。
-なおタスク変数を使うには、タスクノードのプロパティでタス...
・ioSpecification
・dataInputAssociation
・dataOutputAssociation
-タスク変数に独自の型(自分で作ったクラス)を指定したい場...
-似たやり方でWorkItemIdも取得できるが、このIDでWorkItemを...
public long getWorkItemIdFromTask(TaskService taskServi...
Task t = taskService.getTaskById(task.getId());
TaskData td = t.getTaskData();
long wid = td.getWorkItemId();
return wid;
}
-タスク変数のアウトプット側変数のセットは、TaskService#co...
-【重要】プロセス変数とタスク変数のInputでマップするとき...
*ヒューマンタスクからWorkItemを取得するには [#p0904e27]
-サンプルその1
@SuppressWarnings("restriction")
private void dispHumanTaskWorkItem(ProcessInstance proce...
WorkflowProcessInstance wpi = (WorkflowProcessInstance...
NodeInstance ni = wpi.getNodeInstance(tid);
if ( ni instanceof HumanTaskNodeInstance ) {
HumanTaskNodeInstance htni = (HumanTaskNodeInstance)...
WorkItem wi = htni.getWorkItem();
System.out.println("wi=" + wi.toString());
} else {
System.out.println("Not Human Task error");
}
}
-サンプルその2
@SuppressWarnings("restriction")
private void dispHumanTaskParams(ProcessInstance proces...
System.out.println("WorkItemによるparameter表示開始");
WorkflowProcessInstance wpi = (WorkflowProcessInstanc...
Collection<NodeInstance> ndis = wpi.getNodeInstances();
for( NodeInstance ni : ndis) {
if ( ni instanceof HumanTaskNodeInstance ) {
HumanTaskNodeInstance htni = (HumanTaskNodeInstan...
WorkItem wi = htni.getWorkItem();
Map<String,Object> prms = wi.getParameters();
for (String key : prms.keySet()) {
System.out.println(key + " = " + prms.get...
}
// 試しにこんなふうに パラメータ値をいじって...
// 実際にタスク定義している値には反映されな...
WorkItemImpl wip = (WorkItemImpl)wi;
wip.setParameter("GroupId", "admins"); // グ...
wip.setParameter("input1", "modified value");...
//htni.setVariable("GroupId", "admins"); // ...
}
}
System.out.println("WorkItemによる表示終了");
}
*ヒューマンタスクのWorkItemHandlerの実装は? [#t0746159]
-org.jbpm.services.task.wih.LocalHTWorkItemHandler
--RuntimeManagerで管理されているもの。これが本筋と見られる
-java.org.jbpm.services.task.wih.NonManagedLocalHTWorkIte...
--RuntimeManagerで管理されていないもの。互換のためにある...
*xmlファイルからのタスクパラメータの読み込み [#k444d18b]
-このあたりでやっている模様
--org.jbpm.bpmn2.xml.TaskHandler
*タスクのポテンシャルオーナーを追加するサンプル [#labf85ab]
-AssignmentServiceのソースが参考になる
-ただし、この方法で追加してもtaskService#getTaskByIdでタ...
package org.jbpm.services.task.internals.rule;
import java.util.List;
import org.kie.api.task.model.Group;
import org.kie.api.task.model.OrganizationalEntity;
import org.kie.api.task.model.Task;
import org.kie.internal.task.api.TaskModelProvider;
import org.kie.internal.task.api.model.InternalOrganizat...
public class AssignmentService {
public void assignTask(Task task) {
List<OrganizationalEntity> potentialOwners = tas...
potentialOwners.clear();
Group group = TaskModelProvider.getFactory().new...
((InternalOrganizationalEntity) group).setId("Cr...
potentialOwners.add(group);
}
}
*タスクの担当GroupID,ActorIDを動的に変更する方法 [#z049e0...
-プロセス定義の時点でGroupIDやActorIDに以下の書式でプロセ...
#{processVar}
-このprocessVarをプロセス変数として定義し、プログラムから...
*TaskService の実装解析メモ [#q61e7475]
-InternalTaskService は TaskService を実装しているが、こ...
-このインターフェイスは addGroup や addUser というメンバ...
-しかしこのメソッドは セッション全体に対するもので、タス...
-org.jbpm.runtime.manager.impl.task.SynchronizedTaskServi...
-実際の処理は CommandBasedTaskService でやっているが、Com...
-たとえば、 TaskService#activate メソッドの処理の実態は A...
-これをさらに手繰っていくと TaskInstanceServiceImpl#activ...
-この処理は LifeCycleManager というインターフェイスに渡さ...
-さらに同クラスの evalCommands > commands が呼ばれる
-実装の階層は
SynchronizedTaskService>InternalTaskService>TaskServi...
-参考:TaskService#claim を呼んだ場合のスタックトレースの...
at org.jbpm.services.task.internals.lifecycle.
MVELLifeCycleManager.evalCommand(MVELLifeCycleManager...
at org.jbpm.services.task.internals.lifecycle.
MVELLifeCycleManager.taskOperation(MVELLifeCycleManag...
at org.jbpm.services.task.identity.
UserGroupLifeCycleManagerDecorator.taskOperation(User...
at org.jbpm.services.task.impl.TaskInstanceServiceImpl.c...
at org.jbpm.services.task.commands.ClaimTaskCommand.exec...
at org.jbpm.services.task.commands.ClaimTaskCommand.exec...
at org.jbpm.services.task.commands.
TaskCommandExecutorImpl$SelfExecutionCommandService.exe...
at org.drools.core.command.impl.AbstractInterceptor.exec...
at org.jbpm.services.task.persistence.TaskTransactionInt...
at org.jbpm.services.task.commands.
TaskCommandExecutorImpl.execute(TaskCommandExecutorImpl...
at org.jbpm.services.task.impl.command.CommandBasedTaskS...
at org.jbpm.runtime.manager.impl.task.SynchronizedTaskSe...
at com.sample.ProcessTest.testProcess(ProcessTest.java:97)
*claimについて [#cb90c077]
-他のユーザがclaim済み(ステータス=Reserved)のタスクを他...
-メッセージの例
org.jbpm.services.task.exception.PermissionDeniedExcepti...
User '[UserImpl:'mary']' does not have permissions to
execution operation 'Start' on task id 1
-また、claim したユーザはそのタスクの ActualOwner に設定...
-同じユーザで2回claimするのもダメです。同様のエラーにな...
*delegateとforwardの違い [#va1e6d27]
-delegateは ActualOwner から任意の他のユーザーへActualOwn...
-delegateで引き継ぎ先に指定されたユーザーはポテンシャルオ...
-delegateの引き継ぎ元、引き継ぎ先にはグループは指定できな...
-delegateの引き継ぎ先ユーザーはタスクで候補指定されたグル...
-forwardはポテンシャルオーナー(ActorId)に登録されているユ...
-フォワード先のユーザーはActualOwnerにはならず、ポテンシ...
-フォワード元のユーザーはフォワードしたらポテンシャルオー...
-フォワード元のユーザーはプロセスのGroupIdに指定されたグ...
-フォワード先にグループも指定できる。ただしこのグループは...
-フォワード先にユーザーを指定する場合は、フォワード元のユ...
-フォワード元にグループは指定できない。
-つまり、delegateとforwardを組み合わせることによって、候...
*stop/releaseについて [#t90bad8e]
-stopは、startしてInProgressになっているタスクをReserved...
-ちなみに、ReservedからReadyに戻すにはreleaseする。(forwa...
ページ名: