Looplex Knowledge Base

Trabalhando com Timers no Flowable

Contexto

- Durante o desenho do seu fluxo de trabalho, pode ser necessária a utilização de “timers” para a execução de alguma tarefa.

Exemplos

- Quero que uma tarefa seja executada 15 dias antes da data de vencimento de um contrato.
- Quero que um e-mail de lembrete seja enviado a cada meia hora após o início da tarefa enquanto o responsável não a cumprir.

Eventos de tempo (Timer Events)

Você pode definir um evento de Timer na engine do Flowable usando um Timer Event, representado pelo ícone de um relógio.

Ele pode ser um Start timer event (evento que inicia o fluxo), um Intermediate timer catching event (evento intermediário que é disparado durante o fluxo) ou um Boundary Timer Event (evento que é executado no contexto de uma tarefa ou subprocesso). Ilustrando:

  • Start timer event: Você quer que um fluxo seja iniciado sempre à meia noite, todos os dias. Então, usa um Start timer event definindo como gatilho que o horário “meia noite” seja alcançado;
  • Intermediate timer catching event: Você iniciou o fluxo e em uma das etapas vc precisa que um e-mail seja enviado sempre que faltar 15 dias para o contrato vencer. Para isso, define um intermediate timer catching event que pega a data de vencimento e calcula 15 dias antes dela, usando a nova data como gatilho para o envio do e-mail;
  • Boundary Timer Event: Você iniciou um subprocesso em que uma lista de subsídios foi enviada para áreas diferentes da empresa, de forma que forneçam as informações necessárias. Se a área não cumprir a tarefa imediatamente, vc deve mandar um e-mail a cada meia hora cobrando o cumprimento daquela atividade. Para fazer isso, você terá que usar um boundary timer event que dispara esse e-mail.

Definindo os Timers

Ao inserir um Timer Event e selecioná-lo no Flowable Modeler, você terá as seguintes informações disponíveis:

Imagem da pasta 'packages'

Para definir o nosso Timer Event, podemos usar os campos a seguir, dependendo do que queremos fazer. Para usar uma variável de execução do fluxo você pode usar a sintaxe ${variavel}.

  • Time cycle (e.g. R3/PT10H): Ciclo em que esse timer será ativado em uma repetição. No exemplo em parênteses, seria um ciclo repetido por 3 vezes, em intervalos de 10 horas. Você pode ainda adicionar mais um parâmetro aqui com a data final (R3/PT10H/${EndDate}). Se a data final for alcançada, novas atividades não serão criadas. Para o Time Cycle você ainda pode usar notações de cron, sendo que há ainda um símbolo adicional no começo no caso do Flowable que representa segundos, ao passo que no cron para Unix o primeiro campo de cron é de minutos, dessa forma:

    Imagem da pasta 'packages'

    Dessa forma, a seguinte expressão será disparada a cada 5 minutos (primeiro 0 diz respeito a segundos, e a notação */n indica que a ação será repetida a cada n intervalos de tempo, no caso, a cada 5 minutos):

    0 0/5 * * * ?

  • Time date in ISO-8601: Essa é uma data específica.

  • Time duration (e.g. PT5M): Duração que o timer terá antes de ser ativado. No exemplo em parênteses, o timer irá contar 5 minutos antes de disparar.

  • Para mais informações sobre o formato ISO-8601, você pode consultar aqui: https://en.wikipedia.org/wiki/ISO_8601

Manipulando Timer Events

Você pode precisar realizar operações mais complexas para calcular uma determinada data a partir de parâmetros do seu fluxo de trabalho, que não sejam possíveis de executar apenas com os parâmetros pré-existentes no time cycle, time date ou time duration.

Para fazer isso, podemos criar uma tarefa de scripts antes do evento de timer e ali manipular as variáveis do fluxo como entendermos melhor:

Imagem da pasta 'packages'

Na script task devemos selecionar o formato do script (groovy funciona bem com a execução Java do Flowable, mas é possível usar javascript também).

Imagem da pasta 'packages'

E, finalmente, podemos manipular a data desejada usando o script, como:

- import java.time.*
- LocalDateTime today = LocalDateTime.now().plusMinutes(5);
- execution.setVariable("notifyDate",today.toString());

Em nosso código importamos a library time, pegamos a data/horário atual e adicionamos 5 minutos. Depois, definimos uma variável no fluxo executado com esse valor.

Na tarefa de timer subsequente, podemos usar o Timer Date como ${notifyDate} e pronto!

Edit this page on GitHub