Текучий от входа в землю (1) - начальный Текучий

Java

Течет от входа к входу

Автор: Рыбалка на холодной реке Снег в одиночку
Один меч, одно вино, одна река и одно озеро, такова эта жизнь.
Если у вас в сердце есть картина, зачем вам зажигать лампу? Пожалуйста, указывайте источник при загрузке


Предыдущий портал:


Введение

В настоящее время многие люди вокруг знакомы с текучестью и даже инвестировали в нее.生产использовать эту статью как抛砖引玉использовать. Приглашаю вас героев исправить.
Если вы что-то знаете о механизмах рабочих процессов, то вы должны знать, что текущие основные механизмы рабочих процессов в области Java представляют собой не что иное, какJboss旗下的JBPMиAlfresco旗下的Activity. Flowable — это механизм рабочего процесса, отделенный от Activiti создателями оригинальной Activiti.Это система управления бизнес-процессами (BPM) и рабочего процесса, подходящая для разработчиков и системных администраторов. Его ядро超快速,稳定Механизм процессов BPMN2, легко интегрируемый с Spring. Рождение Flowable точно такое же, как и рождение Acitiviti! В то время Том, главный создатель JBMP, на много лет ушел из Alfresco, и молодые поколения стали идти по стопам своих предшественников.Tijs Rademakers,Joram BarrezВ ожидании исходной основной команды Activiti из-за разногласий с Alfresco по поводу будущего направления развития проекта они решили коллективно уйти, создали Flowable и определили первую версию как 5.22 и выпустили версию 6.0 две недели назад! Вы знаете, текущая версия Activiti по-прежнему 5.22, а 6.0 находится в стадии бета-тестирования. Команда Flowable сообщила пользователям,“如果你还在犹豫是否加入我们,请看看Activiti源码里的作者们,再看看Flowable项目的成员们。我们是最懂Activiti、在过去几年里推动了整个社区、为社区做出贡献和改革的那帮人。”Основные моменты выбора Flowable следующие:

  • Сообщество сильное и с открытым исходным кодом. На момент написания статьи,flowableУже запланировано, что последующие версии не будут доступны для использования. Но на руках старая версия с открытым исходным кодом, и она у меня есть в мире. после всего工作流просто бизнес辅助平台.
  • Мощное обновление и непрерывное обновление.
  • Основная команда разработчиков — это основная команда оригинальной деятельности.
  • по сравнению сcamudaЭто рабочий движок. Степень кастомизации гораздо выше.
  • Что касается стиля кода, Flowable уважает и уважает принципы разработки DDD. Читать все равно удобнее.

любой工作流引擎Основная работа отражена в节点的流转以及表单的填写. Это все еще业务为主,工作流为辅, Он не должен быть основным рабочим процессом, а бизнес должен дополняться под реальное производственное использование.

Загрузка исходного кода

ТекучийАдрес официального сайта GitHubОписание исходного каталога

  • модули: в этой папке хранятся исходные файлы Java всех модулей проекта Activity. Поскольку flowable и Activity — одна и та же команда разработчиков, здесь вы увидите модуль, очень похожий на Activity.
  • qa: Некоторые общие примеры файлов конфигурации процессов.
  • scripts: некоторые файлы сценариев запуска для платформы Linux.
  • doc: Руководство пользователя, включая основыUserGuide和PublicApi
  • docker и k8s: создание образов контейнеров и управление ими
  • pom.xml: родитель всех проектов Maven. В этом файле определяются сторонние пакеты, от которых зависит Flowable в каждом проекте подмодуля.

Введение в сервис

Flowableвсе прошлоProcessEngineработать. То есть какой бы ни был процесс работы фреймворка, он должен пройтиProcessEngineЭтот класс справляется с этим.ProcessEngineдаFlowableобщедоступный门面. Диаграмма классов UML выглядит следующим образом:

Схема отношений выглядит следующим образом:

Представьте следующее实际经常使用приехала также关键方法.

RepositoryService

