1、创建context语法

create context context_name
partition [by] event_property [and event_property [and ...]]
from stream_def [, event_property [...] from stream_def] [, ...]

context_name为context的名字,并且唯一。如果重复,会说明已存在。

event_property为事件的属性名,多个属性名之间用and连接,也可以用逗号连接。

stream_def就是view。

例如:

//一个流:id和name是User的属性
create context NewUser partition by id and name from User //多个流:sid是Student的属性,tid是Teacher的属性
create context Person partition by sid from Student, tid from Teacher

多个流一定要注意,每个流的中用于context的属性的数量要一样,数据类型也要一致。比如下面这几个就是错误的:

// 错误:sid是int,tname是String,数据类型不一致
create context Person partition by sid from Student, tname from Teacher // 错误:Student有一个属性,Teacher有两个属性,属性数量不一致
create context Person partition by sid from Student, tid,tname from Teacher // 错误:sid对应tname,sname对应tid,并且sname和tname是String,sid和tid是int,属性数量一样,但是对应的数据类型不一致
create context Person partition by sid,sname from Student, tname,tid from Teacher

可以对进入context的事件增加过滤条件,不符合条件的就被过滤掉,就像下面这样:

// age大于20的Student事件才能建立或者进入context
create context Person partition by sid from Student(age > 20)

例子:

import cn.hutool.core.lang.Console;
import com.espertech.esper.client.*;
import com.espertech.esper.client.context.ContextPartitionSelectorSegmented;
import lombok.*; import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; /**
* @author yaoyuan2
* @date 2019/3/26
*/
public class SimpleContext {
static EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();
static EPAdministrator admin = epService.getEPAdministrator();
static String view = User.class.getName();
public static void main(String[] args) {
String epl1 = "create context esbtest partition by id from "+view;//必须首先创建,否则报错:没有declare context
String epl2 = "context esbtest select avg(amount) as avgAmount,id from " + view;
Console.log(epl1);
Console.log(epl2);
EPStatement context = admin.createEPL(epl1);
EPStatement state = admin.createEPL(epl2);
state.addListener(new UpdateListener() {
@Override
public void update(EventBean[] newEvents, EventBean[] oldEvents) {
if (newEvents != null) {
Double avgAmount = (Double) (newEvents[0].get("avgAmount"));
Integer id = (Integer) (newEvents[0].get("id"));
Console.log("id={},avgAmount={}",id,avgAmount);
}
}
});
EPRuntime runtime = epService.getEPRuntime();
//查看id为1的平均金额
ContextPartitionSelectorSegmented selectCtx = new ContextPartitionSelectorSegmented() { // 该方法的实现方式与context定义的properties有关,如果有两个property id和time,则Object数组长度为2,obj[0]为id值,
// obj[1]为time值,然后再添加到list中并返回
@Override
public List<Object[]> getPartitionKeys() {
Object[] o = new Object[1];
o[0] = 1;
List<Object[]> list = new ArrayList<Object[]>();
list.add(o);
return
list;
}
};

User u1 = new User(1,20);
Console.log("sendEvent: id={},amount={}",u1.getId(),u1.getAmount());
runtime.sendEvent(u1);
User u2 = new User(2,30);
Console.log("sendEvent: id={},amount={}",u2.getId(),u2.getAmount());
runtime.sendEvent(u2);
User u3 = new User(1,30);
Console.log("sendEvent: id={},amount={}",u3.getId(),u3.getAmount());
runtime.sendEvent(u3); Iterator<EventBean> it = state.iterator(selectCtx);
EventBean event = it.hasNext() ? it.next() : null;
Console.log("Iterator context:id=1,avgAmount={}",event.get("avgAmount"
)); User u4 = new User(2,40);
Console.log("sendEvent: id={},amount={}",u4.getId(),u4.getAmount());
runtime.sendEvent(u4); }
}
@Setter
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
class User implements Serializable {
private int id;
private int amount;
}

输出

create context esbtest partition by id from com.ebc.User
context esbtest select avg(amount) as avgAmount,id from com.ebc.User sendEvent: id=1,amount=20
id=1,avgAmount=20.0

sendEvent: id=2,amount=30
id=2,avgAmount=30.0

sendEvent: id=1,amount=30
id=1,avgAmount=25.0
Iterator context:id=1,avgAmount=25.0

sendEvent: id=2,amount=40
id=2,avgAmount=35.0

通过例子发现,partition by id会根据id分组,每组进入各自的context。上例中,会建2个context,一个id=1的,另外1个id=2的。

如果partition by后边有同一个流的多个属性值,如:partition by id,name。A事件id=1,amount=20,B事件id=1,amount=21,C事件id=1,amount=20,那么A和C在一个context,B在另外1个context。

