Activiti6.0学习实践(3)-应用工程(helloworld)构建

activiti7(三):Activiti7简介与HelloWorld activiti7简介与helloworld,旨在学习activiti7的工作流程和原理 阅读详情

本章主要是通过构建一个流程应用,来了解通过idea来创建流程图和编写代码来创建一个流程应用。

目录

1、IDEA安装插件actiBPM

2、创建一个maven工程

3、创建BPMN流程图

3.1 创建一个BPMN 流程

3.2 修改元素的名称

4、BPMN定义文件xml化

​​​​​​​5、修改pom文件添加依赖

​​​​​​​6、创建应用入口DemoMain类

7、测试验证

8、问题处理小结

8.1、Idea工程报错, write-unsafe

​​​​​​​8.2、流程定义获取name乱码


​​​​​​​

1、IDEA安装插件actiBPM

启动idea,通过 File-setting 找到 plugins项目

点击安装,安装完成后根据提示重启IDEA。

2、创建一个maven工程

接下来,我们需要创建一个新的maven工程

 

 

 

 

3、创建BPMN流程图

下面我们通过这个工程创建一个二级审批流程

​​​​​​​3.1 创建一个BPMN 流程

下面我们就可以在这个界面上画流程图了(话说这个界面槽点多多)

我们要画的流程是一个二级审批流程:

开始--员工填写请假流程--部门主管审批—人力审批—结束

​​​​​​​3.2 修改元素的名称

对每个元素进行修改名称,修改后的内容如下图所示

设定属性: form Property中的 id, name, type

注意上图中的类型后面实践中证明是错误的,只要都用小写就好,否则会报错误。(string, date等)

好,流程的配置到这里,暂时先放一下,我们回到工程​​​​​​​

4、BPMN定义文件xml化

将我们设计的BPMN定义文件,复制,复制的时候重命名,通常是在后面增加20.xml。 20表示遵循BPMN2.0规范,重命名后,可以直接打开xml查看,和我们熟知的xml文档没有什么差别。