Связанные с установлением процесса. Например, определение процесса, развертывание процесса, запрос файла процесса, проверкаBpmnModelд., процесс превращается вbpmnModel,BpmnModel转化成流程文件(.bpm)Ждать. Ключевые методы следующие:

//伪代码。关键代码
// 验证bpmnModel
 List<ValidationError> validationErrors = repositoryService.validateProcess(bpmnModel);

//流程的查询
repositoryService.createProcessDefinitionQuery().processDefinitionName(route.getId().toString()).singleResult();

// 通过bpmnmodel定义流程并部署流程
Deployment deployment = repositoryService.createDeployment().addBpmnModel(bpmnModel.getProcesses().get(0).getName()+".bpmn", bpmnModel).deploy();

//将流程转成bpmnModel
repositoryService.getBpmnModel(processDefinition.getId());

//根据processDef上的deploymentId获取流程定义生成的bpmn文件或者其他资源文件。
InputStream inputStream = repositoryService.getResourceAsStream(deploymentId, resourceName);

// 删除流程定义
repositoryService.deleteDeployment(processDefinition.getDeploymentId(), cascade);

RumtimeService

Управление экземпляром процесса. Управление запуском, продвижением, удалением экземпляра процесса, получением текущего состояния экземпляра процесса и т. д.

// 启动实例。businessId为业务号,一般唯一。比如lotId。商品编码。业务层方便查找
runtimeService.startProcessInstanceById(processDefinition.getId(), businessId);

// trigger形式的过站 只适用于ReceiveTask S1表示当前流程所在的taskId
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(businessId).singleResult();

Execution execution = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).activityId("S1").singleResult();

runtimeService.trigger(execution.getId());

HistoryService

Запрос истории обработки, все запросы об истории исходят от этой службы.

// 整个业务的持续时间
List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey(lotId).list();
String instanceId = "";
for (HistoricProcessInstance hpi : list) {
    instanceId = hpi.getId();
    System.out.println("流程定义文件->" + hpi.getProcessDefinitionId());
    System.out.println("ProcessInstance->" + hpi.getId());
    System.out.println("StartActivityId->" + hpi.getStartActivityId());
    System.out.println("EndActivityId->" + hpi.getEndActivityId());
    System.out.println("startTime ->" + hpi.getStartTime() + "EndTime->" + hpi.getEndTime() + "duration" + hpi.getDurationInMillis());
}

//业务流转过程中每站的记录
List<HistoricActivityInstance> list1 = historyService.createHistoricActivityInstanceQuery().processInstanceId(instanceId).list().stream().sorted(Comparator.comparing(HistoricActivityInstance :: getStartTime)).collect(Collectors.toList());
for (HistoricActivityInstance historicActivityInstance : list1) {
    System.out.println("------");
    System.out.println(historicActivityInstance.getActivityId());
    System.out.println(historicActivityInstance.getActivityName());
    System.out.println(historicActivityInstance.getActivityType());
    System.out.println("startTime ->" +historicActivityInstance.getStartTime() + "EndTime->" + historicActivityInstance.getEndTime() + "duration" + historicActivityInstance.getDurationInMillis());
}

TaskService

Основная служба, используемая для задания задач узла, таких как ReceiveTask, UserTask, MailTask, HttpTask и т. д. Разные задачи имеют разные методы обработки.

Execution execution = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).activityId("S1").singleResult();
runtimeService.trigger(execution.getId());

execution = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).activityId("S2").singleResult();
runtimeService.trigger(execution.getId());

execution = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).activityId("S3").singleResult();
runtimeService.trigger(execution.getId());

разноеServiceБудет в后续的文章объяснял один за другим.

процесс сборки

Разверните процесс через файл bpmn процесса.

доступен через текучийeclipse插件,Idea插件илиwebui(需引入FlowableModuler。不推荐)Процесс создания выполняется вышеперечисленным и сохраняется в виде файла bpmn. и вставить в проектclasspathПредставьте развертывание ниже.Примечание. Во время развертывания имя ресурса должно заканчиваться на bpmn. В противном случае он не будет разобран. Ссылка на связанный исходный кодResourcesUtils

