SlideShare a Scribd company logo
1 of 89
Download to read offline
Mark
     Proctor
    Project Lead




●
  The SkyNet funding bill is passed.
●
  The system goes online on August 4th, 1997.
●
  Human decisions are removed from strategic defense.
●
  SkyNet begins to learn at a geometric rate.
●
  It becomes self-aware at 2:14am Eastern time, August
29th
●
  In a panic, they try to pull the plug.
●
  And, Skynet fights back
Introduction




Drools     Drools     Drools     Drools
Expert      Flow      Fusion     Guvnor


    Business Logic integration Platform



                                          2
Drools Expert
Learn by Example
Classes

                                                       C a s h f lo w
     A cco u n t
                                                  D a te d a te
lo n g a c c o u n t N o
                                                  d o u b le a m o u n t
d o u b le b a la n c e
                                                  in t t y p e
                                                  lo n g a c c o u n t N o




                           A c c o u n t in g P e r io d

                           D a te s ta r t
                           D a te e n d




                                                                             5
Creating Views with
                           Triggers
        date          amount            type       accountNo     AccountingPeriod
 12-Jan-07                      100 CREDIT     1                       start               end
 2-Feb-07                       200 DEBIT      1                     01-Jan-07          31-Mar-07
 18-May-07                       50 CREDIT     1
 9-Mar-07                        75 CREDIT     1                 Account
                                                                    accountNo             balance
                                                                 1                  0
increase balance for AccountPeriod Credits                 decrease balance for AccountPeriod Debits

select * from Account acc,                                     select * from Account acc,
     Cashflow cf, AccountPeriod ap                                  Cashflow cf, AccountPeriod ap
where acc.accountNo == cf.accountNo and                        where acc.accountNo == cf.accountNo and
      cf.type == CREDIT                                              cf.type == DEBIT
      cf.date >= ap.start and                                        cf.date >= ap.start and
      cf.date <= ap.end                                              cf.date <= ap.end

  trigger : acc.balance += cf.amount                            trigger : acc.balance -= cf.amount

 CashFlow                                                      CashFlow
        date           amount          type
                                                                      date          amount            type
 12-Jan-07                      100 CREDIT
                                                               2-Feb-07                       200 DEBIT
 9-Mar-07                        75 CREDIT


 Account
    accountNo              balance
 1                   -25
                                                                                                             6
What is a Rule

                                     salience     <int>
Quotes on Rule names are
                                     agenda-group <string>
optional if the rule name has
                                     no-loop      <boolean>
no spaces.
                                     auto-focus  <boolean>
                                     duration     <long>
                                     ....
   • rule “<name>”
         <attribute> <value>
         when
             <LHS>
         then
             <RHS>         RHS can be any valid java.
                           Or MVEL. Other languages
     end                   could be added.




                                                              7
