Sobre Luís Fernando Heckler

Para saber mais sobre mim, acesse http://www.linkedin.com/in/lfheckler

Timeout de atividades humanas no Oracle BPM

A necessidade de estipular prazos para que as tarefas humanas sejam realizadas é uma  característica constante nos processos automatizados.

Leia nesse artigo técnico um passo-a-passo de como implementar o uso de timeout no produto Oracle BPM 11g.

1. Timeout com expiração da tarefa

Se o objetivo é expirar a tarefa, retirando-a da lista de trabalho do usuário, o timeout pode ser setado diretamente nas configurações da tarefa humana, conforme segue:

A configuração deste tipo de timeout é semelhante no caso de tarefas humanas no Oracle BPEL 11g.

 

1.1. Definindo o timeout

Edite o arquivo .task de definição da tarefa. Conforme exibido na Figura 1 abaixo, na definição da tarefa, na aba “Deadlines” configure para expirar conforme um número fixo de dias, horas ou minutos a partir do início da tarefa; ou relativo a algum parâmetro definido no processo.

Note que a duração de tempo relativo em XML é expressa no formato P0Y0M0DT0H0M0S (http://www.w3schools.com/Schema/schema_dtypes_date.asp). Por exemplo, P2D equivale a 2 dias, e PT60S equivale a 60 segundos.

Se for preciso fazer cálculos com datas para calcular o timeout, existem no produto funções XPath para fazer adição ou subtração de durações de tempo com datas.

configuração do timeout na tarefa humana

Figura 1: configuração do timeout na tarefa humana

1.2. Avaliando no processo como a tarefa foi encerrada

Quando a tarefa é encerrada por timeout, seu status é alterado para expirada e o processo segue adiante. Então, se for preciso tomar alguma ação ou rota específica quando ocorrer o timeout, é preciso verificar nos dados de retorno como a tarefa foi encerrada.

Primeiro, é preciso salvar os dados de execução da tarefa em um dataobject, como exibido na Figura 2 abaixo:

mapeando o retorno dos dados da tarefa

Figura 2: mapeando o retorno dos dados da tarefa

Depois, numa tarefa de script extraia o valor do estado da tarefa com a expressão XPath:
string(bpmn:getDataObject(‘taskExec’)/ns:systemAttributes/ns:state)

Se o valor do estado for igual a EXPIRED, a tarefa foi encerrada por timeout ;-)

2. Timeout sem expiração da tarefa

É comum também que seja preciso implementar controle de timeout em uma tarefa, sem no entanto encerrá-la. Por exemplo, para enviar um email de aviso de atraso.

Nesse caso, não configure o timeout na aba ”Deadlines” da definição da tarefa. Ao invés disso, adicione um evento de timer de borda na tarefa humana, como mostra a Figura 3 a seguir:

timer de borda

Figura 3: timer de borda

Se o prazo de expiração for único, o timer pode por exemplo ser implementado como a adição de uma determinada duração a data atual no momento de criação da atividade:

xp20:add-dayTimeDuration-to-dateTime(string(xp20:current-dateTime()),concat(‘PT’,string(bpmn:getDataObject(‘timeout’)),’S’))

Se o timeout deve ser com base em uma data fixa, configure o timer como sendo do tipo Time Date, como mostra a figura abaixo.

timer de data fixa

Figura 4: timer de data fixa

Deixe desmarcada a opção “Interrupting Event” se a tarefa NÃO deve ser encerrada ao estourar o timeout. Se marcar essa opção a tarefa será interrompida quando ocorrer o timeout!

Se o timeout deve ser executado diversas vezes, ciclicamente, então é só marcar o timer como “Cycle” e lembrar que ele não deve ser do tipo “interrupting”:

timeout cíclico

Figura 5: timeout cíclico

Lembre-se que sendo do tipo cíclico, o valor da expressão que tem de ser setado é novamente uma duração. Por exemplo:
concat(‘PT’,string(bpmn:getDataObject(‘timeout’)),’S’)

 