下面是本例中xml内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1576563040688" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema">
  <process id="myProcess_1" isClosed="false" isExecutable="true" name="二级审批流程" processType="None">
    <startEvent id="_2" name="开始"/>
    <userTask activiti:exclusive="true" id="_3" name="员工填写">
      <extensionElements>
        <activiti:formProperty id="f1" name="员工姓名" type="string"/>
        <activiti:formProperty id="f2" name="申请内容" type="string"/>
        <activiti:formProperty id="f3" name="提交时间" type="date"/>
      </extensionElements>
    </userTask>
    <sequenceFlow id="_4" sourceRef="_2" targetRef="_3"/>
    <exclusiveGateway gatewayDirection="Unspecified" id="_5" name="提交or取消"/>
    <userTask activiti:exclusive="true" id="_6" name="主管审批">
      <extensionElements>
        <activiti:formProperty id="f4" name="审批人姓名" type="string"/>
        <activiti:formProperty id="f5" name="审批内容" type="string"/>
        <activiti:formProperty id="f6" name="审批时间" type="date"/>
      </extensionElements>
      ‘
    </userTask>
    <sequenceFlow id="_7" sourceRef="_3" targetRef="_5"/>
    <sequenceFlow id="_8" sourceRef="_5" targetRef="_6"/>
    <userTask activiti:exclusive="true" id="_11" name="人力审批">
      <extensionElements>
        <activiti:formProperty id="f7" name="人力姓名" type="string"/>
        <activiti:formProperty id="f8" name="审批内容" type="string"/>
        <activiti:formProperty id="f9" name="审批时间" type="date"/>
      </extensionElements>
    </userTask>
    <exclusiveGateway gatewayDirection="Unspecified" id="_12" name="主管审批校验"/>
    <exclusiveGateway gatewayDirection="Unspecified" id="_13" name="人力审批校验"/>
    <endEvent id="_14" name="结束"/>
    <sequenceFlow id="_15" sourceRef="_6" targetRef="_12"/>
    <sequenceFlow id="_16" sourceRef="_12" targetRef="_11"/>
    <sequenceFlow id="_17" sourceRef="_11" targetRef="_13"/>
    <sequenceFlow id="_18" sourceRef="_13" targetRef="_14"/>
    <sequenceFlow id="_19" sourceRef="_12" targetRef="_3"/>
    <sequenceFlow id="_9" sourceRef="_13" targetRef="_3"/>
    <sequenceFlow id="_10" sourceRef="_5" targetRef="_14"/>
  </process>
  <bpmndi:BPMNDiagram documentation="background=#3C3F41;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram">
    <bpmndi:BPMNPlane bpmnElement="myProcess_1">
      <bpmndi:BPMNShape bpmnElement="_2" id="Shape-_2">
        <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="185.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_3" id="Shape-_3">
        <omgdc:Bounds height="55.0" width="85.0" x="105.0" y="175.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_5" id="Shape-_5" isMarkerVisible="false">
        <omgdc:Bounds height="32.0" width="32.0" x="270.0" y="180.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_6" id="Shape-_6">
        <omgdc:Bounds height="55.0" width="85.0" x="350.0" y="175.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_11" id="Shape-_11">
        <omgdc:Bounds height="55.0" width="85.0" x="580.0" y="175.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_12" id="Shape-_12" isMarkerVisible="false">
        <omgdc:Bounds height="32.0" width="32.0" x="500.0" y="190.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_13" id="Shape-_13" isMarkerVisible="false">
        <omgdc:Bounds height="32.0" width="32.0" x="750.0" y="180.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_14" id="Shape-_14">
        <omgdc:Bounds height="32.0" width="32.0" x="840.0" y="185.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="_15" id="BPMNEdge__15" sourceElement="_6" targetElement="_12">
        <omgdi:waypoint x="435.0" y="202.5"/>
        <omgdi:waypoint x="500.0" y="206.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_17" id="BPMNEdge__17" sourceElement="_11" targetElement="_13">
        <omgdi:waypoint x="665.0" y="202.5"/>
        <omgdi:waypoint x="750.0" y="196.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_16" id="BPMNEdge__16" sourceElement="_12" targetElement="_11">
        <omgdi:waypoint x="532.0" y="206.0"/>
        <omgdi:waypoint x="580.0" y="202.5"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_19" id="BPMNEdge__19" sourceElement="_12" targetElement="_3">
        <omgdi:waypoint x="516.0" y="190.0"/>
        <omgdi:waypoint x="368.0" y="125.0"/>
        <omgdi:waypoint x="147.5" y="175.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_18" id="BPMNEdge__18" sourceElement="_13" targetElement="_14">
        <omgdi:waypoint x="782.0" y="196.0"/>
        <omgdi:waypoint x="840.0" y="201.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_4" id="BPMNEdge__4" sourceElement="_2" targetElement="_3">
        <omgdi:waypoint x="32.0" y="201.0"/>
        <omgdi:waypoint x="105.0" y="202.5"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_7" id="BPMNEdge__7" sourceElement="_3" targetElement="_5">
        <omgdi:waypoint x="190.0" y="202.5"/>
        <omgdi:waypoint x="270.0" y="196.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_8" id="BPMNEdge__8" sourceElement="_5" targetElement="_6">
        <omgdi:waypoint x="302.0" y="196.0"/>
        <omgdi:waypoint x="350.0" y="202.5"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_9" id="BPMNEdge__9" sourceElement="_13" targetElement="_3">
        <omgdi:waypoint x="766.0" y="180.0"/>
        <omgdi:waypoint x="470.0" y="100.0"/>
        <omgdi:waypoint x="147.5" y="175.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_10" id="BPMNEdge__10" sourceElement="_5" targetElement="_14">
        <omgdi:waypoint x="286.0" y="212.0"/>
        <omgdi:waypoint x="530.0" y="295.0"/>
        <omgdi:waypoint x="856.0" y="217.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

​​​​​​​5、修改pom文件添加依赖

在pom文件中,添加我们这工程的依赖,具体见如下pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.study.myactiviti</groupId>
    <artifactId>myactiviti-app</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>6.0.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>25.0-jre</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.45</version>
        </dependency>
    </dependencies>

</project>

​​​​​​​6、创建应用入口DemoMain类

在入口类中,我们要实现整个流程引擎应用的串联。因此应用需要如下几个步骤

  1. 创建流程引擎

    2. 部署流程定义文件xml

    3、启动流程

   4、处理流程

这一步主要是获取任务列表,并获取任务中的表单属性,对表单属性进行处理。上面代码中引入了scanner进行命令式交互。

完成代码见下面:

package com.study.activiti;

import com.google.common.collect.Maps;
import org.activiti.engine.*;
import org.activiti.engine.form.FormProperty;
import org.activiti.engine.form.TaskFormData;
import org.activiti.engine.impl.form.DateFormType;
import org.activiti.engine.impl.form.StringFormType;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;

