jBPM - Sincronização entre Processos e Aplicativos – Parte IV

Crie e modifique aplicações a partir dos diagramas de processos de negócios da empresa utilizando um framework Java

Cristiano Terra Palazzo

Estudo de caso

Neste nosso estudo de caso, foi elaborada uma aplicação na qual um usuário preenche uma requisição de produto, informando o que deseja e para quando.

No segundo passo do processo, outro usuário poderá solicitar mais informações da solicitação (caso não tenha tido clareza no pedido) e desta forma o primeiro usuário precisará completar o pedido. Depois de compreendido o pedido, o próximo passo será a aceitação ou recusa do pedido. Para a primeira opção será informada a data da entrega e para a segunda opção será informado o motivo da recusa.

Diagrama de fluxo de processo

 

cpjbpmcmfig12.jpg

Figura 12. Diagrama do Estudo de Caso

Implementação

Apresentarei como serão preenchidas as configurações de dois objetos, o objeto Pedidos (um estado de início) e o objeto Conferência (uma tarefa).

Pedidos:

Acesse a aba Outline. Clique com o botão direito sobre o icone do Pedidos e escolha a opção Add Task. Agora acesses as propriedades da tarefa que foi criada.

Na tela “Properties for task” que surge, no item General informe o nome da tarefa (Preencher Requerimento). No item Assignment escolha uma Swimlane selecione a swimlane que foi criada para o projeto. Veja no XML listado abaixo a Etapa 1.

No item Controller deverão ser criados os campos que serão preenchidos pelo usuário nesta tarefa. No nosso exemplo criaremos os campos Descrição e Data para Entrega (ambos do tipo read e write, sendo a Descrição também do tipo required). Finalize clicando no botão OK.

Agora configuraremos o nó Conferência. Na aba Outline localize o objeto, clique novamente com o botão direito sobre ele e escolha a opção Add Task. Acesse a propriedade desta tarefa e preencha o General com o nome da tarefa (Vefiricar Pedido), o Assignment com a mesma Swimlane do Pedidos e no Controller crie os mesmos campos (Descrição e Data para Entrega) do objeto Pedidos, porém marque apenas as opções read e write. Os campos dever ser escritos com os mesmos nomes. Isto fará com que o que for preenchido na tarefa anterior seja exibido nesta, e não poderá ser alterado. Veja no XML listado abaixo a Etapa 2.

Como as transições já estão desenhadas, não é necessário fazer nenhuma configuração adicional.

Na Figura 13 podemos ver como a tarefa de início (Pedidos) será exibida. Como a tarefa segue para apenas outra, o botão para conclusão é o “Save and Close Task”.

cpjbpmcmfig13.jpg

Figura 13. Tarefa de início (Pedidos)

E abaixo (Figura 14) temos a imagem da tarefa Conferência. Como o usuário terá a opção de pedir mais informações sobre o pedido, ou encaminhá-lo para aprovação, nesta tarefa tem dois botões: “Solicitar Complemento” ou “Solicitar Aprovação”.

cpjbpmcmfig14.jpg

Figura 14. Tarefa Conferência

Segue abaixo o código XML gerado pelo framework, a partir do diagrama desenhado acima. O xml é bidirecionalmente sincronizado com o diagrama (ao fazer alteração em um deles instantaneamente a mudança é refletida no outro).

Listagem 1. XML da definição de processos

<?xml version="1.0" encoding="UTF-8"?>

<process-definition

xmlns="urn:jbpm.org:jpdl-3.1" name="Requisicoes">

<swimlane name="Inicio">

<assignment expression=""></assignment>

</swimlane>

<start-state name="Pedidos">

<task name="Preencher requerimento" swimlane="Inicio">

<controller>

<variable name="Descrição" access="read,write,required"></variable>

<variable name="Data para entrega"></variable>

</controller>

</task>

<transition name="Conferir" to="Conferência">

</transition>

</start-state>

<task-node name="Conferência">

<task name="Verificar Pedido" swimlane="Inicio">

<controller>

<variable name="Descrição" access="read"></variable>

<variable name="Data para entrega" access="read"></variable>

</controller>

</task>

<transition name="Solicitar Aprovação" to="Aprovação"></transition>

<transition name="Solicitar Complemento" to="Complemento"></transition>

</task-node>