Imperative vs Declarative
             Methods that must                  specific passing of
             be called directly                 instances


        •         public void helloMark(Person person) {
Rules can never     if ( person.getName().equals( “mark” ) {
be called directly        System.out.println( “Hello Mark” );
                      }               Specific instances
                  }                   cannot be passed.

        •   rule “Hello Mark”                     LHS
                when
                    Person( name == “mark” )
                then
                    System.out.println( “Hello Mark” );
            end
                                     RHS




                                                                      8
What is a Pattern
                            P a tte rn

   O b je c t T y p e               F ie ld C o n s t r a in t

                        F ie ld N a m e                      R e s t r ic t io n


                                                      E v a lu a t o r      V a lu e



S h o w e r( te m p e r a tu re = = “ h o t” )

                                                                                       9
Bringing it Together
select * from Account acc,
       Cashflow cf, AccountPeriod ap
where acc.accountNo == cf.accountNo and
        cf.type == CREDIT
        cf.date >= ap.start and
        cf.date <= ap.end            Pattern
  trigger : acc.balance += cf.amount
 Pattern Binding

                                               field Binding

rule “increase balance for AccountPeriod Credits”
       when                                     Variable Restriction
            ap : AccountPeriod()
            acc : Account( $accountNo : accountNo )
            CashFlow( type == CREDIT,
                              accountNo == $accountNo,
Literal Restriction           date >= ap.start && <= ap.end,
                              $ammount : ammount )
       then
            acc.balance += $amount;             Multri Restriction - Variable
end                                             Restriction


                                                  field Binding
        Consequence (RHS)
                                                                                10
Rules as a “view”
         date       amount           type       accountNo   AccountingPeriod
  12-Jan-07                  100 CREDIT     1                     start               end
  2-Feb-07                   200 DEBIT      1                   01-Jan-07          31-Mar-07
  18-May-07                   50 CREDIT     1
  9-Mar-07                    75 CREDIT     1               Account
                                                               accountNo             balance
                                                            1                  0
rule “increase balance for AccountPeriod    rule “decrease balance for AccountPeriod
       Credits”                                    Debits”
  when                                        when
    ap : AccountPeriod()                        ap : AccountPeriod()
    acc : Account( $accountNo : accountNo )     acc : Account( $accountNo : accountNo )

    CashFlow( type == CREDIT,                     CashFlow( type == DEBIT,
                accountNo == $accountNo,                      accountNo == $accountNo,
                date >= ap.start && <= ap.end,                date >= ap.start && <= ap.end,
                $ammount : ammount )                          $ammount : ammount )
  then                                          then
    acc.balance += $amount;                       acc.balance -= $amount;
end CashFlow                                  end   CashFlow
           date         amount        type                 date         amount         type
    12-Jan-07                  100 CREDIT           2-Feb-07                   200 DEBIT
    9-Mar-07                    75 CREDIT

    Account
       accountNo           balance
    1                -25
                                                                                               11
Patterns in more details

CashFlow( type == “credit” )

$ap : AccountPeriod()
CashFlow( date >= $ap.start )


$ap : AccountPeriod()
CashFlow( date >= $ap.start && <= $ap.end )


$ap : AccountPeriod()
CashFlow( type == “credit”,
           date >= $ap.start && <= $ap.end )


                                               12
More Pattern Examples

Person( $age : age )
Person( age == ( $age + 1 ) )



Person( $age : age )
Person( eval( age == $age + 1 ) )



Person( $age1 : age )
Person( $age2 : age )
eval( $age2 == $age1 + 1 )




                                    13
More Pattern
           Examples
Person(age > 30 && < 40 || hair == “black”)

Person(age > 30 && < 40 || hair in (“black”, “brown”) )


Person( (age > 30 && < 40 && hair == “black”)
         ||
        (age > 50 && hair == “grey”) )


Person(pets contain $rover )


Person(pets[’rover’].type == “dog”)


Person(pets[0].type == “dog”)
                                                          14
What is a Production Rule
                  System
Codification of
the business                        Repository of
knowledge                           inserted Java
                                    instances

                        Inference
                         Engine

     Production         Pattern              Working
      Memory            Matcher              Memory


        (rules)                                (facts)
                        Agenda
                                         insert
  Rules can change                      update
      on the fly                        retract


                                                         15
Production Rule System
                               Approximated by SQL and
                               Views
T a b le s   A cco unt              A c c o u n t in g P e r io d              C a s h f lo w




                                                                                           O b je c t T y p e s   A cco unt              A c c o u n t in g P e r io d              C a s h f lo w
V ie w s                 v ie w 1                                   v ie w 2




V ie w
                                      m a in v ie w                                        R u le s                           r u le 1                                   r u le 2




                                                                                           agenda
                                                                                                                                              agenda




                                                                                                                                                                                                     16
Conflict Resolution with
             Salience
                      Salience

rule “Print blance for AccountPeriod”
      salience -50
   when
      ap : AccountPeriod()
      acc : Account( )
   then
      System.out.println( acc.accountNo + “ : “ acc.balance );
end




Agenda
     1            increase balance
     2            decrease balance               arbitrary
     3            increase balance
     4            print balance




                                                                 17
RuleFlow
           rule “increase balance for AccountPeriod Credits”
                ruleflow-group “calculation”
              when
                 ap : AccountPeriod()
                 acc : Account( $accountNo : accountNo )
                 CashFlow( type == CREDIT,
                            accountNo == $accountNo,
                            date >= ap.start && <= ap.end,
                            $ammount : ammount )
              then
                 acc.balance += $amount;
           end

                             ruleflow-group

           rule “Print blance for AccountPeriod”
                ruleflow-group “report”
              when
                 ap : AccountPeriod()
                 acc : Account( )
              then
                 System.out.println( acc.accountNo + “ : “ acc.balance );
           end




                                                                            18
Two Phase System
                                       Determine
                                     possible rules to
                                           fire
                                                               Agenda Evaluation




Working Memory Action




                                                              Rule
      insert                modify
                                                             Found             Select
                                                 Fire Rule
                                                                             Rule to Fire


                  retract




                                                                               No Rule
                                                                                Found




                                                                                   exit



                                                                                            19
Conditional
 Elements
From CE for Expressions

not Bus( color = “red” )


exists Bus( color = “red” )


forall ( $bus : Bus( color == “red” ) )


forall ( $bus : Bus( floors == 2 )
               Bus( this == $bus, color == “red” ) )




                                                       21
From CE
for Expressions
From CE for Expressions

Using 'from' to reason over the nested list


rule “Find all the pets for a given owner”
when
   $owner : Person( name == “mark” )
             Pet( name == “rover” ) from $owner.pets




                                                       23
From CE for Expressions

'from' can work on any expression, not just a nested
field on a bound variable.


rule “Find People for given zip code”
when
   $zipCode : ZipCode()
   Person( ) from $hbn.getNamedQuery(“Find People”)
                        .setParameters( [ “zipCode” : $zipCode ] )
                        .list()

      Hibernate session




                                                                     24
Collect CE
Collect CE
rule "accumulate"
when
   $list : List( intValue > 100 )
             from collect( Bus( color == "red" ) )
then
   print "red buses “ + $list;
end




                                                     26
Accumulate CE
Accumulate CE
rule "accumulate"
when
   $sum : Number( intValue > 100 )
           from accumulate( Bus( color == "red", $t :
takings )
                            init( sum = 0 ),
                            action( sum += $t ),
                            result( sum ) )
then
   print "sum is “ + $sum;
end




                                                        28
Accumulate CE
rule "accumulate"
when
   $sum : Number( intValue > 100 )
           from accumulate( Bus( color == "red", $t :
takings )                                sum( $t ) )
then
   print "sum is “ + $sum;
end




                                                        29
Accumulate CE
Patterns and CE's can be chained with 'from'

rule "collect"
when
   $zipCode : ZipCode()
   $sum : Number( intValue > 100 )
          from accumulate( Bus( color == "red", $t : takings )
                             from $hbn.getNamedQuery(“Find
Buses”)

.setParameters( [ “zipCode” :
                          $zipCode ] )
                                         .list(),
                           sum( $t ) )
then                                                         30
Timers
Calendars
Timers
 rule “name”
    timer 1m30s
 when
    $l : Light( status == “on” )
 then
   SendEmail( “turn the light off” )



rule “name”
   timer (int: 0 1m30)
when
   $l : Light( status == “on” )
then
  SendEmail( “turn the light off” )


                                       32
Timers
Field Name Mandatory?   Allowed Values     Allowed Special Characters
Seconds      YES        0-59               ,-*/
Minutes      YES        0-59               ,-*/
Hours        YES        0-23               ,-*/
Day of month YES        1-31               ,-*?/LW
Month        YES        1-12 or JAN-DEC     ,-*/
Day of week YES         1-7 or SUN-SAT          ,-*?/L#
Year         NO         empty, 1970-2099    ,-*/



rule “name”
  timer ( cron: 0 0/15 * * * * )
when
   $l : Light( status == “on” )
then
  sendEmail( “turn the light off” )




                                                                        33
Calendars
rule "weekdays are high priority"
  calendars "weekday"
  timer (int:0 1h)
when
   Alarm()
then
   send( "priority high - we have an alarm” );
end

rule "weekend are low priority"
  calendars "weekend"
  timer (int:0 4h)
when
   Alarm()
then
   send( "priority low - we have an alarm” );
end

                                                 34
Truth Maintenance
Inference
TMS and Inference
rule "Issue Child Bus Pass"             Couples the logic
when
 $p : Person( age < 16 )
then
 insert(new ChildBusPass( $p ) );
end
rule "Issue Adult Bus Pass"
                                    What happens when the Child
when                                      stops being 16?
 $p : Person( age >= 16 )
then
 insert(new AdultBusPass( $p ) );
end


                                                                  36
TMS and Inference
   Bad
    ●   Monolithic
    ●   Leaky
    ●   Brittle integrity - manual maintenance




                                                 37
TMS and Inference
 A rule “logically” inserts an object
 When the rule is no longer true, the object is
  retracted.
when                                  de-couples the logic

 $p : Person( age < 16 )
then
  logicalInsert( new IsChild( $p ) )
end
                                 Maintains the truth by
when                             automatically retracting
 $p : Person( age >= 16 )
then
  logicalInsert( new IsAdult( $p ) )
end

                                                             38
TMS and Inference
rule "Issue Child Bus Pass"
when
 $p : Person( )
       IsChild( person =$p )
then
 logicalInsert(new ChildBusPass( $p ) );
end
rule "Issue Adult Bus Pass"   The truth maintenance cascades
when
 $p : Person( age >= 16 )
       IsAdult( person =$p )
then
 logicalInsert(new AdultBusPass( $p ) );
end
                                                               39
TMS and Inference
rule "Issue Child Bus Pass"
when
 $p : Person( )
       not( ChildBusPass( person == $p ) )
then
   requestChildBusPass( $p );
                                  The truth maintenance cascades
End




                                                                   40
TMS and Inference
   Good
    ●   De-couple knowledge responsibilities
    ●   Encapsulate knowledge
    ●   Provide semantic abstractions for those encapsulation
    ●   Integrity robustness – truth maintenance




                                                                41
Tooling
Guided Editor




                43
Interactive Debugging




                        44
Decision Tables




                  45
DSLs




       46
DSLs




       47
Rule Flow




            48
Drools Fusion
Scalability

Rule engines do not scale for CEP. They have a single point of insertion
and are single threaded, CEP has concurrent streams of events.



       session.insert( event ) ;   $c : Custumer( type == “VIP” )
                                   BuyOrderEvent( customer == $c )

          Single Point of
              entry
                                         Patterns, evaluate
                                       facts sequentially in a
                                           single thread.




                                                                       50
Scalability
                                        So lets allow multiple
                                       named entry points for
                                           those streams


EntryPoint entryPoint = session.getEntryPoint( “Home Broker Stream” );
entryPoint.insert( event ) ;


   So now we can insert                    When not specified uses
     different streams                     the “default” entry-point
        concurrently

   $c : Custumer( type == “VIP )
   BuyOrderEvent( customer == $c ) from entry-point “Home Broker Stream”




                                        Patterns can now optional
                                        specify their entry-point.


                                                                           51
Automatic Life-Cycle
                Management
All Fact life-cycles must be managed by the user, so
retractions are manual.

 declare StockTick              Just use the declare statement to
  @role( event )                declare a type as an event and it
 end                           will be retracted when it is no longer
                                              needed


declare StockTick
 @role( event )
 @timestamp( timestampAttr )

 companySymbol : String
 stockPrice : double                 The declare statement can also
 timestampAttr : long                 specify an internal model, that
end                                external objects/xml/csv map on to.
                                     We support Smooks and JAXB



                                                                         52
Operators
Rule engines do not have rich enough set of temporal comparison
operators                                     BackAckEvent must occur
                                                                between 1s and 10s 'after'
  $c : Custumer( type == “VIP )                                      BuyOrderEvent
  $oe : BuyOrderEvent( customer == $c )
             from entry-point “Home Broker Stream”
        BuyAckEvent( relatedEvent == $oe.id, this after[1s, 10s] $oe )
             from entry-point “Stock Trader Stream”



 The Full set of Operators are supported
          ●   coincides         ●   overlaps             ●   starts
          ●   before            ●   overlappedby         ●   startedby
          ●   after             ●   during               ●   finishes
          ●   meets             ●   includes             ●   finishedby
          ●   metby



                                                                                             53
Operators




            54
Operators

$c : Custumer( type == “VIP )
$oe : BuyOrderEvent( customer == $c )
            from entry-point “Home Broker Stream”
      not BuyAckEvent( relatedEvent == $oe.id, this after[1s, 10s] $oe )
            from entry-point “Stock Trader Stream”



             Existing Drools 'not'
          Conditional Elements can
           be used to detect non-
            occurrence of events




                                                                           55
Sliding time windows
Rule engines react to events happening now, there is no
temporal understanding of changes over time.

 StockTicker( symbol == “RHAT” ) over window:time( 5s )                     5s
 StockTicker( symbol == “RHAT” ) over window:length( 1000 )
                                                                         1000 tickers




  That isn't much without the ability to deal with aggregations, rules
  engines suck.




                                                                                        56
Aggregations
Rule Engines do not deal with aggregations
                                                                    Over 5 seconds

$n : Number( intValue > 100 )
       from accumulate( $s : StockTicker( symbol == “RHAT” ) over window:time( 5s ),
                         average( $s.price ) )


                                Aggregate ticker price
 The pattern 'Number'            for RHAT over last 5
  reasons 'from' the                   seconds
  accumulate result




$n : accumulate( $s : StockTicker( symbol == “RHAT” ) over window:time( 5s ),
                 average( $s.price ) > 100 )


  We can use some sugar to reduce
             verbosity
                                                                                       57
Drools Flow
Drools Flow

 A workflow engine combining processes and
 Integration       rules
    ●   From loose coupling (decision services)
    ●   To advance integration (process rules)
   Unification
    ●   Rules and processes are different types of business
        knowledge assets
    ●   Infrastructure
         ●   Timers/Schedulers
         ●   Testing
         ●   Communication/Services
    ●   Tooling
         ●   IDE
         ●   repository, management
         ●   Auditing
         ●                                                    59
Truth Maintenance
Inference
Rules and
                        processes
generic




                              ?
                                           Decision
                                           Services
SCOPE




                Process
specific




                 Rules




           tightly coupled    COUPLING   loosely coupled
                                                           61
Business Logic Lifecycle




                           62
Example




          63
RuleFlowGroup
Workflow can control my rules?




                                 64
RuleFlowGroup



    Rule Flow Group




                      65
RuleFlowGroup




                66
Constraints




              Java code constraint




                                     67
Constraints
Rules can control my workflow?


                         LHS “when”
                        Rule Constraint




                                          68
Example


   Business decisions are externalized using a decision
    service




                      rule
               rule Decision1
                 when Decision1
                 rule Decision1
                   // conditions
                   when when
                 then // conditions
                           //
                   // actions
                   then
               end    conditions
                      // actions
                 end     then
                         //
                     actions
                     end                                   69
Example


   What if there is a lot of business logic like this?




                    rule Decision1       rule Decision1
           rule       when Decision1
                      rule                 when Decision1
                                           rule                  rule             rule
    rule Decision1      // conditions        // conditionsrule Decision1    rule Decision1
                        when Decision1
      when Decision1 rule  rule              when Decision1
                                                rule
      rule Decision1 then // conditions rule rule conditions Decision1 when Decision1
                    rule Decision1            Decision1
                                           then //          when Decision1
                                                            rule              rule Decision1
        // conditionswhen when
                      rule Decision1
                                                when          // conditions     // conditions
        when when       then // conditionswhen Decision1 when when
                            Decision1
                        // actions         rule actions
                                             // Decision1
                                             then // conditions                 when when
      then // conditions// conditions end // conditionsthen // conditionsthen // conditions
                // end when when
        // actions
        then
                           // actions
                           then              when when
                                                // actions
                                                then
                      then // conditions then // conditions// actions
                                                              then
                                                                      //                //
                                                                                // actions
                                                                                then
    end               end
           conditions// actions  //
                              // actions   end        //
                                                   // actions    conditions       conditions
           // actions   then                 // actions end
                                             then                // actions end   // actions
      end     then end end actions end end actions end
                           conditions
                           //                   conditions
                                                //                  then      end    then
                // end         then        end      then              //                //
          actions             //                  //         actions           actions
          end             actions             actions        end               end
                          end                 end

                                                                                                70
Flow of Control




       Process
       Engine




       Rules
       Engine



                  71
Inversion of Control




              Process
              Engine

     Agenda




              Rules
              Engine




                        72
Self monitoring and
              adaptive
declare ProcessStartedEvent
  @role( event )
end


rule "Number of process instances above threshold" when
  Number( nbProcesses : intValue > 1000 )
       from accumulate(
            e: ProcessStartedEvent(
  processInstance.processId ==
"com.sample.order.OrderProcess" )
                   over window:size(1h),
             count(e) )
then
  System.err.println( "WARNING: Nb of order processes in
the last                      hour > 1000: " +
nbProcesses );
                                                           73
Domain Specific Processes




                            74
Domain Specific Processes




                            75
Integrated debug and audit




                             76
Unified API
Definitions
    Runtime
          Language
Definitions
jBPM
File file = new File (“.....”); // file to XML process definition

ProcessDefinition processDefinition =
   ProcessDefinition.parseXmlString( IoUtils.FileToString( file ) );

ProcessInstance processInstance =
   new ProcessInstance(processDefinition);
Jess
Rete engine = new Rete();

FileReader file = new FileReader("myfile.clp");

Jesp parser = new Jesp(file, engine);

parser.parse(false);


Esper

EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();

EPStatement countStmt = admin.createEPL( "...." );

countStmt.start();
                                                                               78
Definitions
Drools Flow

KnowledegBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBulider();

kbuilder.addResource(
   ResourceFactory.newClassPathResource( “myflow.drf”,
   ResourceType.DRF );

If ( kbuilder.hasErrors() ) {
    log.error( kbuilder.hasErrors().toString() );
}

KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbase.getKnowledgePackages() );




                                                                             79
Definitions

Drools Expert

KnowledegBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBulider();

kbuilder.addResource(
   ResourceFactory.newClassPathResource( “myrules.drl”,
   ResourceType.DRL );

If ( kbuilder.hasErrors() ) {
    log.error( kbuilder.hasErrors().toString() );
}

KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbase.getKnowledgePackages() );




                                                                             80
Drools Integration Deployment Descriptors

<change-set>
   <add>
     <resource source='classpath:myapp/data/myflow.drf' type='DRF' />
     <resource source='http:myapp/data/myrules.drl' type='DRL' />
     <resource source='classpath:data/IntegrationExampleTest.xls'
                 type="DTABLE">
          <decisiontable-conf input-type="XLS"
                                worksheet-name="Tables_2" />
     </resource>
   <add>
</change-set>


KnowledegBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBulider();
kbuilder.addResource(
   ResourceFactory.newFileResource( “changeset.xml”,
                                     ResourceType.ChangeSet );




                                                                             81
Unified Event Model
Mixins
Interface Markers
Stateful Knowledge
Session




                     85
Knowledge Runtime




                    86
Coming in 5.1
   BPMN2 (80% of Workflow)
   Integration
    ●   OSGi ready
    ●   Spring
    ●   Camel
   Seamless Remoting
   Simulation/Testing
   New Rete Algorithm “true modify”




                                       87
Spring + camel




from("direct:test-with-session").
to("drools:sm/ksession1?dataFormat=drools-xstream");


                                                       88
Questions?
                        • Dave Bowman: All right, HAL; I'll
                          go in through the emergency
                          airlock.
                        • HAL: Without your space helmet,
                          Dave, you're going to find that
                          rather difficult.
                        • Dave Bowman: HAL, I won't argue
                          with you anymore! Open the
                          doors!
                        • HAL: Dave, this conversation can
                          serve no purpose anymore.
                          Goodbye.
Joshua: Greetings, Professor Falken.
Stephen Falken: Hello, Joshua.
Joshua: A strange game. The only
winning move is not to play. How
about a nice game of chess?


                                                              89

More Related Content

What's hot

Unityのオンラインゲームをhtmlに移植してわかったこと
Unityのオンラインゲームをhtmlに移植してわかったことUnityのオンラインゲームをhtmlに移植してわかったこと
Unityのオンラインゲームをhtmlに移植してわかったこと
Kouji Hosoda
 
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
devCAT Studio, NEXON
 
MicrometerとPrometheusによる LINEファミリーアプリのモニタリング
MicrometerとPrometheusによる LINEファミリーアプリのモニタリングMicrometerとPrometheusによる LINEファミリーアプリのモニタリング
MicrometerとPrometheusによる LINEファミリーアプリのモニタリング
LINE Corporation
 
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
Young Keun Choe
 

What's hot (20)

REST: From GET to HATEOAS
REST: From GET to HATEOASREST: From GET to HATEOAS
REST: From GET to HATEOAS
 
Drools
DroolsDrools
Drools
 
Drools Expert and Fusion Intro : London 2012
Drools Expert and Fusion Intro  : London 2012Drools Expert and Fusion Intro  : London 2012
Drools Expert and Fusion Intro : London 2012
 
2022 01-okky-코드리뷰
2022 01-okky-코드리뷰2022 01-okky-코드리뷰
2022 01-okky-코드리뷰
 
チケット駆動開発現場の最前線.pdf
チケット駆動開発現場の最前線.pdfチケット駆動開発現場の最前線.pdf
チケット駆動開発現場の最前線.pdf
 
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
 
Redmineカスタムフィールド表示改善
Redmineカスタムフィールド表示改善Redmineカスタムフィールド表示改善
Redmineカスタムフィールド表示改善
 
Unityのオンラインゲームをhtmlに移植してわかったこと
Unityのオンラインゲームをhtmlに移植してわかったことUnityのオンラインゲームをhtmlに移植してわかったこと
Unityのオンラインゲームをhtmlに移植してわかったこと
 
게임 시스템 디자인 시작하기
게임 시스템 디자인 시작하기게임 시스템 디자인 시작하기
게임 시스템 디자인 시작하기
 
[게임법학회] 온라인게임의 개발과 사례
[게임법학회] 온라인게임의 개발과 사례[게임법학회] 온라인게임의 개발과 사례
[게임법학회] 온라인게임의 개발과 사례
 
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
 
게임 기획 튜토리얼 (2015 개정판)
게임 기획 튜토리얼 (2015 개정판)게임 기획 튜토리얼 (2015 개정판)
게임 기획 튜토리얼 (2015 개정판)
 
ある工場のRedmine画面カスタム【View customize plugin 活用例】
ある工場のRedmine画面カスタム【View customize plugin 活用例】ある工場のRedmine画面カスタム【View customize plugin 活用例】
ある工場のRedmine画面カスタム【View customize plugin 活用例】
 
MicrometerとPrometheusによる LINEファミリーアプリのモニタリング
MicrometerとPrometheusによる LINEファミリーアプリのモニタリングMicrometerとPrometheusによる LINEファミリーアプリのモニタリング
MicrometerとPrometheusによる LINEファミリーアプリのモニタリング
 
이원, 온라인 게임 프로젝트 개발 결산 - 마비노기 개발 완수 보고서, NDC2011
이원, 온라인 게임 프로젝트 개발 결산 - 마비노기 개발 완수 보고서, NDC2011이원, 온라인 게임 프로젝트 개발 결산 - 마비노기 개발 완수 보고서, NDC2011
이원, 온라인 게임 프로젝트 개발 결산 - 마비노기 개발 완수 보고서, NDC2011
 
JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”JSR 352 “Batch Applications for the Java Platform”
JSR 352 “Batch Applications for the Java Platform”
 
SpringBoot and Spring Cloud Service for MSA
SpringBoot and Spring Cloud Service for MSASpringBoot and Spring Cloud Service for MSA
SpringBoot and Spring Cloud Service for MSA
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
 

Similar to Lille2010markp

Hybrid rule engines (rulesfest 2010)
Hybrid rule engines (rulesfest 2010)Hybrid rule engines (rulesfest 2010)
Hybrid rule engines (rulesfest 2010)
Geoffrey De Smet
 
Aslak Hellesoy Executable User Stories R Spec Bdd
Aslak Hellesoy Executable User Stories R Spec BddAslak Hellesoy Executable User Stories R Spec Bdd
Aslak Hellesoy Executable User Stories R Spec Bdd
deimos
 
Lecture5 mba
Lecture5 mbaLecture5 mba
Lecture5 mba
gldazo
 
Recs Presentation
Recs PresentationRecs Presentation
Recs Presentation
Sylverflash
 

Similar to Lille2010markp (20)

JUDCon India 2012 Drools Expert
JUDCon  India 2012 Drools ExpertJUDCon  India 2012 Drools Expert
JUDCon India 2012 Drools Expert
 
Improving application design with a rich domain model (springone 2007)
Improving application design with a rich domain model (springone 2007)Improving application design with a rich domain model (springone 2007)
Improving application design with a rich domain model (springone 2007)
 
What's new in Drools 6 - London JBUG 2013
What's new in Drools 6 - London JBUG 2013What's new in Drools 6 - London JBUG 2013
What's new in Drools 6 - London JBUG 2013
 
Hybrid rule engines (rulesfest 2010)
Hybrid rule engines (rulesfest 2010)Hybrid rule engines (rulesfest 2010)
Hybrid rule engines (rulesfest 2010)
 
Accounting Mechanics Processing Accounting Information
Accounting Mechanics Processing Accounting InformationAccounting Mechanics Processing Accounting Information
Accounting Mechanics Processing Accounting Information
 
Proses Pencatatan Transaksi
Proses Pencatatan TransaksiProses Pencatatan Transaksi
Proses Pencatatan Transaksi
 
Chapter 4
Chapter 4Chapter 4
Chapter 4
 
Aslak Hellesoy Executable User Stories R Spec Bdd
Aslak Hellesoy Executable User Stories R Spec BddAslak Hellesoy Executable User Stories R Spec Bdd
Aslak Hellesoy Executable User Stories R Spec Bdd
 
Drools and BRMS 6.0 (Dublin Aug 2013)
Drools and BRMS 6.0 (Dublin Aug 2013)Drools and BRMS 6.0 (Dublin Aug 2013)
Drools and BRMS 6.0 (Dublin Aug 2013)
 
The Actuary and FAS 163
The Actuary and FAS 163The Actuary and FAS 163
The Actuary and FAS 163
 
SQL Server 2008 Portfolio
SQL Server 2008 PortfolioSQL Server 2008 Portfolio
SQL Server 2008 Portfolio
 
Dr Strangler and Mr Hype - Strangler pattern w praktyce
Dr Strangler and Mr Hype - Strangler pattern w praktyceDr Strangler and Mr Hype - Strangler pattern w praktyce
Dr Strangler and Mr Hype - Strangler pattern w praktyce
 
Actor Model
Actor ModelActor Model
Actor Model
 
Accounting_Accruals_and_Deferrals_ppt.pdf
Accounting_Accruals_and_Deferrals_ppt.pdfAccounting_Accruals_and_Deferrals_ppt.pdf
Accounting_Accruals_and_Deferrals_ppt.pdf
 
Drools 6.0 (CamelOne 2013)
Drools 6.0 (CamelOne 2013)Drools 6.0 (CamelOne 2013)
Drools 6.0 (CamelOne 2013)
 
Lecture5 mba
Lecture5 mbaLecture5 mba
Lecture5 mba
 
Serverless Functions and Vue.js
Serverless Functions and Vue.jsServerless Functions and Vue.js
Serverless Functions and Vue.js
 
Tsi Green Flag Notebook Web Presentation Version 29 Apr09
Tsi Green Flag Notebook Web Presentation Version 29 Apr09Tsi Green Flag Notebook Web Presentation Version 29 Apr09
Tsi Green Flag Notebook Web Presentation Version 29 Apr09
 
Financial ratio
Financial ratioFinancial ratio
Financial ratio
 
Recs Presentation
Recs PresentationRecs Presentation
Recs Presentation
 

More from Ch'ti JUG (10)

Java 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambdaJava 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambda
 
Spring 3.1
Spring 3.1Spring 3.1
Spring 3.1
 
Bonita Open Solution
Bonita Open SolutionBonita Open Solution
Bonita Open Solution
 
Adobe flash platform java
Adobe flash platform javaAdobe flash platform java
Adobe flash platform java
 
MC3SI Chti Jug Soiree Agilite
MC3SI Chti Jug Soiree AgiliteMC3SI Chti Jug Soiree Agilite
MC3SI Chti Jug Soiree Agilite
 
Chti Jug Octo 16032010 Réduisons le ticket d’entrée de nos projets
Chti Jug Octo 16032010 Réduisons le ticket d’entrée de nos projetsChti Jug Octo 16032010 Réduisons le ticket d’entrée de nos projets
Chti Jug Octo 16032010 Réduisons le ticket d’entrée de nos projets
 
GlassFish ESB Ch'ti JUG
GlassFish ESB Ch'ti JUGGlassFish ESB Ch'ti JUG
GlassFish ESB Ch'ti JUG
 
Drools Planner Chtijug 2010
Drools Planner Chtijug 2010Drools Planner Chtijug 2010
Drools Planner Chtijug 2010
 
HTML5 ADEO
HTML5 ADEOHTML5 ADEO
HTML5 ADEO
 
Terracotta Ch'ti Jug
Terracotta Ch'ti JugTerracotta Ch'ti Jug
Terracotta Ch'ti Jug
 

Recently uploaded

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Recently uploaded (20)

Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 

Lille2010markp

  • 1. Mark Proctor Project Lead ● The SkyNet funding bill is passed. ● The system goes online on August 4th, 1997. ● Human decisions are removed from strategic defense. ● SkyNet begins to learn at a geometric rate. ● It becomes self-aware at 2:14am Eastern time, August 29th ● In a panic, they try to pull the plug. ● And, Skynet fights back
  • 2. Introduction Drools Drools Drools Drools Expert Flow Fusion Guvnor Business Logic integration Platform 2
  • 5. Classes C a s h f lo w A cco u n t D a te d a te lo n g a c c o u n t N o d o u b le a m o u n t d o u b le b a la n c e in t t y p e lo n g a c c o u n t N o A c c o u n t in g P e r io d D a te s ta r t D a te e n d 5
  • 6. Creating Views with Triggers date amount type accountNo AccountingPeriod 12-Jan-07 100 CREDIT 1 start end 2-Feb-07 200 DEBIT 1 01-Jan-07 31-Mar-07 18-May-07 50 CREDIT 1 9-Mar-07 75 CREDIT 1 Account accountNo balance 1 0 increase balance for AccountPeriod Credits decrease balance for AccountPeriod Debits select * from Account acc, select * from Account acc, Cashflow cf, AccountPeriod ap Cashflow cf, AccountPeriod ap where acc.accountNo == cf.accountNo and where acc.accountNo == cf.accountNo and cf.type == CREDIT cf.type == DEBIT cf.date >= ap.start and cf.date >= ap.start and cf.date <= ap.end cf.date <= ap.end trigger : acc.balance += cf.amount trigger : acc.balance -= cf.amount CashFlow CashFlow date amount type date amount type 12-Jan-07 100 CREDIT 2-Feb-07 200 DEBIT 9-Mar-07 75 CREDIT Account accountNo balance 1 -25 6
  • 7. What is a Rule salience <int> Quotes on Rule names are agenda-group <string> optional if the rule name has no-loop <boolean> no spaces. auto-focus <boolean> duration <long> .... • rule “<name>”     <attribute> <value>     when         <LHS>     then         <RHS> RHS can be any valid java. Or MVEL. Other languages end could be added. 7
  • 8. Imperative vs Declarative Methods that must specific passing of be called directly instances • public void helloMark(Person person) { Rules can never     if ( person.getName().equals( “mark” ) { be called directly        System.out.println( “Hello Mark” );     } Specific instances } cannot be passed. • rule “Hello Mark” LHS     when         Person( name == “mark” )     then         System.out.println( “Hello Mark” ); end RHS 8
  • 9. What is a Pattern P a tte rn O b je c t T y p e F ie ld C o n s t r a in t F ie ld N a m e R e s t r ic t io n E v a lu a t o r V a lu e S h o w e r( te m p e r a tu re = = “ h o t” ) 9
  • 10. Bringing it Together select * from Account acc, Cashflow cf, AccountPeriod ap where acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end Pattern trigger : acc.balance += cf.amount Pattern Binding field Binding rule “increase balance for AccountPeriod Credits” when Variable Restriction ap : AccountPeriod() acc : Account( $accountNo : accountNo ) CashFlow( type == CREDIT, accountNo == $accountNo, Literal Restriction date >= ap.start && <= ap.end, $ammount : ammount ) then acc.balance += $amount; Multri Restriction - Variable end Restriction field Binding Consequence (RHS) 10
  • 11. Rules as a “view” date amount type accountNo AccountingPeriod 12-Jan-07 100 CREDIT 1 start end 2-Feb-07 200 DEBIT 1 01-Jan-07 31-Mar-07 18-May-07 50 CREDIT 1 9-Mar-07 75 CREDIT 1 Account accountNo balance 1 0 rule “increase balance for AccountPeriod rule “decrease balance for AccountPeriod Credits” Debits” when when ap : AccountPeriod() ap : AccountPeriod() acc : Account( $accountNo : accountNo ) acc : Account( $accountNo : accountNo ) CashFlow( type == CREDIT, CashFlow( type == DEBIT, accountNo == $accountNo, accountNo == $accountNo, date >= ap.start && <= ap.end, date >= ap.start && <= ap.end, $ammount : ammount ) $ammount : ammount ) then then acc.balance += $amount; acc.balance -= $amount; end CashFlow end CashFlow date amount type date amount type 12-Jan-07 100 CREDIT 2-Feb-07 200 DEBIT 9-Mar-07 75 CREDIT Account accountNo balance 1 -25 11
  • 12. Patterns in more details CashFlow( type == “credit” ) $ap : AccountPeriod() CashFlow( date >= $ap.start ) $ap : AccountPeriod() CashFlow( date >= $ap.start && <= $ap.end ) $ap : AccountPeriod() CashFlow( type == “credit”, date >= $ap.start && <= $ap.end ) 12
  • 13. More Pattern Examples Person( $age : age ) Person( age == ( $age + 1 ) ) Person( $age : age ) Person( eval( age == $age + 1 ) ) Person( $age1 : age ) Person( $age2 : age ) eval( $age2 == $age1 + 1 ) 13
  • 14. More Pattern Examples Person(age > 30 && < 40 || hair == “black”) Person(age > 30 && < 40 || hair in (“black”, “brown”) ) Person( (age > 30 && < 40 && hair == “black”) || (age > 50 && hair == “grey”) ) Person(pets contain $rover ) Person(pets[’rover’].type == “dog”) Person(pets[0].type == “dog”) 14
  • 15. What is a Production Rule System Codification of the business Repository of knowledge inserted Java instances Inference Engine Production Pattern Working Memory Matcher Memory (rules) (facts) Agenda insert Rules can change update on the fly retract 15
  • 16. Production Rule System Approximated by SQL and Views T a b le s A cco unt A c c o u n t in g P e r io d C a s h f lo w O b je c t T y p e s A cco unt A c c o u n t in g P e r io d C a s h f lo w V ie w s v ie w 1 v ie w 2 V ie w m a in v ie w R u le s r u le 1 r u le 2 agenda agenda 16
  • 17. Conflict Resolution with Salience Salience rule “Print blance for AccountPeriod” salience -50 when ap : AccountPeriod() acc : Account( ) then System.out.println( acc.accountNo + “ : “ acc.balance ); end Agenda 1 increase balance 2 decrease balance arbitrary 3 increase balance 4 print balance 17
  • 18. RuleFlow rule “increase balance for AccountPeriod Credits” ruleflow-group “calculation” when ap : AccountPeriod() acc : Account( $accountNo : accountNo ) CashFlow( type == CREDIT, accountNo == $accountNo, date >= ap.start && <= ap.end, $ammount : ammount ) then acc.balance += $amount; end ruleflow-group rule “Print blance for AccountPeriod” ruleflow-group “report” when ap : AccountPeriod() acc : Account( ) then System.out.println( acc.accountNo + “ : “ acc.balance ); end 18
  • 19. Two Phase System Determine possible rules to fire Agenda Evaluation Working Memory Action Rule insert modify Found Select Fire Rule Rule to Fire retract No Rule Found exit 19
  • 21. From CE for Expressions not Bus( color = “red” ) exists Bus( color = “red” ) forall ( $bus : Bus( color == “red” ) ) forall ( $bus : Bus( floors == 2 ) Bus( this == $bus, color == “red” ) ) 21
  • 23. From CE for Expressions Using 'from' to reason over the nested list rule “Find all the pets for a given owner” when $owner : Person( name == “mark” ) Pet( name == “rover” ) from $owner.pets 23
  • 24. From CE for Expressions 'from' can work on any expression, not just a nested field on a bound variable. rule “Find People for given zip code” when $zipCode : ZipCode() Person( ) from $hbn.getNamedQuery(“Find People”) .setParameters( [ “zipCode” : $zipCode ] ) .list() Hibernate session 24
  • 26. Collect CE rule "accumulate" when $list : List( intValue > 100 ) from collect( Bus( color == "red" ) ) then print "red buses “ + $list; end 26
  • 28. Accumulate CE rule "accumulate" when $sum : Number( intValue > 100 ) from accumulate( Bus( color == "red", $t : takings ) init( sum = 0 ), action( sum += $t ), result( sum ) ) then print "sum is “ + $sum; end 28
  • 29. Accumulate CE rule "accumulate" when $sum : Number( intValue > 100 ) from accumulate( Bus( color == "red", $t : takings ) sum( $t ) ) then print "sum is “ + $sum; end 29
  • 30. Accumulate CE Patterns and CE's can be chained with 'from' rule "collect" when $zipCode : ZipCode() $sum : Number( intValue > 100 ) from accumulate( Bus( color == "red", $t : takings ) from $hbn.getNamedQuery(“Find Buses”) .setParameters( [ “zipCode” : $zipCode ] ) .list(), sum( $t ) ) then 30
  • 32. Timers rule “name” timer 1m30s when $l : Light( status == “on” ) then SendEmail( “turn the light off” ) rule “name” timer (int: 0 1m30) when $l : Light( status == “on” ) then SendEmail( “turn the light off” ) 32
  • 33. Timers Field Name Mandatory? Allowed Values Allowed Special Characters Seconds YES 0-59 ,-*/ Minutes YES 0-59 ,-*/ Hours YES 0-23 ,-*/ Day of month YES 1-31 ,-*?/LW Month YES 1-12 or JAN-DEC ,-*/ Day of week YES 1-7 or SUN-SAT ,-*?/L# Year NO empty, 1970-2099 ,-*/ rule “name” timer ( cron: 0 0/15 * * * * ) when $l : Light( status == “on” ) then sendEmail( “turn the light off” ) 33
  • 34. Calendars rule "weekdays are high priority" calendars "weekday" timer (int:0 1h) when Alarm() then send( "priority high - we have an alarm” ); end rule "weekend are low priority" calendars "weekend" timer (int:0 4h) when Alarm() then send( "priority low - we have an alarm” ); end 34
  • 36. TMS and Inference rule "Issue Child Bus Pass" Couples the logic when $p : Person( age < 16 ) then insert(new ChildBusPass( $p ) ); end rule "Issue Adult Bus Pass" What happens when the Child when stops being 16? $p : Person( age >= 16 ) then insert(new AdultBusPass( $p ) ); end 36
  • 37. TMS and Inference  Bad ● Monolithic ● Leaky ● Brittle integrity - manual maintenance 37
  • 38. TMS and Inference  A rule “logically” inserts an object  When the rule is no longer true, the object is retracted. when de-couples the logic $p : Person( age < 16 ) then logicalInsert( new IsChild( $p ) ) end Maintains the truth by when automatically retracting $p : Person( age >= 16 ) then logicalInsert( new IsAdult( $p ) ) end 38
  • 39. TMS and Inference rule "Issue Child Bus Pass" when $p : Person( ) IsChild( person =$p ) then logicalInsert(new ChildBusPass( $p ) ); end rule "Issue Adult Bus Pass" The truth maintenance cascades when $p : Person( age >= 16 ) IsAdult( person =$p ) then logicalInsert(new AdultBusPass( $p ) ); end 39
  • 40. TMS and Inference rule "Issue Child Bus Pass" when $p : Person( ) not( ChildBusPass( person == $p ) ) then requestChildBusPass( $p ); The truth maintenance cascades End 40
  • 41. TMS and Inference  Good ● De-couple knowledge responsibilities ● Encapsulate knowledge ● Provide semantic abstractions for those encapsulation ● Integrity robustness – truth maintenance 41
  • 46. DSLs 46
  • 47. DSLs 47
  • 48. Rule Flow 48
  • 50. Scalability Rule engines do not scale for CEP. They have a single point of insertion and are single threaded, CEP has concurrent streams of events. session.insert( event ) ; $c : Custumer( type == “VIP” ) BuyOrderEvent( customer == $c ) Single Point of entry Patterns, evaluate facts sequentially in a single thread. 50
  • 51. Scalability So lets allow multiple named entry points for those streams EntryPoint entryPoint = session.getEntryPoint( “Home Broker Stream” ); entryPoint.insert( event ) ; So now we can insert When not specified uses different streams the “default” entry-point concurrently $c : Custumer( type == “VIP ) BuyOrderEvent( customer == $c ) from entry-point “Home Broker Stream” Patterns can now optional specify their entry-point. 51
  • 52. Automatic Life-Cycle Management All Fact life-cycles must be managed by the user, so retractions are manual. declare StockTick Just use the declare statement to @role( event ) declare a type as an event and it end will be retracted when it is no longer needed declare StockTick @role( event ) @timestamp( timestampAttr ) companySymbol : String stockPrice : double The declare statement can also timestampAttr : long specify an internal model, that end external objects/xml/csv map on to. We support Smooks and JAXB 52
  • 53. Operators Rule engines do not have rich enough set of temporal comparison operators BackAckEvent must occur between 1s and 10s 'after' $c : Custumer( type == “VIP ) BuyOrderEvent $oe : BuyOrderEvent( customer == $c ) from entry-point “Home Broker Stream” BuyAckEvent( relatedEvent == $oe.id, this after[1s, 10s] $oe ) from entry-point “Stock Trader Stream” The Full set of Operators are supported ● coincides ● overlaps ● starts ● before ● overlappedby ● startedby ● after ● during ● finishes ● meets ● includes ● finishedby ● metby 53
  • 54. Operators 54
  • 55. Operators $c : Custumer( type == “VIP ) $oe : BuyOrderEvent( customer == $c ) from entry-point “Home Broker Stream” not BuyAckEvent( relatedEvent == $oe.id, this after[1s, 10s] $oe ) from entry-point “Stock Trader Stream” Existing Drools 'not' Conditional Elements can be used to detect non- occurrence of events 55
  • 56. Sliding time windows Rule engines react to events happening now, there is no temporal understanding of changes over time. StockTicker( symbol == “RHAT” ) over window:time( 5s ) 5s StockTicker( symbol == “RHAT” ) over window:length( 1000 ) 1000 tickers That isn't much without the ability to deal with aggregations, rules engines suck. 56
  • 57. Aggregations Rule Engines do not deal with aggregations Over 5 seconds $n : Number( intValue > 100 ) from accumulate( $s : StockTicker( symbol == “RHAT” ) over window:time( 5s ), average( $s.price ) ) Aggregate ticker price The pattern 'Number' for RHAT over last 5 reasons 'from' the seconds accumulate result $n : accumulate( $s : StockTicker( symbol == “RHAT” ) over window:time( 5s ), average( $s.price ) > 100 ) We can use some sugar to reduce verbosity 57
  • 59. Drools Flow A workflow engine combining processes and  Integration rules ● From loose coupling (decision services) ● To advance integration (process rules)  Unification ● Rules and processes are different types of business knowledge assets ● Infrastructure ● Timers/Schedulers ● Testing ● Communication/Services ● Tooling ● IDE ● repository, management ● Auditing ● 59
  • 61. Rules and processes generic ? Decision Services SCOPE Process specific Rules tightly coupled COUPLING loosely coupled 61
  • 63. Example 63
  • 65. RuleFlowGroup Rule Flow Group 65
  • 67. Constraints Java code constraint 67
  • 68. Constraints Rules can control my workflow? LHS “when” Rule Constraint 68
  • 69. Example  Business decisions are externalized using a decision service rule rule Decision1 when Decision1 rule Decision1 // conditions when when then // conditions // // actions then end conditions // actions end then // actions end 69
  • 70. Example  What if there is a lot of business logic like this? rule Decision1 rule Decision1 rule when Decision1 rule when Decision1 rule rule rule rule Decision1 // conditions // conditionsrule Decision1 rule Decision1 when Decision1 when Decision1 rule rule when Decision1 rule rule Decision1 then // conditions rule rule conditions Decision1 when Decision1 rule Decision1 Decision1 then // when Decision1 rule rule Decision1 // conditionswhen when rule Decision1 when // conditions // conditions when when then // conditionswhen Decision1 when when Decision1 // actions rule actions // Decision1 then // conditions when when then // conditions// conditions end // conditionsthen // conditionsthen // conditions // end when when // actions then // actions then when when // actions then then // conditions then // conditions// actions then // // // actions then end end conditions// actions // // actions end // // actions conditions conditions // actions then // actions end then // actions end // actions end then end end actions end end actions end conditions // conditions // then end then // end then end then // // actions // // actions actions end actions actions end end end end 70
  • 71. Flow of Control Process Engine Rules Engine 71
  • 72. Inversion of Control Process Engine Agenda Rules Engine 72
  • 73. Self monitoring and adaptive declare ProcessStartedEvent @role( event ) end rule "Number of process instances above threshold" when Number( nbProcesses : intValue > 1000 ) from accumulate( e: ProcessStartedEvent( processInstance.processId == "com.sample.order.OrderProcess" ) over window:size(1h), count(e) ) then System.err.println( "WARNING: Nb of order processes in the last hour > 1000: " + nbProcesses ); 73
  • 77. Unified API Definitions Runtime Language
  • 78. Definitions jBPM File file = new File (“.....”); // file to XML process definition ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( IoUtils.FileToString( file ) ); ProcessInstance processInstance = new ProcessInstance(processDefinition); Jess Rete engine = new Rete(); FileReader file = new FileReader("myfile.clp"); Jesp parser = new Jesp(file, engine); parser.parse(false); Esper EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider(); EPStatement countStmt = admin.createEPL( "...." ); countStmt.start(); 78
  • 79. Definitions Drools Flow KnowledegBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBulider(); kbuilder.addResource( ResourceFactory.newClassPathResource( “myflow.drf”, ResourceType.DRF ); If ( kbuilder.hasErrors() ) { log.error( kbuilder.hasErrors().toString() ); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( kbase.getKnowledgePackages() ); 79
  • 80. Definitions Drools Expert KnowledegBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBulider(); kbuilder.addResource( ResourceFactory.newClassPathResource( “myrules.drl”, ResourceType.DRL ); If ( kbuilder.hasErrors() ) { log.error( kbuilder.hasErrors().toString() ); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( kbase.getKnowledgePackages() ); 80
  • 81. Drools Integration Deployment Descriptors <change-set> <add> <resource source='classpath:myapp/data/myflow.drf' type='DRF' /> <resource source='http:myapp/data/myrules.drl' type='DRL' /> <resource source='classpath:data/IntegrationExampleTest.xls' type="DTABLE"> <decisiontable-conf input-type="XLS" worksheet-name="Tables_2" /> </resource> <add> </change-set> KnowledegBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBulider(); kbuilder.addResource( ResourceFactory.newFileResource( “changeset.xml”, ResourceType.ChangeSet ); 81
  • 83.
  • 87. Coming in 5.1  BPMN2 (80% of Workflow)  Integration ● OSGi ready ● Spring ● Camel  Seamless Remoting  Simulation/Testing  New Rete Algorithm “true modify” 87
  • 89. Questions? • Dave Bowman: All right, HAL; I'll go in through the emergency airlock. • HAL: Without your space helmet, Dave, you're going to find that rather difficult. • Dave Bowman: HAL, I won't argue with you anymore! Open the doors! • HAL: Dave, this conversation can serve no purpose anymore. Goodbye. Joshua: Greetings, Professor Falken. Stephen Falken: Hello, Joshua. Joshua: A strange game. The only winning move is not to play. How about a nice game of chess? 89