Transcript Document
Procesy biznesowe
Windows Workflow
Foundation
Proces Biznesowy
PB jest zbiorem jednej lub wielu powiązanych ze sobą
procedur lub aktywności, których wykonanie prowadzi do
osiągnięcia celu biznesowego.
PB jest inicjowany przez pewne zdarzenie biznesowe.
W czasie wykonywania PB wykorzystywane są zasoby
organizacji oraz dostarczane są produkty (wyniki
biznesowe) do wszystkich zainteresowanych stron
(pracownicy, klienci, dostawcy, właściciele organizacji,
itd.).
PB posiada mierniki efektywności, dzięki czemu proces
można oceniać, porównywać z innymi procesami i w
dalszej konsekwencji ulepszać.
Pojęcia
Zgłoszenie
zapotrzebowania
Dostępne zasoby
Brak wolnych zasobów
Zamówienie
zasobów
Rezerwacja
zasobów
Pobranie
zasobów
Model vs. instancja
Aktywność
Środowisko uruchomieniowe
Business Process Execution
Language for Web Services
Język opisu opracowany przez BEA Systems,
IBM, Microsoft, SAP AG, Siebel Syst
Wspiera wykorzystywanie usług sieciowych
kontrolując ich wywoływanie i koordynację
Jest interpretowany i wykonywany przez silnik
(ang. Workflow Engine)
Wspiera wykonywanie długich transakcji (dni,
tygodnie, miesiące)
Zapewnia obsługę wyjątków pojawiających się w
takcie wykonywania procesu
Business Process Execution
Language for Web Services
Język BPEL4WS jest oparty na XML
Do korzystania z BPEL4WS stworzono
narzędzia graficzne.
Podstawowe elementy, które wykorzystuje się
podczas modelowania to:
graniczne procesu (inaczej porty) – miejsca, w
których proces biznesowy styka się z systemami za
pośrednictwem wywoływanych usług sieciowych
Wiadomości – informacje przesyłane pomiędzy
poszczególnymi portami
Aktywności – elementy, które mają wpływ na sposób
przepływu wiadomości pomiędzy portami.
Punkty
Business Process Modelling
Notation
Standard stworzony przez Business Process
Management Initiative - BPMI, obecnie rozwijany przez
Object Managament Group
Notacja, która byłaby zrozumiała dla wszystkich
użytkowników: od analityków biznesowych, poprzez
programistów, aż po osoby odpowiedzialne za
monitorowanie procesów
Prezentacja modelu (np. BPEL4WS) użytkownikom
biznesowym.
Etap pośredni pomiędzy modelowaniem i implementacją.
Graficzne narzędzia dostępne wraz z WF przedstawiają
procesy biznesowe w odmienny sposób, zapewniając
większą ilość szczegółowych informacji dla programisty.
Microsoft BizTalk Server
integracja aplikacji w ramach organizacji – EAI (ang.
Enterprise Application Integration)
integracja aplikacji między różnymi organizacjami – B2B
(ang. Business to Business)
Wykorzystanie specjalizowanego serwera
uruchamieniowego dla procesów biznesowych pozwala
tworzyć skalowalne i odporne na awarie rozwiązania.
Wszystkie moduły wchodzące w skład produktu mogą
być uruchamiane na wielu fizycznych maszynach
realizujących ten sam, logiczny proces biznesowy.
Microsoft BizTalk Server
Orchestration Designer
BizTalk Schema Editor
BizTalk Mapper
Adapter Framework oraz zestaw gotowych
adapterów
Środowisko uruchomieniowe
Orchestration Designer
Graficzne modelowanie PB
Dostępny jako plugin do MSVisio lub
uruchamianiy z VS
Stała grupa aktywności m.in.:
przygotowanie
komunikatu (construct message)
przypisanie komunikatu (message assignment)
transformacja komunikatu (transform).
Model procesu może obejmować również
elementy odpowiedzialne za monitorowanie
zdarzeń ważnych z punktu widzenia biznesu
Orchestration Designer
BizTalk Schema Editor
Tworzenie schematów XML (XSD)
definiujących komunikaty przetwarzane
przez orkiestrację
Na tej podstawie komunikat może być
stworzony np. poprzez aktywność
przypisania komunikatu.
BizTalk Schema Editor
BizTalk Mapper
definiowania mapowania wykorzystywanego
przez aktywność transformacji
Aktywność transformacji zmienia komunikat na
inny (dokument XML -> dokument XML)
Na tej podstawie komunikat może być stworzony
np. poprzez aktywność przypisania komunikatu.
BizTalk Mapper
Integracja Biztalka
Komunikacja pomiędzy różnymi systemami za
odbywa się za pomocą różnych protokołów
komunikacyjnych
Porty używane w orkiestracjach wykorzystują
elementy zwane adapterami
Adaptery:
predefiniowane
(m.in. Adapter Web Services, Adapter
plików, Adapter HTTP/SMTP/POP3, Adapter SQL )
dedykowane do konkretnych aplikacji (m.in. Adapter
WebSphere MQ lub Adapter Windows SharePoint
Services)
dostarczone przez fimy zewnętrzne
stworzone z wykorzystaniem Adapter Framework
Środowisko uruchomieniowe
Elementy wchodzące w skład orkiestracji są
kompilowane do postaci bibliotek DLL.
Procesy przed uruchomieniem należy umieścić
(ang. deploy) na serwerze BizTalk Server oraz
połączyć z odpowiednimi portami.
Porty są tworzone na serwerze (np. np. BizTalk
Administration Console) jako oddzielne
elementy - niezależność procesu biznesowego
od zewnętrznych systemów.
Business Rules Engine
Definiowanie i obliczanie reguł logicznych
wykorzystywanych do odpowiedniego
przetwarzania procesów biznesowych.
Przydatny zwłaszcza, gdy podczas
implementowania procesu należy brać pod
uwagę dużą ilość parametrów mających wpływ
na przebieg procesu.
Możliwość modyfikacji reguł bez konieczności
zmieniania orkiestracji, (tj. bez zmiany modelu,
rekompilacji oraz wdrażania).
Do modyfikacji reguł można używać narzędzia
Business Rule Composer.
BizTalk Administration Console
Podstawowe narzędzie służące do zarządzania
silnikiem BizTalk Server.
Informacje przydatne do monitorowania działania
wszystkich składników serwera.
Konfiguracja i wdrażanie wszystkich elementów (tj.
m.in. procesy biznesowe, porty, powiązania
pomiędzy portami i orkiestracjami oraz wymagane
biblioteki DLL), np.: ustawianie adresu URL dla
portu wykorzystującego adapter HTTP - Logika
działania procesu jest niezależna od środowiska
wykonywania.
Business Activity Monitoring
Śledzenie informacji ważnych z punktu widzenia
użytkowników biznesowych.
Orkiestracje muszą udostępniać odpowiednie dane i
zdarzenia (musi to być uwzględnione na etapie
implementacji procesu).
Odpowiednio przygotowana orkiestracja w trakcie
wykonywania, zapisuje dane w bazie danych (ang.
tracking database),
Businnes Activity Monitoring może być wykorzystany do
monitorowania zdarzeń nie tylko orkiestracji ale także
dowolnych aplikacji stworzonych w oparciu o platformę
.NET.
IBM WebSphere
WebSphere Business Modeler:
WebSphere Integration Developer
implementacja modelu PB.
wykorzystanie wizualnych elementów, odpowiadających
elementom znanym z języka BPEL
możliwość zaimplementowania maszyny stanów (ang. state
machine).
WebSphere Process Server
graficzny edytor umożliwiający modelowanie PB
możliwość przeprowadzenia symulacji stworzonego PB i jego
analizy za pomocą stworzonych wskaźników biznesowych.
serwer aplikacji oraz silnik odpowiedzialny za uruchamianie
procesów biznesowych oparty o Enterprise Service Bus
wspiera dynamiczne modyfikowanie reguł biznesowych
wykorzystywanych przez procesy.
WebSphere Business Monitor
Inne rozwiazania
Jboss i Flux
Oracle:
workflow package,
WF_Engine wraz z Java API
Dziedziny zastosowań
Szybka zmiennosc wymagań (np. plany taryfowe
oeratorów t. Komórkowych)
Duże zindywidualizowanie wymagań – planowanie obsługi
klientów, sposobów przetwarzania danych itd.
Powtarzalność definicji
.NET Framework 3.x
Workflow Foundation – pierwsze wydanie
.NET Framework 4.x
Workflow Foundation – zupełnie
zmieniona implementacja
Windows Workflow
Foundation
Rodzaje przepływów
Proces
sekwencyjny
Proces stanowy
Aktywności
Środowisko uruchomieniowe
Proces sekwencyjny
Proces sekwencyjny składa się z punktu wejscia, punktu
wyjścia oraz kolejnych aktywności wykonywanych jedna
po drugiej.
Klasa definiująca ten typ procesu dziedziczy po klasie
SequentialWorkflowActivity.
Na przebieg wykonania procesu mają wpływ aktywności
zmieniające przepływ procesu.
Przebieg procesu może zostać zmieniony w wyniku
wystąpienia wyjątków, które mogą być przechwytywane
na poziomie pojedynczej aktywności lub całego procesu.
Proces sekwencyjny
Przykład
Aktywności kontrolujące
przepływ
IfElseActivity
IfElseBranchActivity
Aktywności kontrolujące
przepływ
WhileActivity
Aktywności kontrolujące
przepływ
SequenceActivity
ParallelActivity
Proces stanowy
Zaniechany w WF 4.0/ ponownie udostepniony w WF 4.5
Proces stanowy jest procesem, który można porównać
do skończonej maszyny stanowej. Składa się z
specjalnych aktywności typu StateActivity, które reprezentują
stan procesu
połączeń określających możliwe przejścia między stanami.
Spośród aktywności odpowiadających stanom można
wyróżnić aktywność początkową oraz opcjonalną
aktywność, która symbolizuje zakończenie procesu.
Proces stanowy jest realizowany jako klasa dziedzicząca
po StateMachineWorkflowActivity.
Proces stanowy. Przykład
Środowisko uruchomieniowe
Aplikacja
Instancja procesu
Środowisko uruchomieniowe
Usługi
WF4.0 Wszystko jest aktywnością
CodeActivity
Workflow jest również
aktywnością
AsyncCodeActivity
Activity
NativeActivity
DynamicActivity
Dynamiczne aktywności WF4.0
Foo.dll
<Activity x:Class=“Foo" >
<x:Members>
<x:Property Name="argument1“
Type="InArgument(x:String)" />
<x:Property Name="argument2”
Type="InArgument(x:String)" />
</x:Members>
C# (DynamicActivity)
Activity x =
ActivityXamlServices.Load(xamlFile);
WorkflowInvoker.Invoke(x, new Dictionary … );
WorkflowInvoker WF4.0
Foo
WorkflowInvoker.Invoke(new foo)
WorkflowApplication WF 4.0
Foo
Foo
Foo
var wa = new
WorkflowApplication(new Foo)
wa.Unload()
wa.Run()
Otoczenie procesu
WF4.0
Foo
Foo
Foo
WF Persistence
WF 4.0
Workflow Events
Workflow Runtime
Tooling
Tracking Provider
add
Tracking Profile
notify
Tracking Participant
Tworzenie WF
WF jest aktywnością
może być napisany w postaci kodu lub zdefiniowany w XAML –
lub dowolnym innym formacie (np w jęz. dynamicznym)
Aktywność może zawierać inne aktywności
Aktywność może mieć argumenty we i wy (jak również zmienne)
Aktywności zwracajace warość mają oddzielne klasy bazowe
n.p. CodeActivity<TResult>, NativeActivity<TResult>
WF jest definicją, wg której można utworzyć wiele
instancji
Każda instancja ma indywidualne środowisko (zmienne,
argumenty)
InArgument
Wykonanie
WF runtime „widzi” aktywności, aktywności,
aktywności (nie Sequence, Parallel, Recurrence)
runtime jest „sędzią” pilnuje reguł
CacheMetadata sposób auto-opisu aktywności
WF
WF runtime „wie” o zakończeniu aktywności
Aktywność może zlecić wykonanie aktywności
potomnej (i. ew. poczekać na jej zakończenie)
Mozliwych
jest wiele różnych działań (“pulses of work”)
dla jednej aktywności
Możliwe jest wyrażenie dowolnych, złożonych
rodzajów przepływów (control flow)
Możliwe jest wiele scieżek wykonania…
Scheduler
Work items are executed
one at a time within a
single workflow instance
while !EmptyList
Execute(next WorkItem)
DoBookkeeping()
Some work items
are added to the
front of the list,
others to the back
PARALLEL
SEQUENCE
1
SEQUENCE
2
■
Workflow Instance Complete!
Scheduler
Jedna instancja Scheduler-a na proces
Zarządza uporządkowana listą zadań
jednostkowych
Zadania
mogą być dodwane przez aktywności ale
również przez hosta lub zewnętrzny kod
Niektóre zdania sa dodawane na poczatek inne na
koniec kolejki
Wykonywane jest jedno zadnie na raz
Zadania
nie sa przerywane
Pomiędzy zadaniami mogą być realizowane różne
operacje np. tracking, persistence
Threading Model
Dla pojedynczej instancji programu jest wykorzystywany
jeden wątek na raz
Upraszcza model programowania aktywności
Do poszczegolnych zadań mogą zostać przypisane rózne wątki
(jeden na raz)w ramach tej samej instancji
WF runtime korzysta z dostarczonego przez hosta
SynchronizationContext
Nie mozna wykorzystać TLS dla WF
System.Threading.SynchronizationContext
Można wykorzystać dla utworzenia własnych mechanizmów zarzadzania
wątkami
WF Execution Properties – nazwane własciwośc i widoczne dla
poddrzewa WF
WF runetime odpowiada za dołączanie / odłaczanie środowiska brzed/po
wykonaniu zadania
Aktywności nie powinny blokować wątku
WF programs coordinate work
Asynchroniczne Aktywności
Parallel + asynchroniczne a. = równoległość
Bookmarks
Co się dzieje gdy program musi czekać (i czekac
i czekać) na wejście?
Być
może czeka również 1000 innych instancji
Potrzebny nieobciążajacy systemu WaitForInput()
Zakładka!
Nazwany
punkt wznowienia w WF
Wznowienie wskazuje metodę zwrotną aktywności
WF runtime zarządza wznowieniem – instancja nie
musi być w pamięci
Gotowa do użycia aktywność WCF Receive
Bookmark Resumption
“Please deliver
[data] to instance
[id] at bookmark
[name]”
Persystencja
Persystencja pozwala wstrzymywać instancję WF,
zapisać ją „gdzieś” i wznowić później
Instancje WF są serializowalne
Stos CLR nie jest serializowalny, ale instancja WF ma stos tylko w
trakcie wykonania pojedynczego zadania
Czasem nie chcemy możliwości persystencji - “no persist
zone”
Zachowana instancja nie jest związana z konkretnym WF hostem,
komputerem, CLR, wątkiem czy procesem
Zalety skalowalność, odporność na upadki
Automatyczne założenie podczas asynchronicznych aktywności
Szczegóły implementacji persystencji są niezależne od
silnika WF
Co jest w utrwalonej instancji
Zserializowana instancja zawiera:
Listę
zadań (pustą jeśli instyancja jest wolna)
Bookmark-i
Dane (argumenty and zmienne)
Środowisko dla wszystkich aktualnie wykonywanych
aktywności
Informacje
o instancji (callbacks, execution props)
Dodatkowe dane od uczestników procesu persystencji
Nie zawiera definicji WF
Milion
instancji może współdzielic tą samą definicję
Zarządzanie definicjami leży w gestii hosta
[ Przykład: zserializowana instancja WF ]
PARALLEL
private int index
private int index
string s
DateTime d
int n
■
[ Przykład: zserializowana instancja WF ]
PARALLEL
private int index
3
string s
“hello”
private int index
DateTime d
int n
Bookmark:“x”
■
Aktywności kontrolujące przepływ
Definiują sposób wykonania dla złożonych
aktywności
Dowolna aktywność może być rdzeniem
Aktywności można zagłębiać
Parallel
Activity 1
B
C
Activity 3
Activity 1
Activity 2
Activity 3
Activity 4
PickBranch
PickBranch
PickBranch
Approve
Reject
Delay
(TimeOut)
Action A
Action B
Action C
Przegląd aktywności
Assign
Compensate
Persist
ReceiveMessage
SendMessage
Throw
TryCatch
Flowchart
DoWhile
While
ForEach
If
Pick
Switch
Sequence
Parallel
Przepływ sekwencyjn
Przepływ typu Workflow
Rrozszerzanie WF
Tworzy mechanizm pozwalający
wstrzykiwać zewnętrzną logike w
predefiniowane miejsca głównego WF
WF są rozszerzane w naturalny sposób
przez kolejne WF
Tworzenie i uruchamianie WF
Tworzenie WF:
new
MyVeryImportantWorkflow()
ActivityXamlServices.Load(“MyVeryImportant
Workflow.xaml")
Uruchamianie WF:
WorkflowInvoker.Invoke(wf);
WorkflowApplication
app =
new WorkflowApplication(a);
app.Run();
Hierarchia aktywności WF
Activity
AsyncCode
Activity
Code
Activity
AsyncCode
Activity
<TResult>
Activity
<TResult>
Code
Activity
<TResult>
Native
Activity
Native
Activity
<Tresult>
Aktywność WF
public class SayHelloInCode : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
Console.WriteLine("Hello Workflow 4 in code");
}
}
Należy przeciążyć Execute
Asynchroniczna Aktywność WF
public class SayHelloInAsyncWay : AsyncCodeActivity
{
protected override IAsyncResult BeginExecute(
AsyncCodeActivityContext context,
AsyncCallback callback, object state)
{
...
return stream.BeginWrite(bytes,0,bytes.Length,callback,state);
}
protected override void EndExecute(AsyncCodeActivityContext context,
IAsyncResult result)
{
...
FileStream stream = (FileStream)context.UserState;
stream.EndWrite(result);
}
}
Należy przeciążyć BeginExecute i EndExecute
Zakładki WF
public class ReadLine : NativeActivity<string>
{
protected override void Execute(NativeActivityContext context)
{
context.CreateBookmark("ReadLine",
new BookmarkCallback(BookmarkResumed));
}
private void BookmarkResumed(NativeActivityContext context,
Bookmark bk, object state)
{
Result.Set(context, state);
}
}
Bookmark wskazuje na f. aktywności
Aktywacja zakładki
WorkflowApplication app = new
WorkflowApplication(MyWorkflow);
app.Run();
app.ResumeBookmark(" ReadLine", "... something ...");
Hostowanie WF
Dedykowany proces
Workflow services
Windows Application Server (codename
„Dublin”) + IIS
WorkflowService
Windows Application Service
ASP.NET vs WorkflowService
ASP.NET vs WorkflowServices /
Dublin
WF Service – data kontrakt
[DataContract]
public class ExpenseReport
{
[DataMember]
public DateTime FirstDateOfTravel { get; set; }
[DataMember]
public double TotalAmount { get; set; }
[DataMember]
public string EmployeeName { get; set; }
}
WF Service - Konfiguracja aktyw.
WF Service - podgląd serwisu
WF Service - host
WorkflowServiceHost host = new WorkflowServiceHost(
XamlServices.Load("ExpenseReportService.xamlx"),
new Uri("http://localhost:9897/Services/Expense") );
host.AddDefaultEndpoints();
host.Description.Behaviors.Add(
new ServiceMetadataBehavior { HttpGetEnabled = true });
//dodatkowy end point
WorkflowControlEndpoint wce = new WorkflowControlEndpoint(
new NetNamedPipeBinding(),
new EndpointAddress("net.pipe://localhost/Expense/WCE"));
host.Open();
Console.WriteLine("Host is open");
Console.ReadLine();
Persystencja - baza
Przygotowanie bazy
1. %windir%\Microsoft.NET\Framework\v4.0
.21006\sql\<language>
2. SqlWorkflowInstanceStoreSchema.sql
3. SqlWorkflowInstanceStoreLogic.sql
Persystencja – konfiguracja
providera
WorkflowApplication application = new WorkflowApplication(activity);
InstanceStore instanceStore = new SqlWorkflowInstanceStore(
@"Data Source=.\SQLEXPRESS;Integrated Security=True");
InstanceView view = instanceStore.Execute(
instanceStore.CreateInstanceHandle(),
new CreateWorkflowOwnerCommand(),
TimeSpan.FromSeconds(30));
instanceStore.DefaultInstanceOwner = view.InstanceOwner;
application.InstanceStore = instanceStore;
Persystencja
Konfiguracja providera
WorkflowApplication application = new WorkflowApplication(activity);
InstanceStore instanceStore = new SqlWorkflowInstanceStore(
@"Data Source=.\SQLEXPRESS;Integrated Security=True");
InstanceView view = instanceStore.Execute(
instanceStore.CreateInstanceHandle(),
new CreateWorkflowOwnerCommand(),
TimeSpan.FromSeconds(30));
instanceStore.DefaultInstanceOwner = view.InstanceOwner;
application.InstanceStore = instanceStore;
Wymuszanie utrwalania workflow-u
wf.PersistableIdle = (waie) => PersistableIdleAction.Persist
WF Tracking
Po zakończeniu WF jest likwidowany –
oczywiscie można zareagować na
odpowiednie zdarzenie ...
Tracking:
(standardowo dostępny
EtwTrackingParticipant ETW = Enterprise
Trace for Windows ))
TrackingProfile
TrackingParticipant
Tracking profile
ActivityStateQuery
WorkflowInstanceQuery
CustomTrackingQuery
TrackingProfile profile = new TrackingProfile
{
Name = "SimpleProfile",
Queries = {
new WorkflowInstanceQuery {
States = { "*" }
},
new ActivityStateQuery {
ActivityName = "WriteLine",
States={ "*" },
Variables = {"Text" }
}
}
};
Activity Designer
Kontrolki WPF:
ActivityDesigner
WorkflowItemPresenter
WorkflowItemsPresenter
ExpressionTextBox
WF: Model programowy
Activity wf = new Sequence {
Activities = {
new WriteLine { Text = "Hello" },
new WriteLine { Text = "World." }
}
};
WorkflowInvoker.Invoke(wf);
WF: Zmienne
Sequence wf = new Sequence {
Variables = {
new Variable<string>{ Default = "Hello", Name = "greeting"},
new Variable<string> { Default = "Bill", Name = "name" }
},
Activities = {
new WriteLine {
Text = new VisualBasicValue<string>("greeting“)
},
new WriteLine {
Text = new VisualBasicValue<string>("name + \"Gates\"")}
}
}
};
WorkflowInvoker.Invoke(wf);
WF: Przekazywanie parametrów
IDictionary<string, object> results = WorkflowInvoker.Invoke(wf,
new Dictionary<string,object> {
{"name", "Bill" } }
);
string outValue = results["fullGreeting"].ToString();
WF: Przekazywanie parametrów
IDictionary<string, object> results = WorkflowInvoker.Invoke(wf,
new Dictionary<string,object> {
{"name", "Bill" } }
);
string outValue = results["fullGreeting"].ToString();
//{…
// public InArgument<string> Name {get; set;}
//