terça-feira, 1 de março de 2016

Exemplo de modelagem transacional

Acredito que a discussão de casos práticos agregam mais valor ao aprendizado proposto neste blog, nesse sentido resolvi criar uma série de post's com essa finalidade, que poderão ser identificados através do marcador "Exemplo".
Neste primeiro post vamos analisar um exemplo de modelagem transacional. O problema a ser resolvido esta relacionado a um processo hipotético de requisição de viagem:
"Quando um pedido de viagem é realizado, é necessário fazer reservas para a passagem aérea, hospedagem e veículo. A reserva somente poderá ser considerada como concluída caso todas as reservas mencionadas forem realizadas. Caso algum reserva não seja completada com sucesso, todas as outras reservas, mesmo as já realizadas, devem ser canceladas."
O primeiro passo é identificar que o problema relata uma transação. A parte do texto que nos traz essa informação é "...Caso algum reserva não seja completada com sucesso, todas as outras reservas, mesmo as já realizadas, devem ser canceladas."  A partir dessa informação percebemos que o processo necessita de uma modelagem (abordagem) transacional, isto é, o processo será concluído quando todas as operações são bem sucedidas ou, caso haja algum problema, as operações bem sucedidas devem ser canceladas.

Figura 1.
O processo descrito acima pode ser modelado com três tarefas: "Solicitar viagem", "Realizar Reserva" que optamos por transformar em um sub-processo do tipo transacional (devido os três tipos de reservas: passagem, hospedagem e veículo) e "Informar dados das reservas". Assim como exibido na Figura 1.



Pela descrição do processo, percebemos que o pedido de viagem somente poderá ser considerado concluído caso todas as reservas sejam realizadas, nesse sentido vamos anexar um evento de cancelamento ao sub-processo para prever essa situação (cancelamento do pedido devido a impossibilidade de realizar todas as reservas) e incluir uma tarefa de informar a falha ao solicitante. Para tanto basta clicar com o botão direito do mouse no sub-processo e selecionar a opção "Anexar Evento -> Cancelar". Note que esta opção somente estará disponível se o sub-processo for do tipo transação (clique com o botão direito do mouse no sub-processo e selecione a opção "É transação"). Agora nosso modelo deve ter o mesmo aspecto da Figura 2. 

Figura 2.
Perceba que podemos anexar vários tipos de evento ao sub-processo, por como: "Erro" para notificar ao solicitante quando um erro for identificado no processo de realizar a reserva; "Timer" para notificar ao gestor quando faltarem alguns dias para a viagem e o processo de realizar reserva não tiver sido concluído, etc. Neste exemplo, não precisaremos de nenhum outro evento.


Agora vamos modelar as atividades do sub-processo responsáveis pela reserva da passagem, hospedagem e veículo. Supondo que não exista alguma ordem específica para realizar as tarefas, incluiremos um Gateway paralelo para executar as reservas, conforme figura 3.
Figura 3.
Para modelarmos o comportamento "Caso algum reserva não seja completada com sucesso, todas as outras reservas, mesmo as já realizadas, devem ser canceladas." devemos anexar, em cada tarefa, um evento de compensação para disparar o cancelamento da reserva realizada. Note que ao criar o evento de compensação o BizAgi já cria a tarefa de compensação, que neste exemplo será a de cancelamento da respectiva reserva, conforme figura 4.
Figura 4.

Agora nosso modelo está completo. O sub-processo contem ações que compensem (cancelem) as reservas que já foram realizadas, e o Processo "Pai" contem o fluxo de tarefa "Informar falha na reserva ao solicitante" a ser realizado se o sub-processo (Realizar reserva) falhar em ser executado.