<task-node name="Complemento">

<task name="Complementar Pedido" swimlane="Inicio">

<controller>

<variable name="Descrição"></variable>

<variable name="Data para entrega"></variable>

<variable name="Detalhamento do Pedido" access="read,write,required"></variable>

</controller>

</task>

<transition name="" to="Conferência"></transition>

</task-node>

<task-node name="Aprovação">

<task name="Aprovação" swimlane="Inicio">

<controller>

<variable name="Descrição" access="read"></variable>

<variable name="Data para entrega" access="read"></variable>

<variable name="Detalhamento do Pedido" access="read"></variable>

</controller>

</task>

<transition name="Aprovar" to="Previsão"></transition>

<transition name="Recusar" to="Motivo Recusa"></transition>

</task-node>

<task-node name="Motivo Recusa">

<task name="Motivo da Recusa" swimlane="Inicio">

<controller>

<variable name="Descrição" access="read"></variable>

<variable name="Data para entrega" access="read"></variable>

<variable name="Detalhamento do Pedido" access="read"></variable>

<variable name="Motivo da recusa" access="read,write,required"></variable>

</controller>

</task>

<transition name="Finalizar" to="end1"></transition>

</task-node>

<task-node name="Previsão">

<task name="Previsão de Entrega" swimlane="Inicio">

<controller>

<variable name="Descrição" access="read"></variable>

<variable name="Data para entrega" access="read"></variable>

<variable name="Detalhamento do Pedido" access="read"></variable>

<variable name="Data prevista para entrega" access="read,write,required"></variable>

</controller>

</task>

<transition name="Finalizar" to="end1"></transition>

</task-node>

<end-state name="end1"></end-state>

</process-definition>

 

Implantação no Jboss e telas de demonstração

Para implantar este teste inicialmente é necessário inicializar o servidor JBoss.

Em seguida, acesse o projeto e clique na aba Deployment.

Nesta aba é feita a configuração do Server Name, Server Port e Server Deployer.

Para verificar se o servidor está funcionando corretamente, clique no botão Test Connection.

Estando correto o funcionamento, basta clicar no botão Deploy Process Archive para que seja feita a implantação do projeto.

Para testar o projeto é necessário acessar um navegador e digitar o caminho apropriado, como por exemplo, localhost:8080/jbpm (Server Name:Server Port/jbpm).

Clique em Log In e na próxima tela que surge escolha o link do processo desejado, no nosso exemplo é o Preencher Requerimento. Basta preencher os campos e escolher os botões apropriados em cada uma das tarefas.

Conclusão

O jBPM é uma ferramenta que se propõe a diminuir a dificuldade na adoção de um determinado padrão de processo de negócios (BPEL, XPDL, etc) e ao mesmo tempo prover um ambiente de execução de processos robusto e confiável.

Possui ferramenta gráfica para desenvolvimento e implantação através de um plugin Eclipse, tem suporte a vários bancos de dados, pode ser integrado a uma aplicação Java Standalone, ao JBoss ou a outros servidores de aplicação. Tem uma interface web para interação com usuários e já se encontra em um estágio maduro quanto à implementação.

Unindo esses e outros pontos positivos pode-se afirmar que o jBPM é hoje uma das mais importantes ferramentas para o desenvolvimento de aplicativos com suporte à BPM e que a demanda por estes aplicativos tende a crescer muito pois é um grande desejo dos gerentes de negócios conseguir acoplar por inteiro seus processos aos sistemas computacionais.

Vale ressaltar que ela colabora muito com o desenvolvedor de uma nova aplicação cuja elaboração já será sob a idéia de manter um gerenciamento dos processos, tornando o desenvolvimento de acordo com os processos do negócio muito intuitivos e precisos.

Por outro lado, se a aplicação já está pronta, unir um fluxo desenvolvido em jBPM à essa aplicação não será uma tarefa muito trivial, podendo ser um pouco mais simples de ser executada se a aplicação foi desenvolvida em Java, e tornando-se quase impossível se ela está em uma outra linguagem, principalmente uma que não seja orientada a objetos.

 

Referências:

http://www.jboss.com/products/jbpm/stateofworkflow
http://docs.jboss.org/jbpm/v3/userguide/graphorientedprogramming.html
http://www.jbpm.org

Leia todos artigos da série