/**
 * Describe:启动类
 *
 * @author cwqsolo
 * @date 2019/12/17
 */
public class DemoMain {

    private static final Logger LOGGER = LoggerFactory.getLogger(DemoMain.class);

    public static void main(String[] args) throws ParseException {
        LOGGER.info("启动应用------>>>");

        //步骤1--创建流程引擎
        ProcessEngine processEngine = getProcessEngine();

        //步骤2---部署流程定义
        ProcessDefinition processDefinition = getProcessDefinition(processEngine);

        //步骤3--启动流程
        ProcessInstance processInstance = getProcessInstance(processEngine, processDefinition);
        LOGGER.info("启动流程实例 {}", processInstance.getProcessDefinitionKey());

        //步骤4--处理流程任务
        Scanner scanner = new Scanner(System.in);
        while (processInstance != null && !processInstance.isEnded()) {
            TaskService taskService = processEngine.getTaskService();
            List<Task> list = taskService.createTaskQuery().list();
            LOGGER.info("待处理任务数量 {}", list.size());

            for (Task task : list) {
                LOGGER.info("待处理任务 {}", task.getName());
                FormService formService = processEngine.getFormService();
                TaskFormData taskFormData = formService.getTaskFormData(task.getId());
                List<FormProperty> formProperties = taskFormData.getFormProperties();
                HashMap<String, Object> objectObjectHashMap = Maps.newHashMap();
                //从流程中获取表单,并存入到hashmap
                for (FormProperty formProperty : formProperties) {
                    String s = null;
                    if (StringFormType.class.isInstance(formProperty.getType())) {
                        LOGGER.info("请输入 {} ?", formProperty.getName());
                        s = scanner.nextLine();
                        objectObjectHashMap.put(formProperty.getId(), s);
                    } else if (DateFormType.class.isInstance(formProperty.getType())) {
                        LOGGER.info("请输入 {} ? 格式 ( yyyy-MM-dd)", formProperty.getName());
                        s = scanner.nextLine();
                        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
                        Date parse = simpleDateFormat.parse(s);
                        objectObjectHashMap.put(formProperty.getId(), parse);
                    } else {
                        LOGGER.info("类型暂时不支持 {} ", formProperty.getType());
                    }
                    LOGGER.info("您输入的内容是 [{}] ", s);

                    LOGGER.info("请输入 {} ?", formProperty.getName());
                }
                //提交表单
                taskService.complete(task.getId(), objectObjectHashMap);
                //获取流程最新的状态
                processInstance = processEngine.getRuntimeService()
                        .createProcessInstanceQuery()
                        .processInstanceId(processInstance.getId())
                        .singleResult();

            }


        }


        LOGGER.info("------>>>结束应用");

    }

    private static ProcessInstance getProcessInstance(ProcessEngine processEngine, ProcessDefinition processDefinition) {
        //获取流程引擎的一个运行时服务
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //根据id启动流程实例, 启动流程实例的方法有多种,上面获取了id,可以采用这个方法
        return runtimeService.startProcessInstanceById(processDefinition.getId());

    }

    /**
     * 部署流程定义
     * @param processEngine
     * @return
     */
    private static ProcessDefinition getProcessDefinition(ProcessEngine processEngine) {
        //由流程引擎创建一个流程库服务对象
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //流程库服务对象创建一个流程部署构建对象
        DeploymentBuilder deployment = repositoryService.createDeployment();
        //流程构建对象加载配置文件
        deployment.addClasspathResource("./comm2Level.bpmn20.xml");
        //创建指定流程配置的部署对象并获取部署ID
        Deployment deploy = deployment.deploy();
        String id = deploy.getId();

        //根据流程库服务对象获取流程定义对象
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(id).singleResult();
        LOGGER.info("流程定义文件 {}, 流程ID {}", processDefinition.getName(), processDefinition.getId());
        return processDefinition;
    }

    /**
     * 创建流程引擎
     * @return
     */
    private static ProcessEngine getProcessEngine() {
        //流程引擎的创建有多种方法,本例中使用mysql,因此需要从数据源来创建, 数据源定义在activiti.cfg.xml 文件中
        ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault();
        LOGGER.info("configuration = {}", cfg);
        //获取引擎
        ProcessEngine processEngine = cfg.buildProcessEngine();
        String name = processEngine.getName();
        String version = ProcessEngine.VERSION;
        LOGGER.info("获取流程引擎 {}, 版本为{}", name, version);
        return processEngine;
    }
}

