activiti中的事件处理器(EventHandler)

来源:互联网 发布:期货从业软件 编辑:程序博客网 时间:2024/05/02 02:16
  1. 全局事件处理器
    预先定义处理器分为两种:在引擎文件中定义和在流程文件中定义,都继承了org.activiti.engine.delegate.event.ActivitiEventListener
    1.在引擎文件中引用

Spring-activiti.xml文件中的配置

<bean id = "processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">     <property name="eventListeners">//eventListeners事件覆盖了全部事件            <list>                <bean class="im.java.workflow.activiti.listener.GlobalEventListener" /><!--继承了ActivitiEventListener-->            </list>        </property></bean>

im.java.workflow.activiti.listener.GlobalEventListener.java中

public class GlobalEventListener implements ActivitiEventListener { private static Logger log = LoggerFactory.getLogger(im.java.workflow.activiti.support.WfLogger.NAMW);     @Override    public void onEvent(ActivitiEvent event) {         log.info("流程事件信息【流程定义:{},流程实例:{},执行id:{},操作:{}】",                event.getProcessDefinitionId(),                event.getProcessInstanceId(),                event.getExecutionId(),                event.getType());          System.out.println("捕获事件类型:"+event.getType().name()+"type="+ToStringBuilder.reflectionToString(event);    }      @Override    public boolean isFailOnException() {        return LocalStorgeUtil.get().PROCESS_GLOBE_EVENT_LISTENER_FAILED;    }}
  1. 处理捕获事件
    在im.java.workflow.activiti.listener.GlobalEventListener.java中
public class GlobalEventListener implements ActivitiEventListener { private static Logger log = LoggerFactory.getLogger(im.java.workflow.activiti.support.WfLogger.NAMW);     @Override    public void onEvent(ActivitiEvent event) {         log.info("流程事件信息【流程定义:{},流程实例:{},执行id:{},操作:{}】",                event.getProcessDefinitionId(),                event.getProcessInstanceId(),                event.getExecutionId(),                event.getType());          System.out.println("捕获事件类型:"+event.getType().name()+"type="+ToStringBuilder.reflectionToString(event);          ActivitiEventType eventType = event.getType();          switch(eventType){              case:ENGINE_CREATE:                  System.out.println("流程初始化");                  break;              case:ENGINE_CLOSE:                  System.out.println("流程关闭");                  break;          }    }      @Override    public boolean isFailOnException() {        return LocalStorgeUtil.get().PROCESS_GLOBE_EVENT_LISTENER_FAILED;    }

动态注册事件处理
动态的维护事件处理池引擎开发的接口,在RuntimeService接口中使用以下几个方法:
void addEventListener(ActivitiEventListener listenerToAdd)
void addEventListener(ActivitiEventListener listenerToAdd ,ActivitiEventType type)
void removeEventListener(ActivitiEventListener listenerToAdd);
任务自动转办
1.使用任务的监听器来实现
在节点中添加任务的监听器组件

<userTask id="reportTask" name="出差" activiti:assignee="${applyUserId}">    <extensionElements>        <activiti:taskListener event="create" class="im.java.workflow.TaskAutoRedirectListener"/>    </extensionElements></userTask>

java代码

public class TaskAutoRedirectListener implements TaskListener{    private Static Map<String,String> userMap = new HashMap<String,String>();    static{userMap.put("kankang","mingming")};    @Override    public void notify(DelegateTask delegateTask){        String originAssginee = delegateTask.getAssignee();        String newUser = userMap.get(originAssginee);        if(StringUtil.isNotBlank(newUser)){            delegateTask.setAssignee(newUser);            EngineServices engineServices = delegateTask.getExecution().getEngineServices();            TaskService taskService = engineServices.getTaskService();            String message =getClass().getName()+"->任务【"delegateTask.getName()+"】办理人【"+originAssginee+"】自动转给【"+newUser+"】";            taskService.saveCommand(delegateTask.getId(),delegateTask.getProcessInstanceId(),"redirect",message);            }else{            }        }    }}

在全局监听器execute()方法中配置,更改销假任务中办理人的断言

String currentUserId = "kangkang";Task reportbaskTask = taskService.createTaskQuery().singleResult();List<Commant> taskComents = taskService.getTaskComments(reportbaskTask.getId(),"delegate");for(Comment comment in taskComments){    System.out.println(comment.getFullMessage());}assertEquals(currentUserId,reportbaskTask.getAssignee());

2.使用全局事件处理器

<property name = "typedEventListeners">    <map>        <entry key="TASK_CREATED">            <list>                <bean class="im.java.workflow.TaskAutoRedirectListener"/>            </list>        </entry>    </map></property>

im.java.workflow.TaskAutoRedirectListener.java中的代码

public class TaskAutoRedirectListerner implements ActivitEventListener{    private static Map<String,String> userMap = new HashMap<String,String>();    static{"kangkang","mingming"};    @Override    public void onEvent(ActivitiEvent event){        ActivitiEntityEvent entityEvent = (ActivitiEntityEvent)event;        Object entity = entiryEvent.getEntity();        if(entity instanceof TaskEntity){            TaskEntity task = (TaskEntity) entity;            String originUserId = task.getAssignee();            String newUserId = userMap.get(originUserId);            if(StringUtil.isNotBlank(newUserId)){                task.setAssignee(newUserId);            }        }    }}
0 0