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:
- A tabela base do Workflow A era sc_req_item enquanto do Workflow B era sc_task.
- 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
Record | Request Item | Parent |
---|---|---|
RITM123 | REQ789 | |
SCTASK111 | RITM123 | RITM123 |
SCTASK222 | RITM123 | RITM123 |
SCTASK333 | RITM123 | 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:
- Step de “Wait for WF Event” no Workflow A.
- 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.

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é?