* Observação: as cópias de tela apresentadas são baseadas no produto Oracle BPM 11g – versão 11.1.1.4, porém as configurações citadas são igualmente válidas nas versões posteriores do produto, apenas variando um pouco o estilo das caixas de diálogo.

 

Configurando um ambiente de desenvolvimento mais produtivo

Quando planejamos a implantação de uma nova tecnologia, de um novo sistema, é comum nos preocuparmos diretamente com os recursos de hardware e software que serão requeridos nos computadores servidores envolvidos. Porém, um ponto que poucos lembram-se de planejar previamente diz respeito aos recursos que as equipes de desenvolvimento e manutenção irão demandar.

Para além dos produtos diretamente relacionados ao sistema implantado, que outros aplicativos podem ajudar um técnico a ser mais produtivo em suas tarefas? Nesta hora, nada melhor do que trocar experiências, conversar com quem vive essa realidade no dia-a-dia.

Este é o motivador deste post: trocar experiências!

Não temos porém a pretenção de determinar quais são os melhores softwares, tampouco, ao citarmos um aplicativo específico, não queremos dizer que seus concorrentes são menos qualificados. O que estamos nos propondo a fazer é, na verdade, apresentar uma coleção que acreditamos atender adequadamente a maioria das necessidades de trabalho dos técnicos envolvidos com automação de processos e com desenvolvimento de sistemas de um modo geral.

Nota: é importante atentar para as políticas de licenciamento de cada software! Nem todo programa que pode ser instalado gratuitamente permite o seu uso para fins comerciais. Não nos responsabilizamos e tampouco estimulamos usos indevidos. Tampouco temos qualquer relação comercial com os fabricantes e distribuidores dos aplicativos citados.

 

Bom, vamos ao que interessa!

Confira a lista de aplicativos que sugerimos, considerando as plataformas Windows e Linux. Aguardamos contribuições e outras sugestões nos comentários.

Para facilitar, vamos agrupar as sugestões em aplicativos básicos, técnicos, segurança e desenvolvimento.

Aplicativos básicos:

  • Primeiramente é importante definir o sistema operacional a ser utilizado. O Windows 7 Professional é uma ótima opção nessa plataforma e, em Linux, as distribuições Fedora e Ubuntu são recomendadas (mas muitas outras também são adequadas).

** Adicionalmente, o Firefox mostra-se como uma opção bastante interessante para desenvolvedores pela grande quantidade de plugins disponíveis para estender suas funcionalidades. Dentre esses, podemos destacar o Webdeveloper e o Firebug, especialmente úteis para depurar os componentes Javascript das suas páginas.

  • Compactador de arquivos 7-zip, para Windows.
  • PDF XChange é um bom leitor deste tipo de arquivo, pois é leve e permite a inclusão de comentários e marcações. No Linux, ele pode ser instalado utilizando o Wine, citado mais adiante (Okular e Evince são bons leitores também para Linux). Claro, há também a opção de utilizar o Adobe Reader (para Windows e Linux), mas este é bastante “pesado”. Já para geração de PDFs, o pdfCreator é uma ótima opção para Windows, e o Cups-PDF para Linux atende a necessidade.
  • Para edições simples de imagens, recomendamos o Paint.net para Windows ou o Gimp (Windows e Linux), e o Gadwin Printscreen (Windows) para produzir cópias de telas (a maioria dos ambientes Linux possui opção nativa para tal).
  • Para comunicação, Skype para videoconferências e para chat o Pidgin (Windows e Linux), que suporta em um só aplicativo contas do MSN, GTalk e de outros serviços.
  • Instale o cliente do Dropbox para compartilhar facilmente arquivos entre diferentes computadores, ou mesmo entre toda a equipe de desenvolvimento.