7、测试验证

下面将我们的demo应用跑起来,则会一步一步进行任务处理,在每个任务界面进行表单内容的输入

​​​​​​​

 

8、问题处理小结

8.1、Idea工程报错, write-unsafe

问题描述:系统报write-unsafe错误,不过不影响工程。

解决:

修改idea的启动参数,即在下图红框处文件中,在最后添加-Dfile.encoding=UTF-8

​​​​​​​8.2、流程定义获取name乱码

问题描述:

解决:

检查数据库中记录,发现也是乱码,推断是入数据库就出问题。检查发现mysql的url没有配置字符集,增加UTF-8配置,如下图红框,问题解决

 

Activiti Workflow HelloWorld示例与测试环境搭建. Activiti Workflow HelloWorld示例与测试环境搭建 立即下载

相关推荐

Activiti Workflow HelloWorld示例与测试环境搭建

们都知道Alfresco 4.0以后采用了Activiti BPMN2.0 引擎(关于Activiti, 是一个open source 项目。 Alfresco从jBPM公司挖出了jBPM的创建人和若干核心人员,意欲创建一个基于Apache License的,并且遵循BPMN 2.0工作流标准的开源项目,看来Alfresco真是煞费苦心啊。不过Alfresco 4.0 中jBPM是仍然存在的,也就是说两套工作流引擎并存)。我们这里介绍一下怎样在eclipse中设计BPMN 2.0工作流定义的基本步骤。 1. Activiti问我们提供了Activiti BPMN 2.0, 这个工具是基于Eclipse所开发的工具,安装十分方便。在安装Activiti之前,我们要首先安装Maven Eclipse插件。

1.使用SpringBoot整合Activiti6(工作流)

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。画好流程图后点击空白处,左边会出现流程参数,这里我们只需要设置流程的id与name即可。这里我们用到了三种标签,...

一直在水些技术小文 1282

activiti入门程序helloworld及所需整合jar包

activiti整合所需jar包及eclipse静态安装所需文件

Activiti7工作流引擎:基础篇(四) Hello World