public static final String[] BPMN_RESOURCE_SUFFIXES = new String[] { "bpmn20.xml", "bpmn" };
public static final String[] DIAGRAM_SUFFIXES = new String[] { "png", "jpg", "gif", "svg" };

Создайте и разверните процесс, используя модель bpmn.

  • в состоянии пройтиbpmn.js. этоCamudaИнтерфейсная JS-библиотека с открытым исходным кодом для BPM. Его можно использовать напрямую и определить соответствующий процесс. Это рекомендуется. Относительно удобно и быстро. Об использовании bpmn.js будут соответствующие статьи, которыми можно похвастаться*. Быть в курсе.
  • Вы можете создавать и передавать данные через интерфейс разработки вашей собственной компании.
BpmnModel bpmnModel = new BpmnModel(); 

StartEvent start = new StartEvent();
start.setId("start1");
start.setName("开始节点");

SequenceFlow flow1 = new SequenceFlow(); 
3eflow1.setId("flow1"); 
flow1.setName("开始节点-->任务节点1"); 
flow1.setSourceRef("start1"); 
flow1.setTargetRef("receiveTask1");

ReceiveTask receiveTask1 = vbnew ReceiveTask();
receiveTask1.setId("receiveTask1");
receiveTask1.setName("节点1");

SequenceFlow flow2 = new SequenceFlow(); 
flow2.setId("flow2"); 
flow2.setName("节点1-->结束节点"); 
flow2.setSourceRef("receiveTask1"); 
flow2ow1.setTargetRef("endEvent");

EndEvent end = new EndEvent();
endEvent.setId("endEvent"); 
endEvent.setName("结束节点"); 

Process process=new Process(); 
process.setId("process1"); 
process.setName("process1"); 

process.addFlowElement(start); 
process.addFlowElement(flow1); 
process.addFlowElement(receiveTask1); 
process.addFlowElement(flow2); 
process.addFlowElement(end); 

bpmnModel.addProcess(process);

repositoryService.createDeployment().addBpmnModel(bpmnModel.getProcesses().get(0).getName()+".bpmn", bpmnModel).deploy();

Наступая на яму резюме

Стратегия создания сценария базы данных

Поскольку Flowable используется в управлении версиями базы данныхLiquibaseконтроль. Итак, после автоматического создания потоковой базы данных. обязательноProcessEngineConfigurationизdatabase-schema-updateИзмените его на ложь. В противном случае, когда разные люди изменят версию flowable, структура таблицы будет обновляться автоматически. вызовет проблемы.

ID всех узлов не могут быть числами

Flowable не может быть числом в определенном узле в качестве идентификатора узла. Исключение возникает, когда число используется в качестве идентификатора узла. Стек исключений выглядит следующим образом

org.flowable.bpmn.exceptions.XMLException: javax.xml.stream.XMLStreamException: org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 6; cvc-datatype-valid.1.2.1: '1' 不是 'NCName' 的有效值。
    at org.flowable.bpmn.converter.BpmnXMLConverter.convertToBpmnModel(BpmnXMLConverter.java:273)
    at org.flowable.engine.impl.bpmn.parser.BpmnParse.execute(BpmnParse.java:148)
    at org.flowable.engine.impl.bpmn.deployer.ParsedDeploymentBuilder.createBpmnParseFromResource(ParsedDeploymentBuilder.java:97)
    at org.flowable.engine.impl.bpmn.deployer.ParsedDeploymentBuilder.build(ParsedDeploymentBuilder.java:55)
    at org.flowable.engine.impl.bpmn.deployer.BpmnDeployer.deploy(BpmnDeployer.java:76)
    at org.flowable.engine.impl.persistence.deploy.DeploymentManager.deploy(DeploymentManager.java:62)

Это конец этого вопроса. Если есть назначенные герои, пожалуйста, дайте мне знать. . . В следующем выпуске представлена ​​структура таблицы Flowable.