Publicado em: 22 de março de 2007
Por Daniel Franco Abrahão de Oliveira
Introdução
Com o lançamento do .NET Framework 3.0 a Microsoft nos trouxe quatro novas tecnologias: Windows Communication
Foundation (WCF), Windows Presentation Foundation (WPF) e Windows Workflow Foundation (WF) e CardSpace.
É importante deixar bem claro que o Windows Workflow Foundation não é um produto de Workflow e sim uma plataforma
para desenvolver aplicações baseadas em workflows. A Microsoft não espera que o Workflow Foundation seja levado ao usuário final.
O que o usuário final irá receber são aplicações construídas usando o WF, ficando isso explícito ao usuário ou não.
Com o WF podemos modelar quaisquer processos usando atividades desenvolvidas pela Microsoft, e que vem com o .NET 3.0,
ou atividades customizadas.
Nesta página
Motivações
Tipos de Workflow
Exemplo de Workflow
Atividades
Serviços
Conclusão
Motivações
Tanto processos de negócio quanto processos computacionais podem ser modelados usando Workflow Foundation.
Neste artigo vamos nos ater aos processos de negócio.
Quando falamos de um processo de negócio estamos falando de processos que podem durar horas, dias, meses ou anos até
que sejam finalizados. Nesses processos, tipicamente, tempos a interação de pessoas, ou seja, determinados momentos do workflow,
o que chamaremos de Atividades, podem requerer a interação de uma pessoa para que o fluxo possa continuar.
Processos de negócio requerem interação de uma grande variedade de partes, dessa forma um requisito de uma plataforma de
Workflow é
coordenação
. Pessoas interagem com instâncias
de um processo que está sendo executado. Cada instância pode ter um tempo de vida de horas, dias, semanas e até meses. Dessa forma
temos os workflows de
longa-duração(long-running)
.
Modelando visualmente um processo de negócio em forma de workflow, temos uma vantagem clara que é o entendimento sobre o
processo. Uma vez modelado visualmente o processo se torna mais claro e
a possibilidade de otimização sobre esse processo aumenta.
Porém, a simples representação visual não é o bastante. Outra vantagem que temos com o WF é que além da representação
visual temos a instância do workflow sendo executada. Dessa forma outro benefício trazido é o monitoramento. Uma vez que estamos
gravando informações sobre cada instância do processo que está sendo executada, podemos acompanhar a execução, saber em que
momento da execução está cada instância, quantas são as instâncias e quaisquer outras informações que possam ser necessárias.
Visto que temos a vantagem da representação visual e das informações gravadas sobre a execução de cada instância, podemos trabalhar
em cima desses dados para aperfeiçoar os processos de negócio.
Uma possibilidade de uso do WF, conforme veremos detalhes mais à frente, é levar ao usuário do sistema o papel de definir a
modelagem dos processos de negócio, usando atividades de negócio criadas pelos desenvolvedores do produto. Quem desenvolve software
sabe que levar ao usuário final esse tipo de funcionalidade pode ser uma tarefa bem complexa, para gerar uma aplicação com “partes”
desconectadas. Isso pode ser traduzido em outro benefício do Workflow Foundation, tornar o software flexível a ponto de o usuário
final poder modelar o processo que será seguido.
Tipos de Workflow
Temos dois tipos de workflow disponíveis no WF. O primeiro que veremos é o Sequential-Workflow (Workflow Seqüencial), e logo
em seguida o State-Machine Workflow (Workflow de Máquina de Estado). Na verdade há um terceiro tipo de workflow, o Data-driven workflow.
Sobre este irei fazer alguns comentários posteriormente.
O estilo de workflow clássico que temos é o workflow seqüencial. Um exemplo de processo que seria indicado ser modelado com o workflow
seqüencial: um funcionário solicita uma folga. O gerente desse funcionário recebe o pedido e decide se aprova ou não.
Se ele aprovar o funcionário recebe a confirmação da aprovação e então encerra o workflow, senão, se o pedido não for aprovado, o workflow é encerrado.
Figura 1 - Exemplo de workflow seqüencial
O que caracteriza um workflow seqüencial é que quem controla o fluxo é o workflow. De maneira alguma quer dizer que o workflow seqüencial
é sempre uma seqüência simples de atividades. Esse estilo de workflow pode ter operadores de repetição, de decisão e mais. Se o conceito, de que
quem controla o fluxo é o workflow, ainda não foi bem entendido, será em seguida quando dermos uma olhada no outro estilo de workflow.
O segundo estilo que temos é o Workflow de máquina de estado. Vejamos o seguinte exemplo: eu estou testando um software e
identifico um bug. Defino uma tarefa para o desenvolvedor responsável para corrigir o bug. Esse desenvolvedor repassa a tarefa
para outro desenvolvedor. Esse outro desenvolvedor rejeita o bug alegando que não foi testado corretamente. O testador re-abre
passando mais informações para o desenvolvedor entender melhor o bug.
Se esse processo fosse modelado utilizando o workflow seqüencial, teríamos uma quantidade muito grande de laços de repetição e operadores de decisão. Definindo
estamos como: aberto, cancelado, corrigido, poderíamos modelar mais facilmente esse fluxo.
Por fim o outro estilo de workflow que temos é o chamado Data-Driven. Embora em muitos lugares ele seja tratado como um
terceiro estilo de workflow, eu prefiro definir como um uso específico do workflow seqüencial ou do workflow de máquina de estado.
Acredito que essa definição caiba melhor por esse modelo de workflow dirigido a dados é construído sobre o workflow seqüencial ou
de máquina de estado, portanto não pode contar como um terceiro estilo de workflow.
Exemplo de Workflow
Para entender como iniciar o desenvolvimento de um software com Workflow Foundation vamos construir um exemplo simples de workflow e vamos usá-lo durante o artigo para
demonstrar alguns conceitos novos.
Iremos usar um template de projeto, do Visual Studio, chamado Sequential Workflow Console Application. Iremos desenvolver os workflows usando C#.
Clique em Ok para criar o projeto e vamos verificar alguns dos itens que ele já cria na estrutura do nosso projeto.
No nosso projeto já temos criado o arquivo Workflow1.cs e Program.cs. O Workflow1.cs é o workflow criado por Default e o arquivo Program.cs é o
host do workflow. É nesse arquivo que o workflow é instanciado e executado.
namespace WorkflowConsoleApplication1
{
public sealed partial class Workflow1 : SequenceActivity
{
public Workflow1()
{
InitializeComponent();
}
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
Console.WriteLine("Atividade executada em: {0} ", System.DateTime.Now.ToLongTimeString());
Console.Read();
}
private void codeActivity1_ExecuteCode_1(object sender, EventArgs e)
{
}
}
}
Figura 2 - Código do arquivo Program.cs
Na primeira linha vemos o WorkflowRuntime sendo instanciado. Esse objeto é o responsável pela criação das instâncias de workflow.
Só pode haver uma instância de WorkflowRuntime por domínio de aplicação. O objeto criado na segunda linha de código irá ser usado para
que a aplicação não encerre sem que o workflow seja executado. Em seguida vamos assinar dois eventos do workflowruntime: WorkflowCompleted
e WorkflowTerminated. Esses dois eventos serão executados, respectivamente, quando a instância de um workflow completar sua execução e quando ela for
interrompida. Logo após temos a linha de código que realmente cria a instância do nosso workflow. Em seguida o workflow é executado.
Vamos agora montar o nosso primeiro workflow e executá-lo.
Abra o arquivo Workflow1.cs. Observe que na toolbox temos uma série de atividades sob a seção Workflow Foundation. Arraste uma atividade,
chamada Code, da Toolbox para o Workflow.
Figura 3 - Workflow1.cs[Design]
Observe que no canto superior direito da nossa atividade temos um ponto de exclamação. Esse símbolo é exibido quando há algo errado com a atividade.
Clicando nesse símbolo veremos uma mensagem indicando que a propriedade ExecuteCode não foi definida. Essa propriedade determina qual
método será executado quando essa atividade for invocada. Dê um duplo-clique na superfície da atividade para que seja gerado o
EventHandler. Digite a seguinte linha de código no corpo do método:
Console.WriteLine("Atividade executada em: {0} ", System.DateTime.Now.ToLongTimeString());
Aperte Control+F5 e veja o resultado do nosso workflow.
Atividades
O Workflow Foundation nos traz algumas atividades já definidas. Algumas delas são:
-
Code –Executa um trecho de código.
-
CallExternalMethod – Faz a chamada de um método que está implementado na aplicação host.
Isso acontece definindo uma interface e criando uma classe que implementa essa interface. No WorkflowRuntime essa classe é adicionada aos serviços.
Com essa atividade podem ser passados dados para a aplicação host.
-
Delay – Suspense a execução do workflow por um tempo determinado. Quando essa atividade é executada o workflow entra no estado
Idled(ocioso).
-
HandleExternalMethod – Essa atividade faz com que o workflow entre no estado ocioso e aguarde
por um evento externo. Isso funciona da mesma maneira que com a atividade CallExternalMethod, utilizando uma interface e uma classe que deve implementá-la.
Uma grande característica do Workflow Foundation é a possibilidade da criação de atividades customizadas (Custom Activities). Com essa funcionalidade
podemos criar atividades que atendem necessidades específicas.
Vamos criar agora uma atividade. No nosso projeto acesse Add – Activity. Na janela Add New Item clique em Add para criar a atividade.
No designer da nossa atividade arraste uma atividade Code, uma atividade Delay e outra atividade Code.
Figura 4 - Activity1.cs[Design]
Crie o EventHandler da primeira atividade Code e coloque no corpo do método a seguinte linha de código:
Console.WriteLine("codeActivity1 executada em {0}", System.DateTime.Now.ToLongTimeString());
Faça o mesmo para a segunda atividade Code colocando a seguinte linha de código no corpo do método:
Console.WriteLine("codeActivity2 executada em {0}", System.DateTime.Now.ToLongTimeString());
Na atividade Delay defina a propriedade TimeoutDuration para 00:00:05. Aperte F6 para compilar o projeto.
Retornando para o designer do workflow, observe que outra seção foi criada na toolbox: WorkflowConsoleApplication1Components. Nessa
seção temos a nossa atividade Activity1. Delete a atividade Code existente no nosso workflow e arraste a atividade Activity1. Observe
que no designer agora aparecem as três atividades definidas em Activity1 e que não é possível excluir alguma delas, somente a atividade
Activity1 inteira. Aperte Control+F5 e veja o resultado do nosso workflow.
Figura 5 - Workflow1.cs[Design]
Serviços
Boa parte das funcionalidades do Workflow Foundation provém dos serviços que podemos adicionar ao WorkflowRuntime.
Por Serviço entenderemos um objeto que é adicionado ao WorkflowRuntime e é por este gerenciado. Seguindo o modelo extensível
do Workflow Foundation, podemos reescrever os serviços que vêm implementados no .NET Framework 3.0 ou criar novos serviços e
adicioná-los ao WorkflowRuntime.
Alguns dos serviços mais comuns:
-
SqlWorkflowPersistenceService – É o serviço de persistência de instâncias de workflow. Em um cenário
onde você tem um processo long-running é necessário que em determinados momentos a instância do workflow seja removida
da memória e seja persistida em um meio não-volátil. Esse serviço funciona com bases SQL Server. Para utilizar outro
banco de dados basta re-implementar este serviço.
-
WorkflowTrackingService – Com o serviço de tracking você pode gravar três tipos diferentes de dados:
sobre o Workflow, sobre as atividades e dados do usuário. Dados sobre o workflow são dados indicando os estados do
workflow (Completed, Created, etc...). Sobre atividades também são dados indicando os estados das atividades
(Executing, Completed, etc...). E dados de usuário podem ser dados de negócio que são trafegados pelo Workflow.
Com esse serviço é possível armazenar um grande volume de dados sobre as instâncias de processos que são executados na
sua empresa, para depois interagir com esses dados retirando relatórios, construindo um sistema de B.I. ou alguma outra
utilidade identificada.
-
DataExchangeService – Esse serviço é usado para troca de dados entre a aplicação host e o Workflow.
Conclusão
Como pudemos ver o Workflow Foundation é uma plataforma muito rica que irá auxiliar muito os desenvolvedores na criação de aplicações usando workflow.
Quanto às possibilidades de uso temos várias: aplicações para call-center, serviços de gerências de servidores, aplicações
ERP, entre muitas outras. Com essa plataforma em mãos só é necessário um pouco de criatividade e atenção aos requisitos, e com
isso a qualidade e flexibilidade dos softwares podem melhorar muito.
Para mais informações, constantemente público no meu blog (http://thespoke.net/blogs/dfa.oliveira/)
alguns artigos sobre Workflow Foundation e também links para artigos do pessoal do time de Workflow Foundation, da Microsoft. E outra fonte de
informações é o fórum de Workflow Foundation do MSDN (www.msdn.com.br) e o site do WF (http://wf.netfx3.com).