示例一:负责人写死 1.1 流程定义 Assignee: 表示任务负责人。 public class HelloWorldTest { /** * 创建数据库表 */ @Test public void testCreateDBTable() { ProcessEngines.getDefaultProcessEngine(); } /** * 部署流程:将.bpmn文件保存到数据库中 */ @

人不风流枉少年 3690

从Chiplet到UCIE:D2D互联技术如何重塑半导体设计生态

本文探讨了D2D互联技术在半导体设计中的革命性作用,从Chiplet到UCIE标准的演进如何重塑行业生态。详细分析了D2D互联的技术本质、架构选择及UCIE标准带来的变革,并展望了未来光学D2D和3D集成等趋势。高速互联接口技术的突破为AI加速器和计算芯片提供了更高带宽和能效。

weixin_29292535的博客 932

汇率波动率建模实战:从GARCH到EGARCH的金融时间序列分析

在金融时间序列分析中,波动率建模是量化市场风险的核心技术。其基本原理在于捕捉金融资产收益率序列中存在的波动聚集、尖峰厚尾等典型特征。通过建立条件异方差模型,如GARCH及其扩展模型,可以动态估计和预测未来波动率,这对于资产定价、风险管理和投资决策具有重要价值。在金融工程领域,该技术广泛应用于外汇、股票和衍生品市场。本文以汇率波动率建模为具体场景,详细阐述了如何使用Python中的arch库,从数据预处理、模型选型(包括GARCH、EGARCH等)、参数估计到样本外预测评估的全流程实践,并深入探讨了模型在应对

weixin_32629853的博客 374

bpmn-js显示Flowable的BpmnModel转换为xml文档的流程图排他网关丢失中间“X”

第一个想法就是继承类BPMNDIExport,重写方法createBpmnShape,但此方法是静态的,并不能重写,如果完全重写BpmnXMLConverter工作量太大了,放弃。改造xml了?对于convertToXML的结果,进行解析,在相应位置添加上属性isMarkerVisible="true"是不是就可以了。说干就干!!!

honor_zhang的博客 6507

智能座舱(七)——智能音频系统

本文剖析车载智能音频系统的核心技术,聚焦音响、功放、麦克风和广播收音机四大组件。音响系统通过多声道布局(如23扬声器阵列)结合动态声场校准算法,实现三维声场覆盖;功放系统采用高效D类技术,支持OTA音效调整和故障自愈;麦克风阵列运用波束成形技术实现精准拾音,并保障隐私安全;广播系统融合数字与网络技术提升音质。核心在于硬件标准化与算法差异化的协同,未来将朝集成化、AI个性化方向发展。

DC20160101的博客 1575

【Activiti工作流】5.Activiti入门程序HelloWorld演示流程的执行(上)

上一次我们在配置好Activiti的开发环境之后,进行了以下三步配置:1.添加并制定配置文件2.配置log4j.properties日志文件3.重写加载类我们的开发前的准备工作已经完毕,接下来我们来通过编写一个入门工程--HelloWorld,来讲解Activiti的核心API的使用。我们的HelloWrold工程是在于“模拟流程的执行”。1.绘制流程图我们需要绘制的流程图如下:我们在之前的zhu...

程序猿之洞 1万+

网站进行企业微信授权登录(附带代码超详细版)

企业微信的扫码登录官方文档 https://work.weixin.qq.com/api/doc/90000/90135/90988 企业微信扫码登录认证流程 上面是官方的图片,看上去比较复杂。因此我用直白简洁的语言梳理下流程。 1、首先在自己的网站上获取到企业微信登录的二维码(二维码怎么获取稍后再说,这里想象下你已经有了一个二维码) 2、你拿着手机扫描二维码,确认登录之后,页面就会自己进行重定向的跳转,跳转的url如何配置下面再讲,但是注意,这个重定向的url可以是内网地址 3、重定向到指

Gzf的博客 1万+

Fiddler Everywhere保姆级教程:10分钟搞定手机HTTPS抓包(附证书配置避坑指南)

本文提供Fiddler Everywhere移动端HTTPS抓包的保姆级教程,涵盖环境配置、代理设置、证书安装及常见问题排查。重点解析如何正确安装并信任Fiddler根证书以解密HTTPS流量,帮助开发者快速搭建抓包环境,高效分析应用网络行为,提升调试效率。

git9versioner的博客 705

(二)activiti源码初探之helloworld

activity(流程引擎)从零入门到实战学习欢迎使用Markdown编辑器1.如何拉取源码?2.目录文件说明3.为什么选择activiti?功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 从本编文

zhangxiaoxiao9527的博客 770

最新Python爬虫实战(入门爬虫篇)——案例18:某气象局全国天气预报数据采集(详细爬虫思路截图 + 抓包动图演示+完整爬虫代码+详细注释)

本次案例针对某气象局天气预报网的静态HTML页面,实现了全国各地区天气数据的全自动化爬取,和之前案例17的动态接口爬虫不同,本次案例聚焦于静态页面的爬虫实现,覆盖了从抓包分析、请求模拟、数据解析到数据存储的完整爬虫流程,非常适合入门学习者巩固基础,核心知识点和实现要点总结如下:首先是页面分析的核心逻辑,静态HTML页面的数据爬取,核心在于通过浏览器开发者工具,完成完整的抓包分析和标签结构定位。

努力让自己发光,对的人才能迎着光而来 27万+

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld

本文介绍以Eclipse和IDEA创建Activiti6.0第一个程序Helloworld,文章比较长,请耐心阅读。 为了方便读者练习,在本文中配有福利,请自行查取。 程序的运行效果如下所示: 一、工具 Eclipse辅助画流程图,创建流程定义文件 IDEA创建流程项目。 二、Eclipse中创建流程定义文件(简单点说就是画流程图)(***) 1.eclipse 中创建maven...

长林攻城狮的博客 3176

098、C3k2_Ghost:用 GhostConv 替代 C3k2 内标准卷积的轻量化改造代码

本文介绍了用GhostConv轻量化改造YOLOv11中C3k2模块的实践。作者通过线上部署案例引出问题,详细解析了GhostConv的核心实现逻辑,指出直接替换标准卷积会导致的两个关键问题:通道数不匹配和kernel_size冲突。文章提供了完整的C3k2_Ghost实现代码,包含注意事项和调试技巧。消融实验显示,该方法在小模型上可减少27%-28%参数量、34%-35%FLOPs,仅损失0.8mAP。作者总结了适用场景:小模型效果显著,大模型需谨慎;检测小目标任务不推荐;训练时需调整学习率。最后强调sh

sundong_81的博客 62

CATIA二次开发一一一获取属性的几种方法

这些方法覆盖了CATIA CAA开发中属性操作的典型场景,开发者可通过类型判断实现递归遍历、跨文档关联等复杂逻辑。此方法用于遍历对象的所有属性,获取属性键后可通过类型判断选择后续处理方式。适用于处理嵌套对象或关联对象的场景(如几何特征关联制造特征)。适用于简单属性值的直接读取(如版本号、状态标识等)。用于处理多值属性(如多选参数、装配体子件列表等)。用于处理跨文档引用(如零件关联图纸文件)。

工业软件开发 432

Activiti5学习之【HelloWorld】

相信看完第一节的朋友都已经把Activiti需要的环境搭建起来了吧,那么咱们来干一件程序员学习一门新的技术都喜欢干的事情 HelloWorld!! 本文将会讲到如果和创建activiti运行时所需要的数据库 以及如何绘制流程图、如何发布一个流程、如何启动一个流程、和如何结束一个流程。  要想写这个HelloWorld还是需要费点劲的,因为这个不像别的HelloWorld一样直接写一些代码就行 这

成长的道路我们一起走过…… 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【弄nèng - Activiti6】Activiti6入门篇(一)—— HelloWorld

文章目录1. 简介1.1 7大接口1.2 28张表2. 第一个实例Hello world2.1 流程设计2.2 测试类2.3 运行2.3.1 部署2.3.2 启动流程2.3.3 查询任务2.3.4 完成任务参考源码地址项目推荐 Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,...

司马缸砸缸了 1078

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Activiti6.0-HelloWorld入门

获取Activiti源码 在github上copy源码时,建议将源码fork到自己的github账号上, 第一步:拉取项目git clone https://github.com/taojin1122/Activiti.git 第二步:创建study6分支并切换git checkout -b study6 Activiti-6.0.0 第三步:maven编译mvn clean test-compi...

taojin12的博客 328

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Activiti6.0-HelloWorld实现

学一个新技术一定少不了实现HelloWorld,我这里也不多解释了,注释解释的很清楚 import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.repository.Deployment; import org.activiti....

河南小欧 225

Activiti 6.0 工作流入门 之HelloWorld

我们用 通过 Activiti 来写一个控制台输入输出的 工作流小例子 编程使用环境 - Activiti -6.0.0.zip - jdk1.8.0_161 - apache-tomcat-8.0.50.zip - 操作系统 macOS - IDEA 作为编码工具 这是一个控制台程序,通过控制台输入体验工作流引擎执行过程。流程执行的图示如下 使用maven 创...

Andy86869的博客 5781

activiti(三)activiti 6.0 模块介绍及编写helloWorld程序

同文 购物流程模型化 1.绘制BPMN 填写id和name StartEvent ------------- 开始 UserTask1 ------------- 提交审批信息 decideSubmit ------------- 提交OR取消 tl_app...

~ 703

Activiti(一)——HelloWorld

任何知识的学习都是有简入繁,我们的Activiti也不例外,这篇博文将通过一个简单的HelloWorld来带大家认识一下我们的Activiti; 一、画流程图 在画流程图之前,要确保自己的Eclipse安装了Activiti的插件。 图一 请假流程图 在这里要说明一下,我们指定在画流程图的时候,要指明这个流程实例的ID、N

weixin_44083609的博客 240

Activiti Workflow HelloWorld 示例与测试环境搭建

作者:Rock 出处:http://www.ecmkit.com/zh-hans/2012/03/21/activiti-workflow-hell Activiti Workflow HelloWorld示例与测试环境搭建 作者 Rock 发表于 星期三, 03/21/2012 - 12:55 我们都知道Alfres

宠辱不惊,闲看庭前花开花落;去留无意,漫随天外云卷云舒。 1750

Activiti学习笔记2 — HelloWorld

一、 Maven的POM配置文件 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://...

111

【Activiti工作流】(三)Activiti之HelloWorld

HelloWorld已经成为“入门小实例”的代名词了,上节内容我们通过Activiti的官方实例演示了在某一业务流程中引入Activiti流程引擎带来的便利,当然了,官方提供的app是让我们体会其运行过程的,而我们自己要做的就是应用Activiti框架,构建适合我们自己的应用。我们本节内容就来学Activiti的入门实例。 一、Activiti框架结构 Activiti流程引擎的核心在于其提供的...

qq_31583619的博客 364
上一篇: Activiti6.0学习实践(2)-源码工程构建
下一篇: Activiti6.0学习实践(4)-流程引擎配置一
虎纠卫
博客等级 码龄24年 440粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值