Workflow - Manual do Usuário > Modelador > Modelagem > BPMN > Compensação

Compensação

 

Compensação é a ação de desfazer as etapas do processo que já foram concluídas com sucesso. Isto ocorre quando alguma atividade do processo falha e não é necessário manter o que foi executado com sucesso até então. Se a atividade ainda está em execução, sofreu algum erro não contornado ou ainda não foi executada, ela não pode ser compensada.

No momento em que a compensação de uma atividade é iniciada, essa atividade passar a ter acesso aos dados do processo do momento em que a atividade que está sendo compensada foi concluída.

A compensação pode ser acionada através de um Evento intermediário de compensação ou através do fluxo padrão de tratamento de erros. Mais detalhes sobre o acionamento da compensação em cada tipo de Atividade (Tarefa e Subprocesso). Quando a compensação é acionada ela pode ser capturada por um Compensation Handler.

 

Compensation Handler

O Compensation handler é uma Atividade utilizada para compensar o trabalho realizado em outra Atividade, à qual está associada ou inserida.

 

Utilizando a compensação em Tarefas

 

Segue como utilizar compensação em tarefas:

 

Modelagem

A compensação das tarefas é feita sempre de forma síncrona e pode ser definida como sendo de um dos seguintes tipos:

Estas tarefas podem ser automatizadas através do performer Web service do Middleware, Web service genérico e Web service do SeniorTools.

 

Execução

A compensação é executada quando:

1. Chamada explicitamente no escopo em que a tarefa está inserida, podendo ser por:

2. Chamada explicitamente no escopo em que a tarefa está inserida, podendo ser por:

O processamento da compensação é feito executando a tarefa de compensação associada ao Compensation Handler.

Nota

  • Ocorrendo algum erro durante a execução da compensação, esse erro é tratado como qualquer outro erro.
  • Tarefas que não foram executadas com sucesso não são compensadas.
  • A tarefa de compensação recebe um espelho dos dados de saída da tarefa a ser compensada, sem considerar as variáveis locais.

 

Utilizando a compensação em Subprocessos

O subprocesso de evento do tipo compensação é iniciado com um evento inicial de compensação. Estes podem ser utilizados apenas em subprocessos e o evento final deve ser um evento final do tipo simples. Pode existir apenas um subprocesso de compensação em subprocessos e nenhum no processo. O subprocesso não possui eventos de borda de compensação.

Este subprocesso não possui conexões com os demais elementos, por isto não possui fluxos de sequência de entrada e nem de saída. O subprocesso é executado nos seguintes casos:

  1. Quando chamados explicitamente por um evento intermediário (o nome do evento intermediário e do evento inicial do subprocesso devem ser iguais).
  2. Quando chamado pelo fluxo de tratamento de erro padrão. O fluxo de tratamento de erro padrão poderá ter 2 comportamentos em relação a compensação:
    1. Se houver um subprocesso de compensação ele é executado
    2. Caso contrário, todas as atividades concluídas com sucesso até o momento são compensadas

O processamento da compensação é feito da seguinte maneira:

  1. Se houver um Sub-Process de compensação , este é executado;
  2. Se não houver, todas as atividades concluídas com sucesso que possuirem um Compensation Handler são compensadas;

Caso ocorra algum erro durante a execução da compensação esse erro será tratado como qualquer outro erro ocorrido na execução.

Nota

O Sub-process a qual a compensação estava sendo executada, onde ocorreu o erro, passa do status interno de Compensando para Falhou. Esse sub-processo estando com o estado interno diferente de Executado com sucesso, a compensação daquela execução do Sub-Process não será mais executada.

  • Caso este Sub-Process esteja executado em um loop, as demais execuções dele continuam com seu estado interno original, o que não impede as suas respectivas compensações, que possam vir a ocorrer.
  • Os estados citados acima são estados controlados internamente pela engine de execução do Workflow e não são visíveis e nem relevantes para controle do usuário ou desenvolvedor, servem apenas a critério de informação.

Exemplo:

No exemplo acima, temos um processo de Efetuar reservas, neste processo existe uma tarefa para o usuário realizar o seu cadastro, na sequência um Subprocesso (o elemento Reserva) que efetivamente realiza a reserva de hotel e passagem e, após isso, efetua o pagamento das reservas. Note que na tarefa de Efetuar o pagamento existe um Evento de borda do tipo erro, esse evento desvia o fluxo do processo para um Evento intermediário de compensação que consequentemente chama a compensação da atividade Reservar (Subprocesso Reserva).

Sobre o subprocesso de compensação (Compensa reserva), este foi definido para sobrescrever a compensação padrão dos elementos do Subprocesso em que está inserido. Isso pois, no momento da compensação não basta apenas compensar as tarefas de Reservar hotel e Reservar passagem, nesse caso é necessário também chamar a tarefa de Atualizar dados do cliente. Caso não fosse necessário fazer esse passo a mais, esse subprocesso de compensação não precisaria ser definido e poderia ser mantido o tratamento padrão da compensação explicado acima.

 

Este artigo ajudou você?