jBPM5 - Guia rápido
JBPM significa "Java Business Process Management". É um produto JBoss que é uma estrutura de código aberto. Antes de prosseguirmos, vamos primeiro definir um processo de negócios.
O que é um processo de negócios?
Por definição, um processo de negócio é uma sequência de tarefas que ocorrem em uma ordem repetível, executada por humanos e / ou sistemas para atingir um objetivo de negócio. Ele descreve a ordem (usando um fluxograma) em que uma série de etapas precisa ser executada. Um processo de negócios pode melhorar significativamente a visibilidade e agilidade de uma lógica de negócios.
Vamos dar um exemplo. A captura de tela a seguir descreve um fluxo de trabalho / fluxograma com o qual a maioria dos profissionais de TI pode se relacionar. É um processo comum seguido na maioria das organizações para avaliar os funcionários com base em seu desempenho.
O processo ocorre na seguinte ordem -
Os funcionários se autoavaliam e enviam o relatório aos gerentes de projeto.
Seu desempenho é então avaliado pelo Gerente de Projeto e pelo Gerente de RH. Com base na avaliação, eles dão uma nota aos funcionários.
A avaliação final ou feedback de desempenho é então retransmitido aos funcionários.
Esse processo é aplicável a quase todos os funcionários e, portanto, é um bom exemplo para entender um processo de negócios. É uma sequência de tarefas e acontece em uma ordem específica.
O que é jBPM?
O processo de negócios é um conceito chave para entender qualquer estrutura organizacional. Uma tecnologia como o jBPM ajuda a gerenciar processos de negócios complexos de forma eficiente. JBPM é uma ferramenta que pode orquestrar um processo de negócios de forma eficaz. Geralmente, cada aplicativo de nível corporativo terá uma sequência de tarefas que são executadas em uma ordem específica e esses processos podem ser orquestrados com a ajuda do jBPM.
A beleza do jBPM é que ele é semelhante a um fluxograma. Ele também pode ser facilmente compreendido por analistas de negócios. O jBPM pode ser incorporado em um aplicativo Java e executado como um serviço.
Recursos do JBPM
O jBPM é um mecanismo de processo leve, de código aberto e totalmente incorporável escrito em Java. Seus recursos mais notáveis estão listados abaixo -
O jBPM executa processos de negócios que são projetados usando as especificações BPMN 2.0.
O jBPM pode ser totalmente integrado ao Eclipse e IDEs semelhantes para fornecer suporte de arrastar e soltar para criar um fluxo de trabalho.
O jBPM possui ferramentas de UI disponíveis para envolver analistas de negócios e usuários desde a fase de design.
O jBPM suporta persistência e gerenciamento de transações com a ajuda de JPA e JTA.
É possível definir manipuladores de itens de trabalho personalizados para criar uma tarefa definida pelo usuário que pode ser usada como um componente posteriormente para outros fluxos de trabalho.
A seguir estão os pré-requisitos para instalar o plugin jBPM -
- Java 1.5 (ou superior) SE JDK
- Eclipse 4.2 ou qualquer versão e o plugin jBPM
Como o jBPM é escrito em Java, abordaremos como adicionar os plug-ins desejados nesta seção. Considerando que o máximo de usuários de Java usa o Eclipse, vamos ver como adicionar o plugin jBPM no Eclipse.
Baixe os binários a partir do seguinte link - http://download.jboss.org/drools/release/5.3.0.Final/
Não se confunda ao ver Drools aqui. Os mesmos plug-ins são usados para jBPM. Se você já instalou o plug-in Drools, pode pular as etapas de instalação.
Extraia-o para o seu disco rígido. Em seguida, inicie o Eclipse e vá para Ajuda → Instalar Novo Software.
Clique Add Repository -
Clique no Local botão e selecione "... / binaries / org.drools.updatesite" (onde você baixou em sua máquina)
Selecione Drools and jBPM e clique no Next botão.
Clique novamente Next e selecione “Aceito os termos do contrato de licença” e clique em Finish. A instalação do software começa -
Após a instalação bem-sucedida, você obterá a seguinte caixa de diálogo -
Clique Yes. O Eclipse é reiniciado. Agora vá paraWindows → Preferences → Drools → Drools Flow Nodes
Se você conseguir ver os nós conforme mostrado na imagem acima, isso prova que os plug-ins foram instalados com sucesso. Agora estamos prontos para escrever nosso primeiro programa jBPM.
Aqui neste capítulo, escreveremos nosso primeiro programa "Hello World" usando jBPM. Siga as etapas abaixo -
Vá para Arquivo → Novo → Projeto Drools -
Clique Next. Dê um nome apropriado para o primeiro projeto: "HelloWorld" em nosso caso.
Clique Next. Selecione as duas caixas de seleção inferiores, viz -
- Adicione um arquivo de processo HelloWorld de amostra a este projeto
- Adicione uma classe de amostra para carregar e executar o processo HelloWorld
Clique Next. Clique em Definir Configurações do Espaço de Trabalho (marcado em vermelho na captura de tela a seguir) -
Clique no Add botão -
Depois de clicar no Addbotão, a seguinte tela aparece. Clique em "Criar um novo Drools5 Runtime"
Forneça o caminho até a pasta binários onde você baixou o droolsjbpm-tools-distribution-5.3.0.Final.zip
Em seguida, selecione os tempos de execução do Drools instalados e clique em OK.
A tela a seguir é exibida. Clique noFinish botão.
Agora, abra a visualização Package Explorer no Eclipse. Você verá a seguinte tela -
o ProcessTest.java classe é a classe para carregar o arquivo de fluxo de regra (rf) e ruleflow.rf é o fluxo de regra básico criado para o projeto HelloWorld.
Clique duas vezes no ruleflow.rf arquivo e você veria o seguinte fluxo de regra -
o GREEN círculo representa o início do fluxo de trabalho, enquanto o RED círculo é o fim do fluxo de trabalho.
O painel representado no lado esquerdo tem diferentes componentes listados que são usados no fluxo de trabalho. Além de START e END, existem muitos componentes que podem ser usados no fluxo de trabalho e nós os cobriríamos na próxima seção.
O Hello entre o evento START e END é uma tarefa de script e o nome da tarefa de script é Hello. Para ver qual código está escrito na tarefa de script "Hello", vá para Windows → Mostrar Visualização → Outro → Propriedades.
Note - Ao trabalhar no jBPM, mantenha a visualização Propriedades aberta o tempo todo, pois todas as configurações são visíveis apenas na visualização das propriedades.
Clique no OKbotão. Agora, selecioneHello e você pode ver as propriedades do evento "Hello" -
Para ver todo o código escrito dentro do evento "Hello", selecione o Action propriedade.
O círculo marcado em vermelho é a edição da propriedade da ação. Depois de clicar em Editar -
Você pode editar isso e escrever o código que deseja executar dentro da tarefa de script "Hello". Deixe-nos editar -
Clique OK. Agora abra a classe ProcessTest.java e execute-a como um aplicativo Java. Dada a seguir é sua saída -
Os termos usados na classe ProcessTest.java são os mesmos usados para Drools. O ponto a ser observado na classe ProcessTest.java é -
ksession.startProcess("com.sample.ruleflow");
Quando você escreve o código para iniciar o processo, a string passada para startProcess método é a propriedade id quando abrimos o fluxo de trabalho.
O núcleo do BPMS é o coração do BPM. A ilustração a seguir descreve o núcleo do BPMS e seus componentes.
O Módulo Semântico
O módulo semântico define a semântica do idioma (o que cada palavra significa) e como ela será traduzida para as estruturas internas do mecanismo de processo que estão prontas para serem executadas. Este módulo contém basicamente o essencial para entender a linguagem BPMN2.
O Process Engine
O motor de processo é o responsável por realmente executar nossos processos de negócios. O mecanismo de processo é responsável por criar novas instâncias de processo e manter o estado de cada uma delas. Dentro do código do mecanismo de processo, as estruturas internas são definidas para representar cada atividade que está em nossas definições de processo. Todos os mecanismos que estão sendo usados para instanciar essas definições de processo irão executá-los conforme definido no mecanismo de processo.
Persistência e transações
Na maioria dos aplicativos corporativos, todas as interações devem ser executadas dentro de um limite de transação e devemos lidar com diferentes sistemas, APIs e designs. Além disso, devemos ter um mecanismo flexível para definir -
Como lidar com processos de longa duração
Como e quando podemos armazenar informações sobre o status do processo e as informações que o processo está tratando
Como e quando precisamos criar, confirmar ou reverter as transações do mecanismo de processo
Quais exceções de negócios podem reverter ou compensar ações de negócios já executadas
Todos os pontos acima são cobertos pelo componente de persistência e transações dentro do jBPM.
Logs de auditoria / histórico
Este módulo se encarrega de dar ao usuário uma forma de consultar como nossos processos estão sendo executados. Essas informações incluem informações históricas sobre processos que já foram finalizados e as informações mais recentes sobre os processos que estão sendo executados.
Business Activity Monitoring (BAM) ferramentas e painéis de informações são alguns dos clientes mais comuns para as informações geradas por este módulo. The Audit/History Logs módulo é comumente usado para extrair informações úteis e métricas que irão colaborar com diferentes ferramentas projetadas para exibir essas informações de acordo.
A captura de tela a seguir mostra os vários componentes de fluxo de trabalho disponíveis no jBPM 5. Usando esses componentes, você pode criar um fluxo de trabalho para orquestrar seu processo.
Você também pode criar suas tarefas personalizadas, mas isso será abordado mais tarde. Além disso, existem tarefas de serviço disponíveis que podem ser usadas para orquestrar um processo.
Start Event- Este é o primeiro nó executado em cada processo. Pode haver apenas um nó inicial em seu processo.
End Event- Este nó sinaliza o fim do processo. Pode haver mais de uma ocorrência desse tipo de nó em um processo.
Rule Task - É um nó que avalia um grupo RuleFlow, que é um grupo de Regras Drools sob o mesmo escopo nomeado.
Gateway (diverge) aka Split- Este nó particular cria novos caminhos / formas no processo. Ele tem duas ou mais conexões de saída. Você pode escolher entre três tipos diferentes de Divisões / Portões disponíveis.
AND GATE - Onde o fluxo do processo continua para todas as conexões de saída ao mesmo tempo.
XOR GATE - Que vai para um único caminho de saída de acordo com algumas restrições predefinidas definidas no fluxo de trabalho.
OR GATE - Onde o fluxo continua com base na avaliação de todas as restrições de saída e esse caminho é habilitado onde a restrição é avaliada como verdadeira.
Gateway (converge) aka Join- Esta junção é o reverso da divisão. Ele une vários caminhos em um. Pode haver quatro tipos diferentes de Joins / gates -
AND - O fluxo continua quando todas as ramificações estão concluídas.
XOR - O fluxo continua quando pelo menos uma ramificação é concluída.
Discriminator- Como o XOR, ele continua se uma de suas ramificações foi concluída. Mas, ao contrário do XOR, ele registra as conclusões das outras ramificações até que todas as conexões sejam concluídas. Quando isso acontece, o nó é redefinido e pode ser inserido novamente quando uma ramificação de entrada é ativada e o ciclo começa novamente.
N-of-M - O fluxo continua quando n número de mramos concluídos. Você precisa especificar on (número) ao configurar o portão de quantas ramificações devem ser concluídas antes da saída do fluxo.
Reusable Sub-Process- Chama outro processo. Isso é muito útil para compor vários processos menores em um maior. Este maior pode ser um processo de coordenação. Você pode configurar o processo de chamada para aguardar a conclusão do receptor e também para ter um ciclo de vida independente de seu pai.
Script Task - Um nó que pode executar um código simples.
Timer Event- Este tipo de nó inicia um cronômetro e dispara quando o cronômetro expira. Permite processos relacionados ao tempo e tarefas repetitivas.
Error Event- Este tipo de nó sinaliza uma condição de erro no processo. Não tem conexões de saída. Ele especifica um FaultName e uma FaultVariable. O mecanismo irá procurar por um manipulador de exceção que corresponda ao FaultName e armazena as informações de falha na variável definida pelo FaultVariable.
Message Event- Dispara quando um evento de um tipo predefinido é emitido. Pode ser um evento interno (sinalizado dentro do processo) ou externo (sinalizado por uma entidade externa diferente do mecanismo de processo).
User Task- Um nó que cria uma tarefa humana. Esta Tarefa Humana é uma atividade que deve ser realizada por um ator humano.
Embedded Sub-Process- Ajuda a criar um subprocesso dentro de um processo pai. Ele pode ter seu próprio escopo. Isso é útil para processos maiores em que você deseja manter alguns ramos complexos isolados. Ele pode ter suas próprias variáveis e manipuladores de exceção
Multiple Instances aka for Each- Permite que uma coleção de elementos seja alimentada em um subprocesso. Muito útil quando combinado com um Subprocesso Reutilizável para compor e coordenar processos menores.
Para desenhar um fluxo de trabalho, você pode usar qualquer um dos componentes disponíveis na paleta, conforme descrito no artigo acima. Todo o fluxo de trabalho terá um início, mas pode ter vários finais.
Com a ajuda de capturas de tela, vou descrever como criar um fluxo de trabalho.
Aqui, eu abri o vazio rf ou bpmn Arquivo
Para adicionar qualquer evento, selecione o evento específico na Paleta de componentes e arraste e solte para o lado direito. Por exemplo, selecionei o evento inicial e arrastei-o para o lado direito e também um gateway divergente.
Agora, é preciso conectar os dois componentes. Selecione o fluxo de sequência e conecte os dois componentes.
Dessa forma, você pode arrastar os componentes para o editor e usar o fluxo de sequência para unir os diferentes componentes. É preciso apenas cuidar para que alguns componentes tenham uma conexão de entrada e outra de saída e é necessário definir o fluxo de sequência de acordo para criar um fluxo significativo.
É necessário definir algumas propriedades também enquanto desenhamos o fluxo de trabalho. Postará todas as propriedades para definir aqui. Acabei de criar um fluxo, mas não será muito significativo olhar para ele no primeiro instante, pois não defini nenhuma propriedade no fluxo de trabalho criado.
Como você pode ver acima, é um fluxo de trabalho em branco sem nenhuma descrição e não é possível distinguir nada do fluxo de trabalho criado.
No entanto, para explicar melhor, eu tenho um componente inicial e, em seguida, um gateway divergente e, dependendo da condição do gateway divergente, vou escolher um caminho e executar algum código na tarefa de script e, em seguida, encerrar o fluxo de trabalho. Portanto, preciso definir propriedades para o gateway divergente, depois a tarefa de script e o gateway convergir.
Nesta fase também mostrarei que meu workflow tem alguns erros e depois mostrarei que uma vez que eu configurasse as propriedades não haveria erros em meu workflow, mostrando assim como VALIDAR o workflow criado.
Dica - Lembre-se de que o validador está ativado em Windows → Preferências → Validação
A captura de tela abaixo mostra as configurações no eclipse.
De acordo com a captura de tela, você pode ver que há 4 erros. O primeiro erro diz que o script não tem ação e, em seguida, outro erro é que o gateway definido não tem tipo definido. Portanto, precisamos remover esses erros para poder executar o fluxo de trabalho.
Agora definiremos as propriedades uma por uma e veremos os erros desaparecendo.
Selecione o primeiro gateway (diverge) e clique em propriedades, a seguir clique em tipo e selecione o portão de acordo com sua necessidade.
Depois de selecionar o gateway, você precisa selecionar uma restrição.
Clique no círculo marcado em vermelho, você verá a imagem abaixo
Clique em editar e preencha os detalhes conforme a imagem -
Clique em Importar e importe a classe na qual estaríamos realizando qualquer operação. Na imagem, importamos o POJO de passageiros que usaremos em nosso exemplo.
Da mesma forma, preencha os detalhes para outra restrição -
Agora, clique no OK botão.
Clique novamente OK. Agora, selecione a tarefa de script e faça o mesmo processo que você fez para o gateway diverge.
Acabamos de adicionar um SOP (declaração de impressão) para mostrar o fluxo. Qualquer código java ou mvel pode ser escrito na tarefa de script.
Da mesma forma, adicione o código para a segunda restrição -
Finalmente, você precisa adicionar o tipo de gateway para o gateway divergente.
Agora, salve o arquivo de fluxo de trabalho e vá para a visualização de problemas. Todos os problemas serão resolvidos.
Nenhum erro na visualização do problema sugere que não há erro no fluxo de trabalho criado. É assim que um fluxo de trabalho é criado e também validado em jBPM.
Vamos dar um exemplo neste capítulo para explicar como colocar o jBPM em prática. A tarefa é usar o jBPM para decidir se um passageiro embarcará em um vôo ou um trem, dependendo de sua renda.
As etapas para criar o projeto permanecem as mesmas do projeto "Hello World". Abra o arquivo .rf no editor e veja as alterações marcadas em vermelho -
Aqui, alteramos a id do fluxo de regra (única) e adicionamos uma renda variável, pois estaremos decidindo a rota com base na renda do passageiro.
How to set variable - Selecione o botão de edição marcado em vermelho.
Clique no Add botão -
A seguinte tela aparece -
Coloque o nome como renda e digite como inteiro.
Clique OK. Você verá a variável de renda definida agora.
Mudanças a serem feitas na classe ProcessTest.java (classe para carregar e executar seu processo) -
Map<String, Object> params = new HashMap<String, Object>();
params.put("income", 1200);
// start a new process instance
ksession.startProcess("vivek.ruleflow", params);
Você precisa criar um MAP e definir o valor no MAP e passar esse valor para o método sobrecarregado startProcess. Conforme representado, alteramos a id do fluxo de regra e, portanto, usamos a mesma id (vivek.ruleflow) no método startProcess.
Antes de executar a classe ProcessTest.java, crie um POJO Passenger.java no mesmo pacote que ProcessTest.java
public class Passenger {
private String name;
private int income;
Getters and setters here
}
Agora execute a classe ProcessTest.java como um aplicativo Java e veja a saída -
Change the value- params.put ("receita", 900); e execute novamente a classe para ver a mudança na saída.