Aplicativos técnicos:

  • Para Linux, há muitos pequenos programas de linha de comando úteis para diversas tarefas. Em ambiente Windows, podemos utilizar boa partes desses comandos utilizando o Cygwin! Por exemplo, nada como poder utilizar o comando tail para acompanhar um arquivo de log e, com o Cygwin, isso é possível mesmo em Windows.
  • No Windows, podemos conectar em um ambiente Linux remoto utilizando o Putty ou XShell, e podemos até mesmo executar localmente programas gráficos que estão instalados em um ambiente Linux remoto se utilizarmos o XMing. E o contrário também é verdadeiro: podemos instalar e executar alguns aplicativos Windows em ambiente Linux, instalando o Wine. Se o aplicativo não for dependente de bibliotecas muito específicas, tem uma boa chance de funcionar muito bem! E, para conectar remotamente em uma máquina Windows a partir do Linux, utilize o Vinagre, um cliente Remote Desktop e VNC leve e adequado.
  • Para controle de versões SVN, instale no Windows o Tortoise SVN, que integra-se muito bem ao Windows Explorer. Existe também o projeto Tortoise GIT para este outro controle de versões. Bem menos explorado e conhecido, o sistema de controle de versões Bazaar é uma opção bastante interessante para manter versionados arquivos locais sem depender de um servidor específico para tal. Pode ser utilizado, por exemplo, para manter versões locais mais frequentes, sem, no entanto, submeter versões para o sistema centralizado da empresa, onde espera-se que sejam entregues apenas versões estáveis dos códigos-fonte.
  • Para comparação de arquivos, recomendamos WinMerge para Windows e Meld para Linux.
  • Para editar arquivos texto no Windows, esqueça o Notepad! Instale o Notepad++, que possui diversos recursos e plugins disponíveis.
  • Instale o Wireshark (Windows e Linux) para interceptar e monitorar o tráfego de rede.

Segurança:

  • Utilize o TrueCrypt principalmente para proteger pendrives e HDs externos, mas o mesmo pode ser utilizado também para criptografar discos rígidos dos seus computadores. ** Adicionalmente, em Linux, é possível criptografar o disco rígido facilmente utilizando LVM.
  • Especialmente em ambiente Windows, tenha um bom antivirus instalado! O McAfee é bastante eficiente, mas tem custo de licença e consome bastante recursos do computador. Já o Comodo tem a vantagem de ser uma suite com antivirus, antimalware e firewall, e gratuita. Para Linux, o Avast é uma boa opção de antivirus para uso pessoal, enquanto que o Clamav é o mais famoso e de uso gratuito. Já o ipTables é o firewall padrão (boa parte das distribuições geralmente contam com um aplicativo gráfico de firewall baseado em iptables). Ainda para Windows, pode-se também fazer uso das próprias ferramentas da Microsoft: Windows Firewall e o Security Essentials como antivirus.
  • Também não esqueça de ter uma opção de software para backup, especialmente se trabalhar em home-office ou se viaja muito com notebook. A maioria desses serviços é pago, mas seu custo caiu muito nos últimos anos. Algumas opções de empresas que disponibilizam serviço de backup remoto são: CrashPlan, Carbonite e Mozzy – estes dois últimos somente para Windows, o primeiro para múltiplas plataformas.

Desenvolvimento:

  • Para acesso e programação em banco de dados Oracle, utilize o Oracle Sqldeveloper. Para banco de dados SQL Server, utilize as próprias ferramentas  Microsoft.
  • Para desenvolvimento, depende muito do gosto do programador, mas Eclipse e Netbeans são ótimas IDEs.
  • Para teste e simulação de webservices, o SoapUI é uma excelente ferramenta.
  • Para automação de build e deploy, principalmente em Java mas também em outras linguagens e plataformas, utilize Ant e Maven.
  • Para virtualização de servidores, o VirtualBox é uma ótima opção, pois permite inclusive criar snapshots. Mais limitado, o VMware Player também serve para executar máquinas virtuais facilmente.

