SpringMVC集成activity工作流

本文介绍了如何将Activiti工作流与SpringMVC整合,详细步骤包括下载activiti-5.22.0,解压并配置工程目录,修改editor-app的app-cfg.js,引入jar包,配置applicationContext.xml,创建ActivitiController,以及启动后的流程创建和查看地址。

1.下载activiti-5.22.0 SpringMVC集成activity工作流中文集成
解压后的目录结构
在这里插入图片描述
2.解压activiti-explorer.war文件在这里插入图片描述
解压后的目录结构,拷贝diagram-viewer,editor-app,VAADIN,favicon.ico,modeler.html这些目录和文件,放在自己工程下webapp目录下在这里插入图片描述
并修改editor-app下app-cfg.js的内容
ACTIVITI.CONFIG = {
‘contextRoot’ : ‘/项目运行起来的工程名字/activiti’
};
如果你的工程Controller类上没@RequestMapping("/activiti")就不用加
如:ACTIVITI.CONFIG = {
‘contextRoot’ : ‘/项目运行起来的工程名字’
};
3.按路径找到stencilset.json文件,拷贝至工程的resources下
在这里插入图片描述
4.pom.xml引入jar包

 <properties>
       <!--activiti流程配置 -->
        <activiti.version>5.22.0</activiti.version>
        <!--activiti流程配置 end-->
    </properties>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-modeler</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-engine</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-spring</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-bpmn-model</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-bpmn-layout</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-bpmn-converter</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-process-validation</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-image-generator</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-json-converter</artifactId>
        <version>${activiti.version}</version>
    </dependency>
   <!-- activiti end -->

5.创建applicationContext.xml,启动的时候注册

<!-- 在线编辑器配置开始 -->
	<bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"/>
	<!-- 在线编辑器配置结束 -->
	<!-- activiti 配置开始 -->
	<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
		<!-- 注入数据库连接池 -->
		<property name="dataSource" ref="dataSource"/>
		<!-- 配置事物管理器 -->
		<property name="transactionManager" ref="transactionManager"/>
		<!-- 自动构建数据库表,设置value="true",第一次启动建表;设置value="drop-create",每次启动时建新表 -->
		<property name="databaseSchemaUpdate" value="true"/>
		<!--激活Timer和异步消息的线程的组件,即activiti的定时扫描任务,默认:true,不使用的话建议关掉 -->
		<property name="jobExecutorActivate" value="false"/>
		<!-- 生成流程图的字体 -->
		<property name="activityFontName" value="宋体"/>
		<property name="labelFontName" value="宋体"/>
		<property name="annotationFontName" value="宋体"/>
		<!-- UUID作为主键生成策略 -->
		<!-- <property name="idGenerator" ref="uuidGenerator" /> -->
		<!-- 自动部署,只有流程数据库中没有和自动部署的流程定义相同的记录才会部署 -->
