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 ...
随机推荐
- c# 类的初步认识
这里我们把类分为三种: String类(字符串类):Math类(数学类):DateTime类(时间日期类). 在使用类时注意 在输入的过程中代码前面会出现一些符号(紫色立方体代表方法,函数和黑色扳手 ...
- 吸收效果,像是在Mac上的垃圾桶的效果一样
#import "AppDelegate.h" #import <QuartzCore/QuartzCore.h> @interface AppDelegate () ...
- R: 一页显示多张图的方法
################################################### 问题:一页多图显示 18.4.30 怎么实现,在一页上画多幅图,并且安排图的大小.个数等?? ...
- java线程安全的元素
集合类: Vector Stack HashTable enumeration 字符串: StringBuffer
- WordCount编码测试
Github项目地址:https://github.com/LantyrLYL/WordCount PSP表格: PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning 计 ...
- WordCount编码和测试
WordCount编码和测试 项目地址:https://github.com/handsomesnail/WordCount PSP表格 PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分钟) ...
- 《Maven实战》笔记-9-版本管理
一.理想的发布版本,在项目构建时需要满足以下条件: 1.所有自动化测试应当全部通过: 2.项目没有配置任何快照版本的依赖: 3.项目没有任何快照版本的插件: 4.项目所包含的代码已经全部提交到版本控制 ...
- Spring JDBCTemplate配置使用
一.开发环境 Windows 10 IntelliJ IDEA 2016.1 旗舰版 JDK1.8 二.项目和数据库结构 项目结构: 数据库(MySQL 5.5.39): /* Navicat MyS ...
- iOS应用推荐
RSS阅读器 Inoreader ***客户端 SuperWingy OpenWingy(已下架) 书签 Pocket 语音备忘录 Voice-Memos 编程语言学习 SoloLearn 社交 Tw ...
- eclipse workspace 共享设置
总结一下,复制工作空间配置步骤如下: 1 使用eclipse新建workspace. 2 将新建的workspace下的.metadata\.plugins内容全部删除. 3 将需要拷贝的worksp ...