zoukankan      html  css  js  c++  java
  • Esper学习之十四:Pattern(一)

    1. Pattern Atoms and Pattern operators
    Pattern是通过原子事件和操作符组合在一起构成模板。原子事件有3类,操作符有4类,具体如下:

    原子事件:
    1). 普通事件:包括POJO,Map,Array,XML
    2). 时间事件:包括间隔n个时间单位、crontab
    3). 自定义插件:用于观察特定事件的发生

    操作符:
    1). 重复操作符:every, every-distinct, [num] and until
    2). 逻辑操作符:and, or, not
    3). 顺序操作符:->(Followed by)
    4). 事件生命周期操作符:timer:within, timer:withinmax, while-expression, 自定义插件

    关于操作符,自然会有优先级,具体如下:

    PrecedenceOperatorDescriptionExample
    1

    guard postfix

    where timer:within and while (expression) (incl. withinmax and plug-in pattern guard)

    MyEvent where timer:within(1 sec)

    2

    unary

    every, not every, distinct

    every MyEvent
    timer:interval(5 min) and not MyEvent

    3 repeat [num], until

    [5] MyEvent

    [1..3] MyEvent until MyOtherEvent

    4 and and every (MyEvent and MyOtherEvent)
    5 or or every (MyEvent or MyOtherEvent)
    6 followed by -> every (MyEvent -> MyOtherEvent)

    上面的内容各位可以先有个印象,方便理解之后的详解。

    2. Pattern Filter Expression
    Pattern的Filter表达式和普通的表达式没有区别,我就不展开讲解了,各位看看下面几个例子就好,除了Filter之外的东西暂时不用关心是什么意思。

    1). every e1=RfidEvent -> e2=RfidEvent(assetId=e1.assetId)
    2). every e1=RfidEvent -> e2=RfidEvent(MyLib.isInRadius(e1.x, e1.y, x, y) and zone in (1, e1.zone))
    3). every (RfidEvent(zone > 1) and RfidEvent(zone < 10))

    3. Controlling Event Consumption
           上面说到了Filter,因为Pattern可以由多个原子事件组成,那么Filter自然也会有多个,正常情况下,所有的Filter都会对进入引擎的事件进行判定,但是我们也有只需要判定一次的时候,只要满足了某个Filter,那么其他的Filter就不用管这个事件了。Esper考虑到了这个需求,我们只需要在Filter表达式后面加个@consume注解即可,此注解可以跟随数字,表示过滤的优先级。默认优先级为1,数值越大优先级越高。

    为了结合上面几节的知识,我给了个完整的实例:

    [java] view plaincopy
     
    1. package example;  
    2.   
    3. import com.espertech.esper.client.EPAdministrator;  
    4. import com.espertech.esper.client.EPRuntime;  
    5. import com.espertech.esper.client.EPServiceProvider;  
    6. import com.espertech.esper.client.EPServiceProviderManager;  
    7. import com.espertech.esper.client.EPStatement;  
    8. import com.espertech.esper.client.EventBean;  
    9. import com.espertech.esper.client.UpdateListener;  
    10.   
    11. /** 
    12.  * Created by Luonanqin on 8/11/14. 
    13.  */  
    14. class ConsumeEvent {  
    15.   
    16.     private int id;  
    17.     private String name;  
    18.     private int age;  
    19.   
    20.     public int getId() {  
    21.         return id;  
    22.     }  
    23.   
    24.     public void setId(int id) {  
    25.         this.id = id;  
    26.     }  
    27.   
    28.     public String getName() {  
    29.         return name;  
    30.     }  
    31.   
    32.     public void setName(String name) {  
    33.         this.name = name;  
    34.     }  
    35.   
    36.     public int getAge() {  
    37.         return age;  
    38.     }  
    39.   
    40.     public void setAge(int age) {  
    41.         this.age = age;  
    42.     }  
    43.   
    44.     public String toString() {  
    45.         return "ConsumeEvent{" + "id=" + id + ", name='" + name + ''' + ", age=" + age + '}';  
    46.     }  
    47. }  
    48.   
    49. class PatternConsumeListener1 implements UpdateListener {  
    50.   
    51.     public void update(EventBean[] newEvents, EventBean[] oldEvents) {  
    52.         if (newEvents != null) {  
    53.             for (int i = 0; i < newEvents.length; i++) {  
    54.                 System.out.println("a: " + newEvents[i].get("a"));  
    55.                 System.out.println("b: " + newEvents[i].get("b"));  
    56.             }  
    57.         }  
    58.     }  
    59. }  
    60.   
    61. class PatternConsumeListener2 implements UpdateListener {  
    62.   
    63.     public void update(EventBean[] newEvents, EventBean[] oldEvents) {  
    64.         if (newEvents != null) {  
    65.             for (int i = 0; i < newEvents.length; i++) {  
    66.                 System.out.println("a: " + newEvents[i].get("a"));  
    67.                 System.out.println("b: " + newEvents[i].get("b"));  
    68.                 System.out.println("c: " + newEvents[i].get("c"));  
    69.             }  
    70.         }  
    71.     }  
    72. }  
    73.   
    74. public class PatternConsumeTest {  
    75.   
    76.     public static void main(String[] args) {  
    77.         EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();  
    78.         EPAdministrator admin = epService.getEPAdministrator();  
    79.         EPRuntime runtime = epService.getEPRuntime();  
    80.   
    81.         String consume = ConsumeEvent.class.getName();  
    82.   
    83.         String epl1 = "every (a=" + consume + "(id = 1)@consume and b=" + consume + "(name = 'luonq'))";  
    84.         System.out.println("EPL1: " + epl1 + " ");  
    85.   
    86.         EPStatement stat1 = admin.createPattern(epl1);  
    87.         stat1.addListener(new PatternConsumeListener1());  
    88.   
    89.         ConsumeEvent ce1 = new ConsumeEvent();  
    90.         ce1.setId(1);  
    91.         ce1.setName("luonq");  
    92.         System.out.println("Send Event: " + ce1);  
    93.         runtime.sendEvent(ce1);  
    94.   
    95.         System.out.println();  
    96.   
    97.         ConsumeEvent ce2 = new ConsumeEvent();  
    98.         ce2.setId(2);  
    99.         ce2.setName("luonq");  
    100.         System.out.println("Send Event: " + ce2);  
    101.         runtime.sendEvent(ce2);  
    102.   
    103.         stat1.destroy();  
    104.         System.out.println();  
    105.   
    106.         String epl2 = "every (a=" + consume + "(id = 1)@consume(2) or b=" + consume + "(name = 'luonq')@consume(3) or c=" + consume + "(age > 2))";  
    107.         System.out.println("EPL2: " + epl2 + " ");  
    108.   
    109.         EPStatement stat2 = admin.createPattern(epl2);  
    110.         stat2.addListener(new PatternConsumeListener2());  
    111.   
    112.         ConsumeEvent ce3 = new ConsumeEvent();  
    113.         ce3.setId(1);  
    114.         ce3.setName("luonq");  
    115.         ce3.setAge(3);  
    116.         System.out.println("Send Event: " + ce3);  
    117.         runtime.sendEvent(ce3);  
    118.   
    119.         ConsumeEvent ce4 = new ConsumeEvent();  
    120.         ce4.setId(1);  
    121.         ce4.setName("luonqin");  
    122.         ce4.setAge(1);  
    123.         System.out.println("Send Event: " + ce4);  
    124.         runtime.sendEvent(ce4);  
    125.   
    126.         ConsumeEvent ce5 = new ConsumeEvent();  
    127.         ce5.setId(3);  
    128.         ce5.setName("luonqin");  
    129.         ce5.setAge(5);  
    130.         System.out.println("Send Event: " + ce5);  
    131.         runtime.sendEvent(ce5);  
    132.     }  
    133. }  


    执行结果:

    [plain] view plaincopy
     
    1. EPL1: every (a=example.ConsumeEvent(id = 1)@consume and b=example.ConsumeEvent(name = 'luonq'))  
    2.   
    3. Send Event: ConsumeEvent{id=1, name='luonq', age=0}  
    4.   
    5. Send Event: ConsumeEvent{id=2, name='luonq', age=0}  
    6. a: ConsumeEvent{id=1, name='luonq', age=0}  
    7. b: ConsumeEvent{id=2, name='luonq', age=0}  
    8.   
    9. EPL2: every (a=example.ConsumeEvent(id = 1)@consume(2) or b=example.ConsumeEvent(name = 'luonq')@consume(3) or c=example.ConsumeEvent(age > 2))  
    10.   
    11. Send Event: ConsumeEvent{id=1, name='luonq', age=3}  
    12. a: null  
    13. b: ConsumeEvent{id=1, name='luonq', age=3}  
    14. c: null  
    15. Send Event: ConsumeEvent{id=1, name='luonqin', age=1}  
    16. a: ConsumeEvent{id=1, name='luonqin', age=1}  
    17. b: null  
    18. c: null  
    19. Send Event: ConsumeEvent{id=3, name='luonqin', age=5}  
    20. a: null  
    21. b: null  
    22. c: ConsumeEvent{id=3, name='luonqin', age=5}  

    这里先简单说明下,every关键字表示引擎把每个事件都进行Pattern的匹配,而不管上一个匹配是否完成。or和and就是或和且的意思,表示满足某个以及满足所有。

    去掉consume的执行结果:

    [plain] view plaincopy
     
    1. EPL1: every (a=example.ConsumeEvent(id = 1) and b=example.ConsumeEvent(name = 'luonq'))  
    2.   
    3. Send Event: ConsumeEvent{id=1, name='luonq', age=0}  
    4. a: ConsumeEvent{id=1, name='luonq', age=0}  
    5. b: ConsumeEvent{id=1, name='luonq', age=0}  
    6.   
    7. Send Event: ConsumeEvent{id=2, name='luonq', age=0}  
    8.   
    9. EPL2: every (a=example.ConsumeEvent(id = 1) or b=example.ConsumeEvent(name = 'luonq') or c=example.ConsumeEvent(age > 2))  
    10.   
    11. Send Event: ConsumeEvent{id=1, name='luonq', age=3}  
    12. a: ConsumeEvent{id=1, name='luonq', age=3}  
    13. b: null  
    14. c: null  
    15. Send Event: ConsumeEvent{id=1, name='luonqin', age=1}  
    16. a: ConsumeEvent{id=1, name='luonqin', age=1}  
    17. b: null  
    18. c: null  
    19. Send Event: ConsumeEvent{id=3, name='luonqin', age=5}  
    20. a: null  
    21. b: null  
    22. c: ConsumeEvent{id=3, name='luonqin', age=5}  

    上面的例子可能看得不是很懂,不过没关系,等到后面讲操作符进行详解后再来回顾就很简单了。

  • 相关阅读:
    linux IO调度算法
    Programming Languages: Application and Interpretation
    zz 跟风小结一下孕期~
    UML和模式应用学习笔记-1(面向对象分析和设计)
    ASP.NET交互Rest服务接口(Jquery的Get与Post方式)
    Linq To Xml操作XML增删改查
    MSSQL数据库迁移到Oracle(二)
    MSSQL数据库迁移到Oracle
    学习EF之CodeFirst二(数据库对应映射)
    学习EF之CodeFirst一
  • 原文地址:https://www.cnblogs.com/yudar/p/4872661.html
Copyright © 2011-2022 走看看