<!--		<property name="deploymentResources">-->
<!--			<list>-->
<!--				<value>classpath*:/deployments/*.bpmn</value>-->
<!--				<value>classpath*:/deployments/*.png</value>-->
<!--			</list>-->
<!--		</property>-->
	</bean>
	<!-- 创建流程引擎对象 -->
	<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
		<property name="processEngineConfiguration" ref="processEngineConfiguration"/>
	</bean>
	<!-- 创建activiti提供的各种服务 -->
	<!-- 工作流仓储服务 -->
	<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
	<!-- 工作流运行服务 -->
	<bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/>
	<!-- 工作流任务服务-->
	<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>
	<!-- 工作流历史数据服务-->
	<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/>
	<!-- 提供了流程引擎的管理和维护功能-->
	<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/>
	<!-- 表单管理服务-->
	<bean id="formService" factory-bean="processEngine" factory-method="getFormService"/>
	<!-- 提供基础的用户管理以及身份认证 -->
	<bean id="IdentityService" factory-bean="processEngine" factory-method="getIdentityService"/>
	<!-- activiti 配置结束 -->

6.创建ActivitiController的类,要检查工程是否启动扫描加载了

package controller.activiti;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.PNGTranscoder;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

@Controller
@RequestMapping("/activiti")
public class ActivitiController{
    private final static Logger logger = LogManager.getLogger(ActivitiController.class);

    @Autowired
    private RepositoryService repositoryService;
    @Autowired
    private ObjectMapper objectMapper;

    /**
     * 创建模型
     */
    @RequestMapping(value="/create", method = RequestMethod.GET)
    public void create(HttpServletRequest request, HttpServletResponse response) {
        try {
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            RepositoryService repositoryService = processEngine.getRepositoryService();
            ObjectMapper objectMapper = new ObjectMapper();

            ObjectNode stencilSetNode = objectMapper.createObjectNode();
            stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");

            ObjectNode properties =  objectMapper.createObjectNode();
            properties.put("process_author","author");

            ObjectNode editorNode = objectMapper.createObjectNode();
            editorNode.put("id", "canvas");
            editorNode.put("resourceId", "canvas");
            editorNode.put("stencilset", stencilSetNode);
            editorNode.put("properties", properties);

            int version = (int)repositoryService.createModelQuery().modelKey("").count()+1;
            ObjectNode modelNode = objectMapper.createObjectNode();
            modelNode.put(ModelDataJsonConstants.MODEL_NAME, super.getLoginUsers().getName());
            modelNode.put(ModelDataJsonConstants.MODEL_REVISION, version);
            modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION,"创建者");

            Model modelData = repositoryService.newModel();
            modelData.setName("创建人名称");
            modelData.setKey("创建人编号");
            modelData.setVersion(version);
            modelData.setMetaInfo(modelNode.toString());
            modelData.setCategory(null);

            // 保存模型
            repositoryService.saveModel(modelData);
            repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes("UTF-8"));
            logger.info(request.getContextPath() + "/activiti/modeler.html?modelId=" + modelData.getId());
            response.sendRedirect(request.getContextPath() + "/activiti/modeler.html?modelId=" + modelData.getId());
        } catch (Exception e) {
            System.out.println("创建模型失败:");
        }
    }



    @RequestMapping(value="/model/{modelId}/json", method = RequestMethod.GET, produces = "application/json")
    @ResponseBody
    public ObjectNode getEditorJson(@PathVariable String modelId) {
        ObjectNode modelNode = null;
        Model model = repositoryService.getModel(modelId);
        if (model != null) {
            try {
                if (StringUtils.isNotEmpty(model.getMetaInfo())) {
                    modelNode = (ObjectNode) objectMapper.readTree(model.getMetaInfo());
                } else {
                    modelNode = objectMapper.createObjectNode();
                    modelNode.put(ModelDataJsonConstants.MODEL_NAME, model.getName());
                }
                modelNode.put(ModelDataJsonConstants.MODEL_ID, model.getId());
                ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree(
                        new String(repositoryService.getModelEditorSource(model.getId()), "UTF-8"));
                modelNode.put("model", editorJsonNode);

            } catch (Exception e) {
                logger.error("Error creating model JSON", e);
                throw new ActivitiException("Error creating model JSON", e);
            }
        }
        return modelNode;
    }

    @RequestMapping(value="/model/{modelId}/save", method = RequestMethod.PUT)
    @ResponseStatus(HttpStatus.OK)
    public void saveModel(@PathVariable String modelId, @RequestBody MultiValueMap<String, String> values) {
        try {
            Model model = this.repositoryService.getModel(modelId);
            ObjectNode modelJson = (ObjectNode)this.objectMapper.readTree(model.getMetaInfo());
            modelJson.put("name", (String)values.getFirst("name"));
            modelJson.put("description", (String)values.getFirst("description"));
            model.setMetaInfo(modelJson.toString());
            model.setName((String)values.getFirst("name"));
            this.repositoryService.saveModel(model);
            this.repositoryService.addModelEditorSource(model.getId(), ((String)values.getFirst("json_xml")).getBytes("utf-8"));
            InputStream svgStream = new ByteArrayInputStream(((String)values.getFirst("svg_xml")).getBytes("utf-8"));
            TranscoderInput input = new TranscoderInput(svgStream);
            PNGTranscoder transcoder = new PNGTranscoder();
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            TranscoderOutput output = new TranscoderOutput(outStream);
            transcoder.transcode(input, output);
            byte[] result = outStream.toByteArray();
            this.repositoryService.addModelEditorSourceExtra(model.getId(), result);
            outStream.close();
        } catch (Exception var11) {
            throw new ActivitiException("Error saving model", var11);
        }
    }
    @RequestMapping(value = {"/editor/stencilset"}, method = {RequestMethod.GET}, produces = {"application/json;charset=utf-8"})
    @ResponseBody
    public String getStencilset() {
        InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json");
        try {
            return IOUtils.toString(stencilsetStream, "utf-8");
        } catch (Exception var3) {
            throw new ActivitiException("Error while loading stencil set", var3);
        }
    }
}

7.到该步骤已完成
流程创建地址:http://localhost:8080/工程名/activiti/create
流程地址查看:http://localhost:8080/工程名/activiti/modeler.html?modelId=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值