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. js面试题知识点全解(一作用域)

    问题: 1.说一下对变量提升的理解 2.说明this几种不同的使用场景 3.如何理解作用域 4.实际开发中闭包的应用 知识点: js没有块级作用域只有函数和全局作用域,如下代码: if(true){ ...

  2. 高性能MySQL笔记-第5章Indexing for High Performance-001B-Tree indexes(B+Tree)

    一. 1.什么是B-Tree indexes? The general idea of a B-Tree is that all the values are stored in order, and ...

  3. C语言实现文件实时更新

    一.简介 在linux或者unix操作系统中在系统引导的时候会开启很多服务,这些服务就叫做守护进程. 守护进程脱离了终端并且在后台运行:守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显 ...

  4. java全栈day07---Eclipse开发工具 超市库存管理系统

    前六天我们都是用Notepad++来编写java程序,通过DOS命令来运行,我们发现这样比较繁琐,那么我们今天就用一个工具Eclipse来开发java Eclipse的下载安装 * A: Eclips ...

  5. enumerate()函数

    for index,value in enumerate(list):       print index,value 等于for i in range(0,len(list)): print i,l ...

  6. arp绑定

    Windows xp 在CMD中执行 arp -s ip mac 例如 arp -s 192.168.2.101 40-5f-c2-c1-97-fb Windwos 7 在 Windows 7/Vis ...

  7. [学习笔记]通过open函数改变标准输出的方法

    int main(void) { char s[] = "abc.txt"; ; close(STDOUT_FILENO);//关闭标准输出文件描述符 int fd1 = open ...

  8. [译]Javascript中的函数

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

  9. json序列化.xml序列化.图片转base64.base64转图片.生成缩略图.IEnumerable<TResult> Select<TSource, TResult>做数据转换的五种方式

     JSON序列化 /// <summary> /// JSON序列化 /// </summary> public static class SPDBJsonConvert { ...

  10. 读取txt里面的数据进行计算

    双在论坛上找到一个问题,有关读取txt里面的数据进行计算的问题. 尝试解决这个问题,获取每一行的X和Y的浮点数据即可.读取文本文件每一行,判断是否为空行,是否符以分隔符号(,)分隔的两个数值.每个数值 ...