If you can't read please download the document
Upload
maciek-prochniak
View
648
Download
0
Embed Size (px)
Citation preview
Slajd 1
Kto i o czym
Maciek [email protected]
TouKhttp://touk.pl
Camelhttp://camel.apache.org
Droolshttp://www.jboss.org/drools
Procesy - narzdzia
Wiele jzykw/narzdzi do ich opisuApache ODEBPEL
JBPMJPDL
XPDL
...
Drools Flow
Rne komercyjne rozwizania :)
Procesy - narzdzia
Dobrze nadaj si do opisywania workflowwBPM
Programowanie 'imperatywne'
rdo: Wikipedia
Procesy - narzdzia
Czasami to nie wystarczaProces zawiera wiele zaptle
Duo niezalenych zdarze
Wikszo umoliwia obsug asynchronicznych zdarzeAle wtedy struktura staje si nieczytelna
Przykad wymaga
Jeli po 10min od zoenia zamwienia brak patnoci to
Jeli zamwienie zrealizowane w czasie mniej ni 3h to
Jeli jest magazyn wysa potwierdzenie, a klient wysa rezygnacj to ...
Proces sterowany reguami
Deklaratywny opis zachowaniaCO chcemy zrobi, a nie JAK
Reguy opisuj:Obsug nadchodzcych komunikatwTrasowanie
Zachowanie procesu w czasieTimery
Moe warto wydzieli cz procesu?
Co jeszcze jest potrzebne?
TestowalnoSymulacja upywu czasu
Integracja z systemami zewntrznymiESB np. Apache Servicemix
Prostota:)
Case Study
Proces obsugi zamwienia
Systemy zewntrzneMagazyn
Serwer pocztowy
ZdarzeniaZamwienie
Wysanie do magazynu
Rezygnacja klienta ...
Case Study
FunkcjonalnociWysyanie powiadomie po okrelonym czasie
Anulowanie zamwienia
Bonusy gdy zamwienie szybko si koczy
Camel + Drools
Apache CamelIntegracja z innymi systemami
Trasowanie komunikatw
Wykorzystanie POJO (np. Spring)
Jboss DroolsDeklaratywny opis przebiegu procesu
Reguy obsugi komunikatw
Sterowanie zachowaniem si procesu w czasie
Drools
Drools ExpertDeklaratywny opis regu
atwa integracja z obiektami Javy
Drools FusionReguy zalece od czasu
Moliwo mockowania upywu czasu (testy!)
Drools - przykady
$order : Order()not Contract(this after [-*,10m] $order )
$contract : Contract()not Activation(this after [1s,134d] $contract)
$activation : not Activation( this during $waitingRoom )
$contract : Contract( this coincides[15s, 10s] $order )
rule "sendParcel"when $order : Order() not CancelOrder(order == $order)then System.out.println(sendParcel);end
Camel
Framework integracyjnyImplementacja EIP
Przyjazny DSL w Javie
Bardzo duo adapterw
Niewielkie wymagania, atwa do osadzeniaW praktyce 'mini-ESB'
Camel - EIP
Router
Filtr
Listy odbiorcw
Translacja wiadomoci
Wzbogacanie wiadomoci
Agregator
...
Camel - przykady
from("ref:orderConfirmation").filter().simple("${header.type} = 'order'").bean(ObjectFactory.class).to("direct:processRules");
from("jms:confirmationQueue").choice() .when().xpath("//order/amount/text() > 1000") .to("jms:bigOrdersTopic") .otherwise() .to("file://smallOrders");
public Order createOrder(@XPath("//@code") String code, @Properties Map properties) { properties.put(DROOLS_KEY, code); return new Order(code, 12);}
Camel + Drools
Nowy komponent Camela
Made byhttp://top.touk.pl/svn/camel-components/
Dwie wersjeBezstanowa
Stanowa
Konieczno dodatkowej konfiguracjiAle niewielkiej :)
Drools - fork
'Oficjalna' wersja Ma kilka bugw
Brakuje jej niektrych funkcjonalnoci
Wydalimy wasn wersj z poprawkami :)
Bezstanowo - routing
Do sesji trafiaj wszystkie przekazane faktyMona uy wzorca Content Enricher
Routing moliwy za pomoc pomocniczej klasy CamelDroolsHelper
Bezstanowo - routing
from("direct:order").to("drools:orderRoutingRules.drl");
from("direct:normal").to("bean:mailPreparer").to("smtp:mailServer);
global org.apache.camel.component.drools.CamelDroolsHelper helperrule "normalClient"when $customer : Customer(status == Customer.Status.normal) $order : Order(state == Order.State.NEW, customer == $customer)then helper.send("direct:normal", $order);end
Stanowo procesy
Ile jest sesji i kiedy s tworzone?
Co i kiedy jest zapisywane w bazie?
Jak znale waciwy proces dla danego komunikatu?
Co robi kiedy reguy si zmieni?
Ziarnisto sesji
Kada sesja odpowiada procesowi
Duo maych sesjiTak naprawd to nie jest normalne wykorzystanie Drools
Konieczno zarzdzania cache'm sesji w pamiciMusimy pamita kiedy moe si uruchomi nastpna regua
Case study
Potwierdzenie zamwienia
rule "mailAfterConfirmation"whenOrder()OrderConfirmation()thensender.send("direct:mailSender", "Zamowienie potwierdzone");
from("jms:warehouseQueue").setProperty("drools.key").header("orderCode").to("drools:orderProcessRules.drl?stateful=true");
Case study
Powiadomienia
rule "reminderAfter10minutes"when $o : Order() not Payment(this after [-*,10m] $o)then sender.send("direct:mailSender", "Prosimy zapaci!");end
rule "lastNotCancellation"when $warehouseProcessing : Warehouse() OrderCancel(this during $warehouseProcessing)then sender.send("direct:sendReminder", "Nie mona skasowac");end
Persystencja
Dane dotyczce samej sieci s zapisywane binarnie
Fakty mog bySerializowane razem z sesj
Serializowane w oddzielnej tabeli
Mapowane na podstawie id przy wczytywaniu sesji
Persystencja
Musimy tylko okreli jak zapisywa i odczytywa fakty:
Object toObject(DatabaseObjectWrapper wrapper); DatabaseObjectWrapper fromObject(Object object);
DatabaseObjectWrapper:
private long sessionId; private long objectId; private String type; private Date timestamp;
Korelacja
Ustawiamy nagwek wiadomoci drools.key Moe to by dowolny MultiKey
Jego elementy odpowiadaj kolumnom w tabeli z zapisanymi sesjami
from("direct:drools") .setHeader("drools.key", constant(new MultiKey("process-1", "232"))) .to("drools:task.drl?stateful=true");
Wersjonowanie i migracja
Struktura sesji Drools jest bardzo wraliwa na zmiany regu
Moliwe rozwizaniaMigracja po kadej zmianie
Prby odtworzenia stanu na podstawie obiektw w sesji
Problemy przy operacjach typu update
Testy
Moliwo testw Jednostkowych
Behawioralnych
Integracyjnych
Drools umoliwiaj mockowanie przepywu czasu
Mockowanie serwisw za pomoc standardowych technik
Testy
ksession.setGlobal(confirmationService, mock); insertAdvanceDays(new Order(),10); assert(3, mock.messagesReceived); advanceDays(10); assert(4, mock.messagesReceived);
GenericTest metody pomocniczeUpyw czasu
Inicjalizacja
Zalety
Dobre przeoenie opisu biznesowego
Prostota
Moliwo dostosowania do konkretnego przypadku uycia
Mechanizm automatycznej migracji do nowej wersji regu
Wady
Trzymanie stanu procesu w postaci binarnej
Problemy z obsug np. kasowania
Mniejsze moliwoci ni przy np. Drools Flow
Pytania?
Dzikuj za uwag :)
rdo: Wikipedia
Appendix
Krtkie wprowadzenieDrools
Camel
Drools
drool /drul/ verb (used without object) 1. to water at the mouth, as in anticipation of food; salivate; drivel. 2. to show excessive pleasure or anticipation of pleasure. 3. to talk foolishly. noun 4. saliva running down from one's mouth; drivel.
JBoss Drools
Business Rules Management System
Algorytm Rete
Jzyk opisu regu
Gwne komponenty:Drools Expert
Drools Fusion
Drools Flow
Drools Guvnor
Drools Planner
Drools Expert
'Produkcyjny' system reguLHS 'jeli'
RHS 'to'
Algorytm ReteSie wzw przechowujcych fakty
Do kosztowna budowa
Szybkie dziaanie niezalenie od iloci regu
Drools - sesja wiedzy
Przechowuje stan sieci ReteObiekty reprezentujce fakty
Ktre reguy zostay ju 'odpalone'
Jest serializowanaAle zmiana regu zwykle jest niekompatybilna
Drools jzyk opisu regu
import pl.touk.javarsovia.model.*
global pl.touk.javarsovia.utils.Sender sender
rule "normalClient"when $customer : Customer(status == Customer.Status.normal) $order : Order(state == Order.State.NEW, customer == $customer)then sender.send("direct:normal", $o);end
Drools jzyk opisu regu
rule "sendParcel"when $order : Order() $confirmation : WarehouseConfirmation(order == $order) not CancelOrder(order == $order)then sender.send("direct:parcel", $confirmation) end
Przykad uycia
KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();knowledgeBuilder.add(new ClassPathResource("orderRules.drl"),ResourceType.DRL); KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();knowledgeBase.addKnowledgePackages(knowledgeBuilder.getKnowledgePackages()); StatefulKnowledgeSession statefulKnowledgeSession =knowledgeBase.newStatefulKnowledgeSession();
Przykad uycia - cd
StatefulKnowledgeSession statefulKnowledgeSession =knowledgeBase.newStatefulKnowledgeSession();statefulKnowledgeSession.setGlobal("sender", sender); Order order = new Order();statefulKnowledgeSession.insert(order);statefulKnowledgeSession.fireAllRules();
Drools - dodatki
DSLatwiej zrozumiae dla klienta
SzablonyPrzydatne dla regu rnicych tylko niektrymi parametrami
Drools Fusion
CEP przetwarzanie strumienia zdarze i wybieranie sekwencji
Zdarzenia (event)Rozpoczynaj si w okrelonym momencie
Trwaj przez pewien czas
Podstawa do wnioskowania temporalnego
Drools Fusion - Eventy
declare Order @role(event) @expires(365d) @duration(duration)end
public class Order { public long getDuration() { return 5000; } public long getTimestamp() { return createTime.getDate(); } }
Drools Fusion - predykaty
$order : Order()not Contract(this after [-*,-10m] $order )
$contract : Contract()not Activation(this after [1s,134d] $contract)
$activation : not Activation( this during $waitingRoom )
$contract : Contract( this coincides[15s, 10s] $order )
Drools Fusion - testowanie
KnowledgeSessionConfiguration conf = KnowledgeBaseFactory .newKnowledgeSessionConfiguration(); conf.setOption( ClockTypeOption.get( "pseudo" ) );
StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession( conf, null ); SessionPseudoClock clock = session.getSessionClock(); session.insert(new Order());clock.advanceTime(10, TimeUnit.SECONDS);
Agenda
Wprowadzenie
Drools
Camel
Camel + Drools
Camel
rdo: Wikipedia
Apache Camel
Framework integracyjny
Implementacja wzorcw EIPHophe & Woolf
Przyjazny DSL w Javie
Integracja ze Spring, OSGI, Servicemix,...
Niewielkie wymagania, atwa do osadzenia
Camel - architektura
KontekstPodstawowa jednostka pracy
EndpointyIntegracja z innymi aplikacjami
Komunikacja wewntrz aplikacji
Trasycz procesory w sekwencje
Camel - EIP
Router
Filtr
Listy odbiorcw
Translacja wiadomoci
Wzbogacanie wiadomoci
Agregator
...
Camel DSL
Tworzenie tras w Javie
from("ref:orderConfirmation") .filter().simple("${header.type} = 'order'") .bean(ObjectFactory.class).to("direct:processRules"); from("direct:process").setProperty("name") .xpath("local-name(/*)", String.class, wip) .recipientList().simple("direct:${property.name}");
Camel uycie POJO
public Order createOrder( @XPath("//@code") String code, @Header(name="user") String user, @Properties Map properties) { properties.put(DROOLS_KEY, code); return new Order(parseDate(sendDate), user); }
from("ref:order").bean(OrderOperations.class, "createOrder").to(...)
Camel - komponenty
httppropertiesquartzsqlhibernate
refdirectsedaxmppxslt
xquerysmooksrmiejbvelocity
validationsmtpjettyrestlet...
drools :)hise :)
Ponad 70...
Camel integracja ze Springiem
from("ref:ckpio").to("bean:productRepository?method=get").
2010
lallala
2010
lallala