JBPM4.4 实现并发(fork -join)和事件监听(event-Listenner) 实现会签功能

想验证一下 JBPM 中的并发和事件监听,于是想了一个实现员工申请购买物品的会签功能。

需要员工所在部门manager,HR_manager,Planning_manager,Purchasing_manager 四个人都同意了就可以获得申请。

在四个manager可以按照任意的顺序来批准该购买申请。

当四个manager 都批准后,任务流转到提出申请的员工,让该员工确认这次申请成功。

为了能够追踪到工作流流转的情况,实现了事件监听机制,每完成一个任务,系统都会给申请人发送一条内部信件。

以下是jbpm.xml 文件内容,在这里,只实现了任务申请人发送了一封提醒邮件和向四个manager 各自发送一封提醒邮件,提示有待办任务需要他们去完成。

<?xml version="1.0" encoding="UTF-8"?>

<process name="Async" xmlns="http://jbpm.org/4.4/jpdl">
<start g="415,17,48,48" name="start1">
<transition to="applyPurchase"/>
</start>
<task assignee="#{purchase_Owner}" form="/SSH/LeaveJSP/Async/purchase_add.jsp" g="397,95,92,52" name="applyPurchase">
<on event="end">
<event-listener class="com.util.PurchaseEventListenner">
<field name="taskMsg"><string value="start on process definition"/></field>
</event-listener>
</on>
<transition to="fork1"/>

</task>
<fork g="424,180,48,48" name="fork1">

<transition to="manager_aprove">

</transition>
<transition to="planning_aprove"/>
<transition to="purchasing_aprove"/>
<transition to="hr_aprove"/>
</fork>
<join g="434,385,48,48" name="join1">
<transition name="to task1" to="task1" g="-44,-18"/>
</join>
<task assignee="#{purchase_manager}" form="leaveAction!to_purchase_manager.action" g="233,279,92,52" name="manager_aprove">
<transition name="to_join1" to="join1" g="-41,-18"/>
</task>
<task assignee="#{purchasing_manager}" form="leaveAction!to_purchasing_manager.action" g="347,283,92,52" name="planning_aprove">
<transition name="to_join1" to="join1" g="-41,-18"/>
</task>
<task assignee="#{planning_manager}" form="leaveAction!to_planning_manager.action" g="453,283,92,52" name="purchasing_aprove">
<transition name="to_join1" to="join1" g="-41,-18"/>
</task>
<task assignee="#{hr_manager}" form="leaveAction!to_hr_manager.action" g="562,284,92,52" name="hr_aprove">
<transition name="to_join1" to="join1" g="-41,-18"/>
</task>
<task name="task1" g="420,474,92,52" assignee="#{purchase_Owner}" form="leaveAction!to_confirm_purchase.action">
<transition name="toend1" to="end1" g="-42,-18"/>
</task>
<end name="end1" g="443,536,48,48"/>
</process>

时间监听类的代码:

PurchaseEventListenner.java

package com.util;

import java.util.Calendar;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.jbpm.api.ProcessEngine;
import org.jbpm.api.TaskService;
import org.jbpm.api.history.HistoryTask;
import org.jbpm.api.listener.EventListener;
import org.jbpm.api.listener.EventListenerExecution;
import org.jbpm.pvm.internal.history.model.HistoryTaskImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.dao.MessageDao;
import com.model.Message;
import com.model.User;
import com.opensymphony.xwork2.ActionContext;
import com.service.MessageService;
import com.service.UserService;
import com.service.imp.MessageServiceImp;
import com.service.imp.UserServiceImp;

public class PurchaseEventListenner implements EventListener{

/**
*
*/
private static final long serialVersionUID = 1L;
private String taskMsg;
private Message message;
private MessageDao messageDao;
private MessageService messageService;
private UserService userService;
private ProcessEngine processEngine;
private HttpSession httpSession;
private TaskService taskService;;



@Override
public void notify(EventListenerExecution execution) throws Exception {

Map session=ActionContext.getContext().getSession();
User user=(User)session.get("user");
processEngine=(ProcessEngine)session.get("processEngine");
if(processEngine==null){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
processEngine=(ProcessEngine) context.getBean("processEngine");
messageService=(MessageService)context.getBean("messageService");

}
messageService=(MessageServiceImp)session.get("messageService");
userService=(UserServiceImp)session.get("userService");

String applyUserName="";
message=new Message();


String purchase_manager=(String) execution.getVariable("purchase_manager");
String purchasing_manager=(String) execution.getVariable("purchasing_manager");
String planning_manager=(String) execution.getVariable("planning_manager");
String hr_manager=(String) execution.getVariable("hr_manager");















message.setFromAccess(true);
message.setFromUser(user);
message.setGroupOrPerson(Message.Message_person);
message.setImportLevel(3);
message.setMsg(user.getUsername()+" : you have apply a purchasing application"+"--------------"+taskMsg);
message.setTitle(taskMsg);
message.setToAccess(true);
message.setMessageType("unread");
Calendar cc=Calendar.getInstance();
message.setSendDate(cc.getTime());
/// message.setToDepa rtment(toDepartment);
message.setToUser(user);
messageService.saveMessage(message);
// send a message to user who apply this application

message.setToUser(userService.findUserByName(purchase_manager));
message.setMsg("you have a purchasing application to approve ....from "+user.getUsername());
messageService.saveMessage(message);
// send a message to manager













//send a message to purchasing_manager
Message message1=new Message();
message1.setToUser(userService.findUserByName(purchasing_manager));
message1.setFromAccess(true);
message1.setFromUser(user);
message1.setGroupOrPerson(Message.Message_person);
message1.setImportLevel(3);
message1.setMsg("you have a purchasing application to approve ....from "+user.getUsername());
message1.setTitle(taskMsg);
message1.setToAccess(true);
message1.setMessageType("unread");
message1.setSendDate(cc.getTime());
messageService.saveMessage(message1);




//send a message to purchasing_manager
Message message2=new Message();
message2.setToUser(userService.findUserByName(planning_manager));
message2.setFromAccess(true);
message2.setFromUser(user);
message2.setGroupOrPerson(Message.Message_person);
message2.setImportLevel(3);
message2.setMsg("you have a purchasing application to approve ....from "+user.getUsername());
message2.setTitle(taskMsg);
message2.setToAccess(true);
message2.setMessageType("unread");
message2.setSendDate(cc.getTime());
messageService.saveMessage(message2);


//send a message to purchasing_manager
Message message3=new Message();
message3.setToUser(userService.findUserByName(hr_manager));
message3.setFromAccess(true);
message3.setFromUser(user);
message3.setGroupOrPerson(Message.Message_person);
message3.setImportLevel(3);
message3.setMsg("you have a purchasing application to approve ....from "+user.getUsername());
message3.setTitle(taskMsg);
message3.setToAccess(true);
message3.setMessageType("unread");
message3.setSendDate(cc.getTime());
messageService.saveMessage(message3);


Message message4=new Message();
message4.setToUser(userService.findUserByName(purchase_manager));
message4.setFromAccess(true);
message4.setFromUser(user);
message4.setGroupOrPerson(Message.Message_person);
message4.setImportLevel(3);
message4.setMsg("you have a purchasing application to approve ....from "+user.getUsername());
message4.setTitle(taskMsg);
message4.setToAccess(true);
message4.setMessageType("unread");
message4.setSendDate(cc.getTime());
messageService.saveMessage(message4);

//send a message to planning_manager
System.out.println("taskMsg----------------"+taskMsg);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值