A necessidade de estipular prazos para que as tarefas humanas sejam realizadas é uma característica constante nos processos automatizados.
Leia nesse artigo técnico um passo-a-passo de como implementar o uso de timeout no produto Oracle BPM 11g.
1. Timeout com expiração da tarefa
Se o objetivo é expirar a tarefa, retirando-a da lista de trabalho do usuário, o timeout pode ser setado diretamente nas configurações da tarefa humana, conforme segue:
A configuração deste tipo de timeout é semelhante no caso de tarefas humanas no Oracle BPEL 11g.
1.1. Definindo o timeout
Edite o arquivo .task de definição da tarefa. Conforme exibido na Figura 1 abaixo, na definição da tarefa, na aba “Deadlines” configure para expirar conforme um número fixo de dias, horas ou minutos a partir do início da tarefa; ou relativo a algum parâmetro definido no processo.
Note que a duração de tempo relativo em XML é expressa no formato P0Y0M0DT0H0M0S (https://www.w3schools.com/Schema/schema_dtypes_date.asp). Por exemplo, P2D equivale a 2 dias, e PT60S equivale a 60 segundos.
Se for preciso fazer cálculos com datas para calcular o timeout, existem no produto funções XPath para fazer adição ou subtração de durações de tempo com datas.
1.2. Avaliando no processo como a tarefa foi encerrada
Quando a tarefa é encerrada por timeout, seu status é alterado para expirada e o processo segue adiante. Então, se for preciso tomar alguma ação ou rota específica quando ocorrer o timeout, é preciso verificar nos dados de retorno como a tarefa foi encerrada.
Primeiro, é preciso salvar os dados de execução da tarefa em um dataobject, como exibido na Figura 2 abaixo:
Depois, numa tarefa de script extraia o valor do estado da tarefa com a expressão XPath:
”string(bpmn:getDataObject(‘taskExec’)/ns:systemAttributes/ns:state)”
Se o valor do estado for igual a EXPIRED, a tarefa foi encerrada por timeout ;-)
2. Timeout sem expiração da tarefa
É comum também que seja preciso implementar controle de timeout em uma tarefa, sem no entanto encerrá-la. Por exemplo, para enviar um email de aviso de atraso.
Nesse caso, não configure o timeout na aba ”Deadlines” da definição da tarefa. Ao invés disso, adicione um evento de timer de borda na tarefa humana, como mostra a Figura 3 a seguir:
Se o prazo de expiração for único, o timer pode por exemplo ser implementado como a adição de uma determinada duração a data atual no momento de criação da atividade:
“xp20:add-dayTimeDuration-to-dateTime(string(xp20:current-dateTime()),concat(‘PT’,string(bpmn:getDataObject(‘timeout’)),’S’))”
Se o timeout deve ser com base em uma data fixa, configure o timer como sendo do tipo Time Date, como mostra a figura abaixo.
Deixe desmarcada a opção “Interrupting Event” se a tarefa NÃO deve ser encerrada ao estourar o timeout. Se marcar essa opção a tarefa será interrompida quando ocorrer o timeout!
Se o timeout deve ser executado diversas vezes, ciclicamente, então é só marcar o timer como “Cycle” e lembrar que ele não deve ser do tipo “interrupting”:
Lembre-se que sendo do tipo cíclico, o valor da expressão que tem de ser setado é novamente uma duração. Por exemplo:
concat(‘PT’,string(bpmn:getDataObject(‘timeout’)),’S’)
* Observação: as cópias de tela apresentadas são baseadas no produto Oracle BPM 11g – versão 11.1.1.4, porém as configurações citadas são igualmente válidas nas versões posteriores do produto, apenas variando um pouco o estilo das caixas de diálogo.