Subprocesso Activiti 6.0 (doze)

índice

I. Visão geral

Em segundo lugar, o subprocesso

1. Subprocesso incorporado

2. Invoque o subprocesso

3. Subprocesso do evento

Três, resumo


I. Visão geral

Subprocessos são atividades que incluem outras atividades, gateways, eventos, etc., que constituem um processo e são parte de um processo maior. O subprocesso é completamente definido no processo pai (é por isso que muitas vezes é chamado de subprocesso incorporado), o subprocesso também é um requisito comum em cenários de negócios reais.

A Activiti fornece a implementação de três subprocessos, que são  subprocessos incorporados, subprocessos de chamada e subprocessos de evento , que são apresentados a seguir.

Em segundo lugar, o subprocesso

1. Subprocesso incorporado

Correspondendo a no app Activiti

O chamado subprocesso embutido, ou seja, o elemento do subprocesso <subProcess> está embutido no elemento do processo principal <processo> , e só pode ser usado no processo principal, e não pode ser chamado por processos externos. Esses subprocessos geralmente são tratados como lógica geral parcial ou atendem a requisitos de negócios específicos, o que faz com que o processo principal pareça mais intuitivo. O fluxograma é o seguinte:

xml é:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 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" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
  <process id="mainProcess" name="主流程" isExecutable="true">
    <startEvent id="startEvent1"></startEvent>
    <userTask id="sid-4C9AE06D-43FA-4325-80D5-038F495B46EE" name="子流程前" activiti:assignee="test">
      <extensionElements>
        <modeler:activiti-idm-assignee xmlns:modeler="http://activiti.com/modeler"><![CDATA[true]]></modeler:activiti-idm-assignee>
        <modeler:assignee-info-firstname xmlns:modeler="http://activiti.com/modeler"><![CDATA[test]]></modeler:assignee-info-firstname>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <subProcess id="sid-48411614-B7F9-40F3-8154-4EC64E8E4365" name="子流程调用">
      <startEvent id="sid-5BC16FA2-D258-46C8-91E3-D4E615343637"></startEvent>
      <userTask id="sid-05726644-A733-4206-BBB7-4D79B3589ED2" name="子流程环节" activiti:assignee="test">
        <extensionElements>
          <modeler:activiti-idm-assignee xmlns:modeler="http://activiti.com/modeler"><![CDATA[true]]></modeler:activiti-idm-assignee>
          <modeler:assignee-info-firstname xmlns:modeler="http://activiti.com/modeler"><![CDATA[test]]></modeler:assignee-info-firstname>
          <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
        </extensionElements>
      </userTask>
      <endEvent id="sid-FB91A674-6633-445D-B4D7-02D8E8BA3992"></endEvent>
      <sequenceFlow id="sid-CC480E20-B61F-4B32-8A16-FC7B724AE4A9" sourceRef="sid-5BC16FA2-D258-46C8-91E3-D4E615343637" targetRef="sid-05726644-A733-4206-BBB7-4D79B3589ED2"></sequenceFlow>
      <sequenceFlow id="sid-D330D43B-09C9-4812-9A80-CAE62F365356" sourceRef="sid-05726644-A733-4206-BBB7-4D79B3589ED2" targetRef="sid-FB91A674-6633-445D-B4D7-02D8E8BA3992"></sequenceFlow>
    </subProcess>
    <sequenceFlow id="sid-A3FBD323-DB9C-48DA-86B4-7723033E3DB3" sourceRef="startEvent1" targetRef="sid-4C9AE06D-43FA-4325-80D5-038F495B46EE"></sequenceFlow>
    <sequenceFlow id="sid-C669A38C-6A62-4F59-8BFF-40D83FA002C2" sourceRef="sid-4C9AE06D-43FA-4325-80D5-038F495B46EE" targetRef="sid-48411614-B7F9-40F3-8154-4EC64E8E4365"></sequenceFlow>
    <userTask id="sid-99E4B39D-36AF-4AE6-B50A-0ECB1CECB67C" name="子流程后" activiti:assignee="$INITIATOR">
      <extensionElements>
        <modeler:activiti-idm-initiator xmlns:modeler="http://activiti.com/modeler"><![CDATA[true]]></modeler:activiti-idm-initiator>
      </extensionElements>
    </userTask>
    <endEvent id="sid-B84A10E5-94AB-4A2F-81C7-708C62421D8D"></endEvent>
    <sequenceFlow id="sid-65ED0CA3-AB95-4788-9D33-26DC86A36BE3" sourceRef="sid-48411614-B7F9-40F3-8154-4EC64E8E4365" targetRef="sid-99E4B39D-36AF-4AE6-B50A-0ECB1CECB67C"></sequenceFlow>
    <sequenceFlow id="sid-27DD695B-3F82-4F7D-8860-979461364E7A" sourceRef="sid-99E4B39D-36AF-4AE6-B50A-0ECB1CECB67C" targetRef="sid-B84A10E5-94AB-4A2F-81C7-708C62421D8D"></sequenceFlow>
  </process>
</definitions>