Bom, ficamos por aqui. Compartilhando esta lista de aplicativos, esperamos ajudar a facilitar o processo de escolha de ferramentas para as diversas necessidades e demandas de software que surgem em um ambiente de desenvolvimento.

Aguardamos comentários e sugestões de outros aplicativos que podem ajudar a tornar o nosso dia-a-dia mais produtivo ;-)

Construção de serviços simulados utilizando Java

No desenvolvimento de sistemas com base na arquitetura orientada a serviços (SOA), frequentemente nos deparamos com a necessidade de utilizar serviços já existentes na infraestrutura do cliente, mas que não estão disponíveis no nosso ambiente de desenvolvimento local. Ainda, na maioria das vezes não temos a possibilidade de instalar localmente tais serviços devido a dependências destes com outros serviços, bibliotecas ou outros componentes que somente estão disponibilizados no ambiente integrado do cliente.

Nestes casos, podemos fazer uso de um recurso muito útil: a construção de versões simuladas de serviços, ou mocks como são chamados em inglês. A ideia é podermos disponibilizar no ambiente local um serviço que exponha o mesmo contrato WSDL que o serviço original, ou seja, as mesmas operações e tipos de dados.

Uma das alternativas para a criação de um serviço simulado é implementá-lo observando as operações e os tipos de dados expostos pelo serviço original e recriando-os completamente, por exemplo, utilizando Java e JAX-WS. Porém, para os casos em que temos acesso ao contrato WSDL do serviço original, é mais simples e seguro construirmos o mock diretamente a partir dele.

Vamos então demonstrar como construir um serviço simulado em Java, a partir do contrato de um serviço original, em um passo-a-passo utilizando o Oracle JDeveloper.

Primeiramente, para exemplificar, vamos supor que estamos desenvolvendo um sistema que deverá invocar o serviço de cálculo de prazo e custo dos Correios, mas o serviço real somente deverá ser utilizado quando a solução for integrada no ambiente do cliente. Logo, em tempo de desenvolvimento, devemos construir um mock do mesmo.

1 – Criação da aplicação

Comece criando uma nova aplicação genérica no JDeveloper:2 – Criação de novo projeto

Crie um novo projeto genérico a partir do passo seguinte do wizard de nova aplicação ou a partir da opção de Novo Projeto, se você estiver criando um segundo mock dentro de uma aplicação já existente no JDeveloper.

Não é preciso selecionar nenhuma tecnologia para o projeto, podendo-se encerrar o utilitário de criação do novo projeto clicando no botão Finish.

3 – Criação do webservice

Clique com o botão direito no projeto criado e escolha a opção New. Na janela de opções, selecione no lado esquerdo a categoria “Web Services” e no lado direito “Java Web Service from wsdl”.

No wizard de criação do serviço, escolha como plataforma “Java EE 1.5, with support for JAX-WS RI”:

Clique em Next. Neste momento é preciso abrir o arquivo WSDL do serviço original. No nosso exemplo vamos especificar a URL para o WSDL do serviço original dos correios, que está disponível em http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx?WSDL (marque para criar cópia local do contrato).

Clique em Next novamente, especifique o nome do pacote Java e finalize o wizard. Pronto! Está criado o novo serviço mock, expondo o mesmo contrato WSDL que o serviço original. Deverão ter sido criadas classes Java para todos os tipos de dados envolvidos nas mensagens de entrada e saída das operações, bem como a implementação do serviço com as devidas anotações.

Como passo final, edite o novo arquivo XXXImpl.java (onde XXX corresponde ao nome do seu serviço simulado) para codificar o retorno de dados de teste nas operações expostas pelo serviço, como no exemplo a seguir:

Agora basta fazer o build do arquivo .war do serviço e disponibilizá-lo em seu servidor de aplicações local. Veja os valores que setamos sendo retornados em um teste de invocação do serviço simulado, depois de disponibilizado em um servidor Weblogic 11g: