Enviando Eventos entre Workflows

O artigo de hoje vou falar um pouco sobre como enviar eventos de um workflow para outro workflow, não necessariamente sendo um sub-workflow. É um cenário que acredito que não seja muito comum, porem trabalhei recentemente num projeto que essa solução serviu como uma luva!

Cenário

Existia um workflow A que poderia criar dinâmicamente n Catalog Tasks nele. E cada uma dessas Tasks deveria executar seu próprio workflow (B). Quando esse cenário ocorresse, o workflow A deveria aguardar o término de todos os workflows de suas tarefas filhas parece que ele prosseguisse com seus próximos passos.

A solução mais óbvia seria colocar no Workflow A um step de “Wait for Condition” aonde você faria uma query simples vendo se existem tarefas abertas associadas àquele RITM. Porém nosso workflow B tinha uma série de particularidades que inviabilizaram essa abordagem:

  1. A tabela base do Workflow A era sc_req_item enquanto do Workflow B era sc_task.
  2. Workflow B também criava Catalog Tasks adicionais sob seu registro principal (parents diferentes).

Dando nomes aos bois, poderíamos ter o seguinte cenário

RecordRequest ItemParent
RITM123REQ789
SCTASK111RITM123RITM123
SCTASK222RITM123RITM123
SCTASK333RITM123SCTASK222
Perceba que o parent do ticket SCTASK333, apesar de estar vinculado ao RITM123, é a SCTASK222!

E nestas condições, aquele step de Wait for Condition simplesmente não detecta que a SCTASK222 foi fechada, e o workflow fica preso para sempre nesta fase! Então basicamente eu precisava bolar um jeito de avisar o Workflow A de que o Workflow B havia terminado.

A solução foi combinar 2 recursos que eu nunca tinha usado antes:

  1. Step de “Wait for WF Event” no Workflow A.
  2. Envio de um evento de WF via BroadcastEvent no Workflow B

Vamos aos detalhes de cada uma dessas partes.

Step de Wait for WF Event

Esse step é uma versão simplificada do Wait for Condition. Você apenas precisa definir um nome de evento que o step ficará aguardando para que o fluxo possa prosseguir.

Defina o nome do evento no campo “Wait for Event” e pronto!

Não confundir este evento de workflow com Eventos(sys_event) do ServiceNow! Este evento que estamos detalhando agora existe apenas dentro do contexto do workflow!

Workflow BroadcastEvent

Este método da classe Workflow faz exatamente o que esperamos. Envia um evento para uma instancia ativa de workflow. Veja o código a seguir:

// Carregamos o registro que queremos notificar o WF
var gr = new GlideRecord('sc_req_item');
gr.get(current.request_item);
// Instanciamos a classe Workflow e listamos as instancias ativas de WF deste registro
var wf = new Workflow().getRunningFlows(gr);
while(wf.next()) {
	// Para cada instancia encontrada, envie um WF Event chamado "my_wf_event"
	new Workflow().broadcastEvent(wf.sys_id, 'my_wf_event');
}

Com o código acima localizado no Workflow B, podemos recuperar o RITM relacionado a task em execução, e enviamos para o Workflow A o evento que ele está aguardando para continuar sua execução!

Legal demais né?

Leave a Reply

Your email address will not be published. Required fields are marked *