我编写了一个自定义JBPM工作流,某些任务必须向指定用户发送通知。
我知道如何使用自定义java操作或简单的javascript,但我尝试使用标志bpm_sendEMailNotifications:如果此标志为true,则类org.alfresco.repo.workflow.jbpm.AlfrescoAssignment会自动发送使用实用程序类org.alfresco.repo.workflow.WorkflowNotificationUtils的通知。
例如,我的工作流定义中的以下任务在创建任务时将标志设置为true。
<task-node name="finalReview">
<task name="mswf:reviewTask">
<assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
<pooledactors>#{finalReviewReviewer}</pooledactors>
</assignment>
<event type="task-create">
<script>
executionContext.setVariable("bpm_sendEMailNotifications", true);
</script>
</event>
</task>
<transition name="approve" to="endFinalReview"/>
<transition name="reject" to="endFinalReview"/>
</task-node>
因为,当分配任务时,此标志为true,AlfrescoAssignment会尝试发送通知。
不幸的是,转换到此任务节点失败,出现以下异常: &#34; 07052361使用id =&#39; jbpm $ 200957&#39;访问任务用户&#39; atc1&#39;&#34;
不允许使用atc1是单击转换按钮的用户,而不是分配给该任务的当前用户。
WorkflowNotificationUtils类在尝试获取WorkflowTask时抛出异常(在Alfresco企业版4.1.7的第168行,即sendWorkflowAssignedNotificationEMail()方法的第一行):
WorkflowTask workflowTask = services.getWorkflowService().getTaskById(taskId);
我已验证该任务已按预期分配给其他用户。
我希望有人知道这个解决方案有什么问题。与此同时,我将尝试将此标志与vanilla工作流一起使用,以查看它是否也失败。
答案 0 :(得分:0)
一种可能的解决方案是使用自定义AlfrescoAssigment,其中发送电子邮件通知的代码在runAs中执行:
AuthenticationUtil.runAs(new RunAsWork<Void>() {
public Void doWork() throws Exception {
//
// make the assignment
//
Boolean sendEMailNotification = (Boolean)finalExecutionContext.getVariable(WorkflowNotificationUtils.PROP_SEND_EMAIL_NOTIFICATIONS);
if (finalAssignedActor != null)
{
assignable.setActorId(finalAssignedActor);
if (Boolean.TRUE.equals(sendEMailNotification) == true)
{
// Send the notification
WorkflowNotificationUtils.sendWorkflowAssignedNotificationEMail(
services,
JBPMEngine.ENGINE_ID + "$" + finalExecutionContext.getTaskInstance().getId(),
finalAssignedActor,
false);
}
}
if (finalAssignedPooledActors != null)
{
assignable.setPooledActors(finalAssignedPooledActors);
if (Boolean.TRUE.equals(sendEMailNotification) == true)
{
// Send the notification
WorkflowNotificationUtils.sendWorkflowAssignedNotificationEMail(
services,
JBPMEngine.ENGINE_ID + "$" + finalExecutionContext.getTaskInstance().getId(),
finalAssignedPooledActors,
true);
}
}
return null;
}
}, AuthenticationUtil.getSystemUserName());