Течет от входа к входу
Автор: Рыбалка на холодной реке Снег в одиночку
Один меч, одно вино, одна река и одно озеро, такова эта жизнь.
Если у вас в сердце есть картина, зачем вам зажигать лампу? Пожалуйста, указывайте источник при загрузке
Предыдущий портал:
Введение
В настоящее время многие люди вокруг знакомы с текучестью и даже инвестировали в нее.
生产
использовать эту статью как抛砖引玉
использовать. Приглашаю вас героев исправить.
Если вы что-то знаете о механизмах рабочих процессов, то вы должны знать, что текущие основные механизмы рабочих процессов в области 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.