Pode-se ver que o elemento <subProcess> está no mesmo nível que os outros elementos do processo principal. Como atributo exclusivo do processo principal, ele possui essencialmente apenas um processo. Portanto, você pode usar a chave do principal processo para consultar as tarefas e outras informações do subprocesso, e as variáveis ​​do subprocesso principal. As informações também são compartilhadas.

2. Invoque o subprocesso

Correspondendo a no app Activiti

A chamada invocação de um subprocesso significa que a implementação de um processo precisa ser definida com antecedência e, em seguida, o id do processo é referenciado no processo principal para concluir a incorporação. Este método é mais flexível e fácil de reutilizar, portanto também é o método mais comumente usado no uso de subprocessos. O processo é usar a tag <callActivity> para chamar, o fluxograma simples é o seguinte:

Sua configuração principal inclui o  processo referenciado pelo link do subprocesso e a transferência de variável dentro e fora do subprocesso:

O elemento de referência pode ser um id de um processo externo ou pode ser uma variável, que é passada dinamicamente

O In acima se refere à configuração de transferência de variável quando o processo principal entra no subprocesso, Source representa o nome da variável passado pelo processo principal, Target representa o nome da variável recebido pelo subprocesso e há uma configuração de Out para o mesma razão.

O xml finalmente salvo é o seguinte:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 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" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
  <process id="callActivity" name="调用子流程" isExecutable="true">
    <startEvent id="startEvent1"></startEvent>
    <userTask id="sid-D0BEEE15-A6E8-4077-ACA7-D8C284546BCF" name="子流程前" activiti:assignee="test">
      <extensionElements>
        <modeler:activiti-idm-assignee xmlns:modeler="http://activiti.com/modeler"><![CDATA[true]]></modeler:activiti-idm-assignee>
        <modeler:assignee-info-firstname xmlns:modeler="http://activiti.com/modeler"><![CDATA[test]]></modeler:assignee-info-firstname>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <callActivity id="sid-735E518C-DD33-4BD3-A6FA-7A8FEB3A90EF" name="子流程调用" calledElement="simpleModel" activiti:inheritVariables="false">
      <extensionElements>
        <activiti:in source="mainVariable" target="subVariable"></activiti:in>
        <activiti:out source="sub" target="main"></activiti:out>
      </extensionElements>
    </callActivity>
    <endEvent id="sid-333CC74E-46FF-4AB9-8A08-884AD012C90E"></endEvent>
    <sequenceFlow id="sid-E4EE4AE4-E56F-49F3-8AF7-864A76688581" sourceRef="startEvent1" targetRef="sid-D0BEEE15-A6E8-4077-ACA7-D8C284546BCF"></sequenceFlow>
    <sequenceFlow id="sid-99564510-9859-4C04-BBC6-8E1F284AC242" sourceRef="sid-D0BEEE15-A6E8-4077-ACA7-D8C284546BCF" targetRef="sid-735E518C-DD33-4BD3-A6FA-7A8FEB3A90EF"></sequenceFlow>
    <sequenceFlow id="sid-254EBB4A-B061-49AC-9DD7-82B6B24751B5" sourceRef="sid-735E518C-DD33-4BD3-A6FA-7A8FEB3A90EF" targetRef="sid-333CC74E-46FF-4AB9-8A08-884AD012C90E"></sequenceFlow>
  </process>
</definitions>

Você pode ver que as principais tags xml do subprocesso de chamada são: <callActivity /> e seus atributos chamadosElement, <activiti: in />, <activiti: out />.

Visto que os subprocessos principais são instâncias diferentes, a chave do subprocesso precisa ser usada para consultar ao consultar as subtarefas.

Nota: Quando o fluxo do processo é transferido para o subprocesso, a chave de negócios do subprocesso, que é Business_key, está vazia. Se você precisa ser consistente com o processo principal, você precisa usar o listener de tarefas. a forma de variáveis, primeiro obtenha o processo principal no ouvinte. Em seguida, use isso para atualizar a chave de negócios do subprocesso.

3. Subprocesso do evento

Correspondendo a no app Activiti

Um subprocesso de evento refere-se a um subprocesso acionado por um evento. Pode existir no nível do processo ou no nível do subprocesso. O evento usado para acionar o subprocesso do evento é configurado usando eventos de início. Portanto, início vazio eventos não são permitidos no subprocesso de eventos, ao mesmo tempo que não permite nenhum fluxo de sequência de entrada e saída.

Quando o escopo do host do subprocesso de evento (instância de processo ou subprocesso) é criado, uma assinatura para o evento de início é criada e, quando o escopo é destruído, a assinatura é excluída.

Três, resumo

Subprocesso integrado: O subprocesso principal é essencialmente a mesma instância de processo, compartilhando dados

Invocando o subprocesso: O subprocesso principal é uma instância diferente, mas pode ter um identificador de negócios exclusivo por meio do método de ouvinte, e a tarefa do subprocesso não pode ser consultada por meio da chave do processo principal, mas pode ser consultado através da chave de negócios

Em uso real, os subprocessos fornecidos pela Activiti não atenderão a alguns requisitos de negócios reais, como suspender e retomar, etc., que podem ser implementados usando tarefas manuais.

Acho que você gosta

Origin blog.csdn.net/m0_38001814/article/details/104275293
Recomendado
Clasificación