esper(4-1)-简单context的更多相关文章

  1. Esper学习之四:Context

    上周末打球实在太累了,就没来得及更新,只是列了个提纲做做准备,发现Context还是有很多内容的.结果也花了不少时间才写完,所以这篇需要各位慢慢消化,并且最好多写几个例子加深理解. 如果有不了解Esp ...

  2. esper(4-5)- Context 条件

    条件主要包含:Filter,Pattern,Crontab以及Time Period Filter主要就是对属性值的过滤,比如: create context NewUser partition by ...

  3. Esper学习之五:EPL语法(一)

    上篇说到了Esper的Context,要是不了解的同学请参看<Esper学习之四:Context>,看过的同学如果还是不理解的话可以给我评论,我将会尽可能的解答.之前有些同学问我Conte ...

  4. Esper学习之十二:EPL语法(八)

    今天的内容十分重要,在Esper的应用中是十分常用的功能之一.它是一种事件集合,我们可以对这个集合进行增删查改,所以在复杂的业务场景中我们肯定不会缺少它.它就是Named Window. 由于本篇篇幅 ...

  5. Esper学习之七:EPL语法(三)

    1.Aggregation 和SQL一样,EPL也有Aggregation,即聚合函数.语法如下: aggregate_function([all|distinct] expression) aggr ...

  6. 彻底理解Toast原理和解决小米MIUI系统上没法弹Toast的问题

    1.Toast的基本使用 Toast在Android中属于系统消息通知,用来提示用户完成了什么操作.或者给用户一个必要的提醒.Toast的官方定义是这样的: A toast provides simp ...

  7. Entity Framework Core 2.0 入门简介

    不多说废话了, 直接切入正题. EF Core支持情况 EF Core的数据库Providers: 此外还即将支持CosmosDB和 Oracle. EFCore 2.0新的东西: 查询: EF.Fu ...

  8. Entity Framework Core 2.0 入门

    该文章比较基础, 不多说废话了, 直接切入正题. 该文分以下几点: 创建Model和数据库 使用Model与数据库交互 查询和保存关联数据 EF Core支持情况 EF Core的数据库Provide ...

  9. 一篇关于Asp.Net Model验证响应消息的问题处理

    之前,我做过Asp.Net Core的Model验证,在Core中过滤器对响应的处理很简单 context.Result = new JsonResult(ErrorMsg); 但是,在Asp.Net ...

随机推荐

  1. css知多少(4)——解读浏览器默认样式(转)

    css知多少(4)——解读浏览器默认样式   上一节<css知多少(3)——样式来源与层叠规则>介绍了样式的五种来源,咱们再通过一张图回顾一下. 对于上面的三层,咱们大概都比较熟悉了.下面 ...

  2. 电脑安装unity3d有C盘逐渐爆满问题解决方案

    打开unity3d软件,Edit - Preference - GI Cache选中 Custom Cache Location,切换到别的盘,然后点击 Clean Cache清空一次,再查看C盘,存 ...

  3. 【摘自lvs官网】lvs介绍

    Linux Virtual Server项目的目标 :使用集群技术和Linux操作系统实现一个高性能.高可用的服务器,它具有很好的可伸缩性(Scalability).可靠性(Reliability)和 ...

  4. 激光SLAM Vs 视觉SLAM

    博客转载自:https://www.leiphone.com/news/201707/ETupJVkOYdNkuLpz.html 雷锋网(公众号:雷锋网)按:本文作者SLAMTEC(思岚科技公号sla ...

  5. WDCP文件缓存问题

    WDCP文件缓存问题,新建index.php 输入代码 <?php echo '789'; ?> 显示789 修改代码 <?php echo '666'; ?> 显示789 访 ...

  6. ZROI2018提高day6t2

    传送门 分析 将所有字母分别转化为1~26,之后将字符串的空位补全为0,?设为-1,我们设dp[p][c][le][ri]表示考虑le到ri个字符串且从第p位开始考虑,这一位最小填c的方案数,具体转移 ...

  7. Luogu 3172 [CQOI2015]选数

    考虑枚举$k$的倍数$dk$,容易知道$\left \lceil \frac{L}{K} \right \rceil\leq d\leq \left \lfloor \frac{H}{k} \righ ...

  8. [译]Javascript中的递归函数

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  9. [转]delphi xe6 android屏幕操持常亮

    1) setting the Project Options, Uses Permissions, Wake lock = True 2) Adding Android.JNI.PowerManage ...

  10. MVC要点

    1.绑定一个DropDownList @Html.DropDownListFor(m => m.MobileType, new List<SelectListItem>() { ne ...