esper(4-1)-简单context
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的更多相关文章
- Esper学习之四:Context
上周末打球实在太累了,就没来得及更新,只是列了个提纲做做准备,发现Context还是有很多内容的.结果也花了不少时间才写完,所以这篇需要各位慢慢消化,并且最好多写几个例子加深理解. 如果有不了解Esp ...
- esper(4-5)- Context 条件
条件主要包含:Filter,Pattern,Crontab以及Time Period Filter主要就是对属性值的过滤,比如: create context NewUser partition by ...
- Esper学习之五:EPL语法(一)
上篇说到了Esper的Context,要是不了解的同学请参看<Esper学习之四:Context>,看过的同学如果还是不理解的话可以给我评论,我将会尽可能的解答.之前有些同学问我Conte ...
- Esper学习之十二:EPL语法(八)
今天的内容十分重要,在Esper的应用中是十分常用的功能之一.它是一种事件集合,我们可以对这个集合进行增删查改,所以在复杂的业务场景中我们肯定不会缺少它.它就是Named Window. 由于本篇篇幅 ...
- Esper学习之七:EPL语法(三)
1.Aggregation 和SQL一样,EPL也有Aggregation,即聚合函数.语法如下: aggregate_function([all|distinct] expression) aggr ...
- 彻底理解Toast原理和解决小米MIUI系统上没法弹Toast的问题
1.Toast的基本使用 Toast在Android中属于系统消息通知,用来提示用户完成了什么操作.或者给用户一个必要的提醒.Toast的官方定义是这样的: A toast provides simp ...
- Entity Framework Core 2.0 入门简介
不多说废话了, 直接切入正题. EF Core支持情况 EF Core的数据库Providers: 此外还即将支持CosmosDB和 Oracle. EFCore 2.0新的东西: 查询: EF.Fu ...
- Entity Framework Core 2.0 入门
该文章比较基础, 不多说废话了, 直接切入正题. 该文分以下几点: 创建Model和数据库 使用Model与数据库交互 查询和保存关联数据 EF Core支持情况 EF Core的数据库Provide ...
- 一篇关于Asp.Net Model验证响应消息的问题处理
之前,我做过Asp.Net Core的Model验证,在Core中过滤器对响应的处理很简单 context.Result = new JsonResult(ErrorMsg); 但是,在Asp.Net ...
随机推荐
- 2018多校第九场1010 (HDU6424) 数学
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6424 解法:找规律.因为最多三项,a1^a2^a3可以拆成(a1+2)+(a2+1)*a3,然后建成数 ...
- php中定义数组的方法
1.PHP定义数组的格式 数组名=array(); 如:$aa=array();//这样就定义了一个数组, 之后给元素赋值: $aa[0]="9016"; $aa[1]=" ...
- C++面向对象类的实例题目六
问题描述: 编写一个程序计算两个给定长方形的面积,其中在设计类成员函数addarea()(用于计算两个长方形的总面积)时使用对象作为参数. 程序代码: #include<iostream> ...
- Tensorflow手写数字识别(交叉熵)练习
# coding: utf-8import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #pr ...
- JavaWeb 没用
Servlet的生命周期 初始化:Web容器加载servlet,调用innit(),只执行一次 处理业务: 请求到达时,运行service方法 并调用相应的doget或者dopost方法. 可执行多 ...
- ZROI2018提高day3t2
传送门 分析 我们设A[i]表示点i有几个矿,B[i]表示这之中有几个矿是第一次出现,所以点i的贡献即为 (2^B[i]-1)*(2^(A[i]-B[i])) 注意减一的原因是第一次出现的矿应至少有一 ...
- 层次分析法(Analytic Hierarchy Process,AHP)
昨天晚上室友问我什么是层次分析法?我当时就大概给他介绍了一下,没有细讲. 今天我仔细讲讲这个. 层次分析法是运筹学里面的一种方法,是讲与决策总是有关的元素分解成目标.准则.方案等层次,在此基础上进行定 ...
- 基于PhpStorm对Yii框架进行的单元测试一【PhpUnit环境搭建】
1.下载phpunit.phar 2.在phpstorm中配置phpunit库 3.不同版本phpunit 需要依赖的php解释器也不一样,如果运行时报错 可以适当调整php解释器的版本 至此进行ph ...
- 微信小程序小结(4) -- 分包加载及小程序间跳转
分包加载 某些情况下,开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载(主要是空间不够用,哈哈~). 在构建小程序分包项目时,构建会输出一个或多个功能的分包,其中 ...
- 浅谈《守望先锋》中的 ECS 构架
https://blog.codingnow.com/2017/06/overwatch_ecs.html 今天读了一篇 <守望先锋>架构设计与网络同步 .这是根据 GDC 2017 上的 ...