Camel-Drools - Javarsovia 2010

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