热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【整合篇】Activiti业务与流程整合之查询(二)

继上篇博客:【整合篇】JBPM4.4业务与流程整合之查询应用第二种方式:申请实体中加入需要的相应的工作流的属性packagecom.tgb.itoo.basic.entity;import

    

继上篇博客:【整合篇】JBPM4.4业务与流程整合之查询 应用第二种方式:申请实体中加入需要的相应的工作流的属性

package com.tgb.itoo.basic.entity;

import java.util.Date;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.springframework.format.annotation.DateTimeFormat;

/**
* Entity: Leave
*
* @author hejingyuan IdEntity implements Serializable
*/
@Entity
@Table(name = "OA_LEAVE")
public class Leave extends IdEntity {

/**
*
*/
private static final long serialVersiOnUID= 1L;
private String processInstanceId;
private String userId;
private String testId;
private String oldCourse;
private String applyCourse;
@Column
public String getApplyCourse() {
return applyCourse;
}

public void setApplyCourse(String applyCourse) {
this.applyCourse = applyCourse;
}

@Column
public String getOldCourse() {
return oldCourse;
}

public void setOldCourse(String oldCourse) {
this.oldCourse = oldCourse;
}
@Column
public String getNewCourse() {
return newCourse;
}

public void setNewCourse(String newCourse) {
this.newCourse = newCourse;
}

private String newCourse;

@Column
public String getTestId() {
return testId;
}

public void setTestId(String testId) {
this.testId = testId;
}

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private Date startTime;

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private Date endTime;

/* @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private Date realityStartTime;

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private Date realityEndTime;*/
private Date applyTime;
private String leaveType;
private String reason;

//-- 临时属性 --//

// 流程任务
private Task task;

private Map variables;

// 运行中的流程实例
private ProcessInstance processInstance;

// 历史的流程实例
private HistoricProcessInstance historicProcessInstance;

// 流程定义
private ProcessDefinition processDefinition;

@Column
public String getProcessInstanceId() {
return processInstanceId;
}

public void setProcessInstanceId(String processInstanceId) {
this.processInstanceId = processInstanceId;
}

@Column
public String getUserId() {
return userId;
}

public void setUserId(String userId) {
this.userId = userId;
}

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "START_TIME")
public Date getStartTime() {
return startTime;
}

public void setStartTime(Date startTime) {
this.startTime = startTime;
}

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "END_TIME")
public Date getEndTime() {
return endTime;
}

public void setEndTime(Date endTime) {
this.endTime = endTime;
}

@Column
@Temporal(TemporalType.TIMESTAMP)
public Date getApplyTime() {
return applyTime;
}

public void setApplyTime(Date applyTime) {
this.applyTime = applyTime;
}

@Column
public String getLeaveType() {
return leaveType;
}

public void setLeaveType(String leaveType) {
this.leaveType = leaveType;
}

@Column
public String getReason() {
return reason;
}

public void setReason(String reason) {
this.reason = reason;
}

/**
* 学生基础信息
*/
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = StudentCourseInfo.class)
@JoinColumn(name = "studentCourseInfoId", nullable = true)
private StudentCourseInfo studentCourseInfo;

public StudentCourseInfo getStudentCourseInfo() {
return studentCourseInfo;
}

public void setStudentCourseInfo(StudentCourseInfo studentCourseInfo) {
this.studentCourseInfo = studentCourseInfo;
}

@Transient
public Task getTask() {
return task;
}

public void setTask(Task task) {
this.task = task;
}

@Transient
public Map getVariables() {
return variables;
}

public void setVariables(Map variables) {
this.variables = variables;
}

@Transient
public ProcessInstance getProcessInstance() {
return processInstance;
}

public void setProcessInstance(ProcessInstance processInstance) {
this.processInstance = processInstance;
}

@Transient
public HistoricProcessInstance getHistoricProcessInstance() {
return historicProcessInstance;
}

public void setHistoricProcessInstance(HistoricProcessInstance historicProcessInstance) {
this.historicProcessInstance = historicProcessInstance;
}

@Transient
public ProcessDefinition getProcessDefinition() {
return processDefinition;
}

public void setProcessDefinition(ProcessDefinition processDefinition) {
this.processDefinition = processDefinition;
}


}


在真正应用之前我们先来简单介绍一下在Activiti中比JBPM4.4的一处优化。

activiti中,它为我们提供了一个businessKey字段。

 

在启动流程时,流程实例中会添加一条记录,而且流程实例表中会有一个businessKey字段,String businessKey = leave.getId().toString();这样我们的流程表中就始终拥有业务的id,当我们再次需要的时候可以重新查询。




下面举例说明:

 /**
* 任务列表ERROR [stderr] (http-localhost/127.0.0.1:8080-3) ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider com.sun.script.Javascript.RhinoScriptEngineFactory not found
*
* @param leave
*/
@RequestMapping(value = "list/task")
public ModelAndView taskList(HttpSession session, HttpServletRequest request) {
List results = new ArrayList();
String userId = UserUtil.getUserFromSession(session).getId();
results=abstractTaskList(userId);
return new ModelAndView("/oa/leave/taskList","results",results);

}

/**
* 抽象出来的查看任务列表,与基本业务无关
*
* @param userId 用户id
* @return
*/
public List abstractTaskList(String userId){
List results = new ArrayList();
// 根据当前人的ID查询
TaskQuery taskQuery = taskService.createTaskQuery().taskCandidateOrAssigned(userId);
List tasks = taskQuery.list();
int i=0;

// 根据流程的业务ID查询实体并关联
for (Task task : tasks) {
String processInstanceId = task.getProcessInstanceId();
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).active().singleResult();
String businessKey = processInstance.getBusinessKey();
if (businessKey == null) {
continue;
}
Leave leave=updateEntity(processInstance,task,businessKey);
results.add(leave);
i=i+1;
}
return results;
}

//更新实体 
public Leave updateEntity(ProcessInstance processInstance,Task task,String businessKey){
Leave leave = leaveBean.findEntityById(businessKey);
leave.setProcessInstance(processInstance);
leave.setProcessDefinition(getProcessDefinition(processInstance.getProcessDefinitionId()));
leave.setTask(task);
return leave;
}


对比:

    之前的JBPM的操作方式,启动流程时将业务数据存储到流程变量中,在需要查询时,将数据从流程变量中取出,然后将取出的值赋给我们的组合实体即可。这样做的弊端在于数据可能会出现不同步的情况,但是应该并不多见。

 

    其实使用这种方式呢,即使在实体层添加了工作流的属性,但是并不需要在真正的数据库表中添加相应的字段,那么这样做的便利在哪里呢?其实这样做主要是使得我们在返回前台数据时更加方便,我们只需要返回一个实体即可。但是弊端是什么呢,就是业务的实体中需要知道一些工作流的属性。

    而且弊端不仅如此,在大型系统中,相当于实体层需要加入所有的依赖工作流的jar包,如果这个实体还需要被其他系统所依赖,那么所有的系统都会有工作流的依赖,我们曾遇到的问题就是,当我们在当前系统的实体项目中加入工作流的依赖时,由于其他系统也依赖我们本实体,导致所有的系统均瘫痪jboss不能正常启动,报不识别工作流的类。这种影响就是深远的,所以我们要实现的还是解耦。


下篇继续





推荐阅读
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
author-avatar
立而山0605_408
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有