框架的环境搭建
1. 类库
2. 安装activiti 流程图插件(eclipse)
Name: Activiti BPMN 2.0 designer
Location: http://activiti.org/designer/update/
两种方式创建流程数据库:
第一种方式:用jdbc的方式
@Test
public void test1() {
ProcessEngineConfiguration config = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
config.setJdbcDriver("com.mysql.jdbc.Driver");
config.setJdbcUrl("jdbc:mysql://localhost:3306/activitidb1818?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8");
config.setJdbcUsername("root");
config.setJdbcPassword("admin");
//如果已经有数据库就不创建
config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
ProcessEngine engin = config.buildProcessEngine();
System.out.println("流程引擎:"+engin);
}
第二种方式:用spring托管的方式创建流程数据库:
@Test
public void test2() {
ProcessEngineConfiguration config = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
ProcessEngine engine = config.buildProcessEngine();
System.out.println("流程引擎"+engine);
}
注意要创建一个source folder里面存放activiti的配置文件:
activiti.cfg.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!-- 连接数据的配置 -->
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl"
value="jdbc:mysql://localhost:3306/activitidb1818?useUnicode=true&characterEncoding=utf8"></property>
<property name="jdbcUsername" value="root"></property>
<property name="jdbcPassword" value="admin"></property>
<!-- 没有表创建表 -->
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
</beans>
db.properties
jdbc.url=jdbc:mysql://localhost:3306/activitidb1818?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=admin
log4j.properties
log4j.rootLogger=INFO, CA
# ConsoleAppender
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n
接下来在eclipse中Preference->Activiti->Save Actions中勾选Create process definition imagine when saving the diagram
意思是保存流程时保存流程图片
2.创建流程及使用
在config(source folder)中创建floder用来保存创建的Activiti Diagram
在创建的.bpmn文件中绘制流程:
RepositoryService 管理流程定义
RuntimeService 执行管理,包括启动、推进、删除流程实例等操作
TaskService 任务管理
HistoryService 历史管理(执行完的数据的管理)
IdentityService 组织机构管理
FormService 一个可选服务,任务表单管理
ProcessEngine 可以获取业务类,业务类使用MyBatis对数据进行持久化操作
getDefaultProcessEngine()方法默认去类路径下找activiti.cfg.xml文件,用来连接数据库
/**
*art_re_procdef 流程定义模板
*act_re_deployment 部署表、
*act_ge_bytearray 存放资源文件(二进制数据)
*act_ru_execution 流程实例执行对象表
*act_hi_taskinst 流程实例历史记录
*act_hi_task 流程实例任务表
*/
public class HelloTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//部署流程定义(模板)
@Test
public void deployDB() {
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()//返回一个部署对象
.name("hello入门程序")
.addClasspathResource("diagram/helloworld.bpmn")
.addClasspathResource("diagram/helloworld.png")
.deploy();
System.out.println(deployment.getId() + "::" + deployment.getName());
}
//启动流程实例(具体要处理的流程)
@Test
public void startProcess() {
ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceByKey("myProcess");
System.out.println(pi.getId() + "," +pi.getActivityId());
}
//查找待办人的任务列表
@Test
public void findTaskListByAsignee() {
String asignee = "zhangsan";
List<Task> taskList = processEngine.getTaskService()
.createTaskQuery()
.taskAssignee(asignee)
.list();
for (Task task : taskList) {
System.out.println(task.getId() + "::" + task.getName() + "::" + task.getAssignee());
}
}
//完成任务(推进任务节点)
@Test
public void finishTask() {
String taskId = "604";
processEngine.getTaskService().complete(taskId );
System.out.println("完成任务");
}
//查看流程定义列表
@Test
public void findAllDef() {
List<ProcessDefinition>list = processEngine.getRepositoryService()
.createProcessDefinitionQuery()
.list();
for(ProcessDefinition pd :list) {
System.out.println(pd.getId()+":"+pd.getResourceName()+":"+pd.getDiagramResourceName()+":"+ pd.getVersion());
}
}
//删除流程定义(强行删除,级联的删除,全部都删)
@Test
public void removeProcessDef() {
String deployment = "1";
processEngine.getRepositoryService().deleteDeployment(deployment, true);
System.out.println("删除成功");
}
//查看流程定义
@Test
public void viewPic() throws IOException{
String deploymentId = "101";
String resourceName = "";
List<String> list = processEngine.getRepositoryService()
.getDeploymentResourceNames(deploymentId);
for (String name : list) {
if (name.indexOf(".png") != -1) {
resourceName = name;
}
}
InputStream in = processEngine.getRepositoryService()
.getResourceAsStream(deploymentId, resourceName);
File destFile = new File("d:\\" + resourceName);
// 把Inputstream 另存到 D://
FileUtils.copyInputStreamToFile(in, destFile);
System.out.println("图片读取完成");
}
}