Computação Orientada aos Serviços
Workflow
}
No desenvolvimento de software, o principal objetivo é
resolver problemas reais de negócio.
} Normalmente parte-se a resolução do problema em partes, e
depois compõem as resoluções das partes.
}
Um
workflow
é uma série de passos ordenados a realizar
com vista a concretizar determinado propósito, de
acordo com um conjunto de regras.
}
Um workflow permite facilmente modelar interações de
sistemas e humanos.
} As interações humanas são aquelas que envolvem pessoas
reais.
} Que controlo é que se tem na ordem de execução realizadas por
Workflow
}
Um workflow é uma atividade
}
Uma ou mais atividades compõem um workflow
}
A modelação de um processo como um workflow tem
como vantagem:
} A transparência: um modelo bidimensional, que ilustra a lógica
Ciclo de vida do desenvolvimento de um
sistema
}Planeamento
}Descoberta
}Análise
}Desenho
}Testes
}Desenvolvimento
Processar o pedido de um cliente
Tecnologia Workflow
}
WF foi desenvolvido para visar certos requisitos mais
complicados de implementar:
} Processos de longa duração
} Workflows declarativos permitem construir workflows que
visualmente processam uma lógica condicional complexa
} Workflow persistence fornece uma mecanismo para libertar a
memória de processamento dos workflows que estão parados ou à espera de algum evento.
Componentes do WF
}As componentes são:
}Workflow Runtime
}Activities
}Workflows
}Workflow Designer
}Workflow DataModel
}Persistência
}Monitorização
Workflow Hosts
}
WorkflowApplication:
} Permite às aplicações que fazem host de workflows gerir a
execução, nomeadamente a persistência ou o cancelamento de um workflow e subscrever as notificações do tempo de vida de um workflow.
}
WorkflowServiceHost:
} Utilizado para gerir configurações e endpoints para fazer
hosting de workflows como serviços WCF
}
WorkflowInvoker:
} Para facilmente fazer hosting de workflows sincronamente,
Workflow em WF
}
WF fornece uma framework para desenvolver workflows;
}
Um workflow pode ser desenhado em WF de 3 modos
diferentes:
} Baseado em código;
} Baseado em XAML
} XAML é um linguagem declarativa utilizada na Framework Windows
} É deste modo fornecido um modelo de programação declarativo
} Parcialmente baseado em código e parcialmente baseado em
XAML
}
Existem duas formas de desenvolver workflows em XAML:
} Editor de WF
Ciclo de vida de um workflow
}
Quando se executa um workflow
} É criada uma instância designada por WorkflowInstance
} Durante o seu processamento, podem ocorrer vários estados
} WorkflowCreated } WorkflowStarted } WorkflowLoaded } WorkflowIdled } WorkflowUnLoaded } WorkflowSuspended } WorkflowResumed } WorkflowTerminated } WorkflowPersisted } WorkflowCompleted
Atividades
} As atividades podem ser categorizadas em:
} Control Flow:
} Modelam o fluxo dos processos no contexto de um worflow.
} Flowchart:
} Fornecem modelação de árvores de decisão no contexto de um workflow.
} State-machine:
} Modelam transições entre estados possíveis, indicando interação humana e eventos no contexto de
workflows.
} Messaging:
} Fornecem funcionalidades de comunicação para construir workflows que são expostos como serviços e
comunicam uns com os outros através de protocolos de transporte.
} Runtime:
} Fornecem instruções ao runtime de WF para gerir o comportamento de um workflow.
} Primitives:
} Fornecem funcionalidades gerais de execução.
} Transaction:
} Fornecem funcionalidades para permitir que as actividades sejam executadas no contexto de uma
transação.
} Collection
} Fornecem funcionalidades básicas para gerir os dados representados como coleções no contexto de um
workflow
Atividades
} Control Flow:
} DoWhile, ForEach, If, Parallel, ParallelForEach<T>, Pick, PickBranch, Sequence,
While, Switch
} Flowchart:
} FlowChart, FlowDecision, FlowSwitch.
} State-machine:
} StateMachine, State, FinalState.
} Messaging:
} CorrelationScope, InitializeCorrelation, Receive, ReceiveAndSendReply, Send,
SendAndReceiveReply, TransactionReceiveScope
} Runtime:
} Persist, TerminateWorkflow.
} Primitives:
} Assign, Delay, InvokeMethod ,WriteLine
} Transaction:
} CancellationScope, CompensableActivity, Compensate, Confirm, TransactionScope
} Collection
} AddToCollection<T>, ClearToCollection<T>, ExistsInCollection<T>,
RemoveFromCollection<T>
} Error Handling:
Exemplo
public static Activity GetParallel(Activity[] a) {
Parallel workflow = new Parallel(); for (int i = 0; i < a.Length; i++) {
workflow.Branches.Add(a[i]); }
return workflow;
}
Exemplo
Variable<ICollection<string>> fruitList = new Variable<ICollection<string>> { Name = "FruitList“ }; Variable<bool> result = new Variable<bool> { Name = "Result“ };
Activity wf = new Sequence { Variables = { fruitList, result }, Activities = {
new If {
Condition = new ExistsInCollection<string>{ Collection = fruitList, Item = "Pear” }, Then = new AddToCollection<string> { Collection = fruitList, Item = "Pear” },
Else = new RemoveFromCollection<string> { Collection = fruitList, Item = "Apple” } },
new RemoveFromCollection<string>{ Collection = fruitList, Item = "Apple”, Result = result }, new If{
Condition = result,
Then = new ClearCollection<string>{ Collection = fruitList, } }
} };
Tipos de workflow
}
Sequencial
} Caracteristicas incluem: fluxo predeterminado, sistemático,
menor flexibilidade
}
Máquina de Estados
} Caracteristicas incluem: Fléxiveis, modelam o comportamento
humano, reactivos
}
Flowchart
} Caracteristicas incluem: opções de decisão transparentes,
maior nível de transparência para tomar decisões, fluxo de voltar a atividades anteriores previamente executadas mais natural
Ciclo de vida de uma atividade
Executar
Em falha Cancelada
Hello Workflow
HelloWorkflow utilizando código imperativo
}
Uma definição de workflow pode ser criada através de
instanciar uma instância de um tipo de atividade e
configurando as propriedades do objecto atividade
Activity wf =
new WriteLine(){ Text = "Hello World." };
WorkflowInvoker.Invoke(wf
);Activity -> namespace System.Activities
WorkflowInvoker -> namespace System.Activities
HelloWorkflow utilizando código imperativo
public class HelloWorkflow : Activity {
public HelloWorkflow() {
this.Implementation = () => new Sequence() {
Activities = { new WriteLine()
{Text="Hello Workflow"} }
}; }
}
Namespaces
Namespace Significado
System.Activities Contém todas as classes necessárias para criar e trabalhar com atividades.
System.Activities.Statements Contém atividades que podem ser utilizadas para criar workflows.
Estrutura dos Workflows
}
As atividades são os blocos de construção do WF
}
Todas as atividades derivam de
Activity
.
}
Atividades são unidades de trabalho em WF.
}
As atividades podem ser compostas em atividades maiores
}
Quando uma atividade é utilizada como atividade de topo, é
Modelo de Dados WF
}
Para processamento de informação, o workflow obtém os
dados de 3 formas diferentes:
} Quando um workflow inicia
} Os argumentos de input são passados ao workflow através do
runtime WF
} O nome de cada argumento de input tem de ser explicitamente
atribuído a um argumento no contexto do workflow para que os dados podem passar para o workflow
} Lê de eventos externos
} Ex: processamento de uma encomenda
} Recebe através de eventos externos
Modelo de Dados WF
Modelo de Dados Descrição
Variável Utilizadas como áreas de armazenamento, definidas pelo tipo de objeto e, opcionalmente, por nome. Os valores das variáveis são atribuídos em tempo de execução e armazenados como parte do estado da
instância de workflow.
Argumento Controlam como os dados fluem, aceitando e retornando dados de input e de output de uma atividade.
Expressão Uma atividade com um valor de retorno utilizado em
Argumentos
}
Os argumentos são utilizados para receber e retornar
dados para o WF runtime.
}
Os argumentos em WF podem ser de um dos 3 tipos:
} InArgument -> envia um argumento para uma atividade através
do WF runtime.
} OutArgument -> retorna um valor como argumento afetado
no contexto de uma atividade em runtime.
} InOutArgument -> é um referenced value que pode ser passado
a uma atividade, afetado com um valor e retornado outra vez para o WF runtime.
InArgument
} Um conectivo terminador que representa fluxo de dados para uma atividade
} WithAnArgument
public class WorkflowInCode:Activity {
public InArgument<string> FirstName { get; set; } public InArgument<string> SecondName { get; set; } public WorkflowInCode() {
this.Implementation = () => new Sequence() { Activities = {
new WriteLine(){
Text=new InArgument<string>(
activityContext=>"My name is "+FirstName.Get(activityContext) ) }, new WriteLine(){ Text=new InArgument<string>( ActivityContext=>SecondName.Get(ActivityContext) ) } } };
OutArgument
Computação Orientada aos Serviços
If-Else
}
UseIfElse
Parallel Activity
}
Se apenas existirem atividades síncronas no contexto de
uma atividade
Parallel
, as atividades do workflow serão
executadas na mesma thread do workflow.
}
Exemplos:
} Parallel
} ParallelWithDelays
A actividade Pick
}
A atividade
Pick
executa uma das suas subactividades
paralelas, e apenas uma das atividades será executada
antes da actividade
Pick
terminar.
} É tipicamente utilizada para definir um time-out para uma
actividade.
} A actividade Pick contém uma coleção de atividades
PickBranch, onde cada PickBranch é um par de atividades
Trigger e Action .
} Em tempo de execução, os triggers de todos os branches são
executados em paralelo. Quando um trigger termina, a sua action correspondente é executada e todos os outros triggers são
cancelados.
} PickActivity
} PickCodeActivity
A actividade Sequência
}É considerada uma
actividade composta
} É um contentor para atividades } As atividades contidasnuma sequência são executadas de modo sequencial
InOutArguments
}
Este tipo de argumento é utilizado para receber valores e
também passar valores para quem invoca este workflow.
}
Exemplos:
} InOutArguments
Variáveis
}
Têm de ser declaradas de modo a poderem ser utilizadas
por elementos do workflow.
} O workflow é stateless, isto é, não armazena elementos
} As variáveis são apenas definição de dados
O contexto da variável está disponível para a atividade Sequência e para todas as suas descendentes.
§ UseVariable
FlowChart Workflow
}
Num workflow
Flowchart
as atividades estão conectadas
por árvores de decisão
} Numa sequence, as atividades são executadas por ordem
sequencial
} O padrão de workflow sequence é implementado através da atividade
sequence
} Num flowchart, a ordem de execução de atividades pode variar
consoante a decisão tomada.
}
E outros padrões de workflow básicos?
} Exclusive choice
Flow Chart
}
FlowChart
}
FlowChartExplicit
Computação Orientada aos Serviços
Atividade Máquina de estado
Atividade Máquina de Estados
}
As atividades máquina de estados fornecem uma alternativa
para modelar comportamento humano quando fluxo de
eventos não é passível de ser previsto
}As máquinas de estados incluem:
} Um estado inicial
} Um estado final
}
Estado: cada estado num workflow tem uma entry e uma
exit action
}
Cada transição representa um evento disparado
externamente.
Exemplos
}
StateMachineExample1
}StateMachineExample2
}
Um estado pode ter mais do que uma transição para outro
estado
BookMarks
}
Os métodos para resumir bookmarks
}
http://msdn.microsoft.com/en-us/library/
system.activities.workflowapplication.resumebookmark.as
px
Fluxo de controlo
State Machine Sequence FlowChart
Fluxo Event driven Predeterminado Flexível Tipo do Modelo Interacção humana Ordenadas Tarefas Tomador de decisões Comportamento Reactivo Sistemático Opções
Exemplo
public class ImperativeCodeWorkflow { public void AdditionActivity() {
Variable<int>Add1 = new Variable<int> { Name = "Add1", Default = 5 }; Variable<int>Add2 = new Variable<int> { Name = "Add2", Default = 5 }; Variable<int>Sum=new Variable<int> { Name = "Sum" };
Exemplo
Activity wfSequence = new Sequence { Variables = { Add1,Add2,Sum }, Activities = {
new Assign<int> { To = Sum,
Value = new InArgument<int>(ad) => Add1.Get(ad) +Add2.Get(ad))
},
new WriteLine {
Text = new InArgument<string>(
(sm) =>string.Format("The sum of {0} and {1} is {2} ", Add1.Get(sm),Add1.Get(sm),Sum.Get(sm)) ) } } }; WorkflowInvoker.Invoke(wfSequence); }
Padrões básicos de workflow
} Os padrões de fluxo de controlo básicos capturam os aspectos
elementares do controlo de processos.
} Sequence; Parallel Split; Synchronization; Exclusive Choice
} Sequence:
} É utilizado para construir uma sequência de actividades consecutivas, que são
executadas em sequência.
} Em WF, este padrão é implementado através:
} da actividade Sequence } da actividade FlowChart } Exemplo: Permite serem adicionadas actividades que serão executadas sequencialmente.
Padrões básicos de workflow:Parallel Split
} Parallel Split
} Permite que uma única thread de execução seja partida em dois ou mais
branches, de modo a pode executar tarefas concorrentemente.
} Em WF, este padrão é implementado através da actividade Parallel
} Exemplo:
Permite serem adicionadas
actividades que serão executadas em paralelo.
} Exemplo:
} Após cobrar o cartão de crédito, enviar o recibo por e-mail ao cliente e
começar o processo de envio da ordem.
} Mais exemplos:
} ParallelSplitPattern
Padrões básicos de workflow:Parallel Split
} Synchonization
} Permite a reconvergência da execução de threads de dois ou mais branches em
paralelo.
} Em WF, este padrão é implementado através:
} das actividades Sequence e Parallel
} das actividades Sequence e ParallelForEach
} Exemplo:
Após sincronização, o controlo de execução é dado à actividade que for adicionada sequencialmente
Padrões básicos de workflow
} Exclusive Choice
} Permite direccionar a thread de controlo para uma determinada actividade, dependendo do resultado
produzido pela actividade precedente.
} Em WF, pode ser implementado, dependendo do caso concreto, através:
} Da actividade Sequence e da actividade If
} Da actividade Sequence e da actividade Switch
} Da actividade Sequence e da actividade Pick
} Da actividade FlowChart e da actividade FlowDecision
} Da actividade FlowChart e da actividade FlowSwitch
} Exemplos:
Exemplo: OrderDelivery
} Dada uma encomenda de alguns produtos, o workflow a desenvolver,
correspondente à logistica, deverá determinar o custo total da encomenda, tendo em conta o peso da encomenda (50 ct por kg) e da urgência na
entrega (no próprio dia, no dia seguinte, 8 ou mais dias).
public class OrderItem{
public int OrderItemID{ get; set; } public int Quantity{ get; set;}
public string ItemCode{ get; set;} public string Description{ get; set;} }
public class Order{
public List<OrderItem> Items{ get; set;} public Order(){
Items=new List<OrderItem>(); }
public string Description{ get; set;} public double TotalWeight{get; set;} public string ShippingMethod{get; set;}
Quais os
padrões
de
workflow
envolvidos na
implementação
deste workflow?
Exemplo: OrderDelivery
} Padrões utilizados em Order:
} Sequence Pattern: apenas
receber a ordem, calcular quanto é que deve ser cobrado pelo peso
} Exclusive Choice Pattern:
dependendo a urgência da entrega, é cobrado 5, 10 ou 15 euros)
Exemplo
}
Leitura de um número:
Manipulação de Excepções
} Além da actividade TryCatch, também existe a actividade Throw.
} Através da actividade TryCatch, pode-se implementar os padrões Cancel Task e
Invocar métodos
}
Invocar métodos sem parâmetros
public void Method() {
Console.WriteLine("'void Method()' is called"); }
Invocar métodos com parâmetros
public void Method(string message1, string message2) {
Console.WriteLine("'void Method(string message1, string message2)' is called"); Console.WriteLine("Hello, this is your message1:" + message1);
Console.WriteLine("Hello, this is your message2:" + message2); }
Invocar métodos com retorno
public string MethodWithReturn(string message1, string message2) {
Console.WriteLine("'string MethodWithReturn(string message1,string message2)' is called");
return "message1:" + message1 + " " + "message2:" + message2; }