我需要使用 ESPER 实现一个规则引擎
为此,我必须准备查询规则(如果有任何其他优化方式,请提出建议)。规则必须在运行时可声明和修改。
此外,我还必须创建一个 UI 来定义规则。
请提出更好和优化的方法。
一个例子:
可以在运行时定义更多规则。
最佳答案
几乎没有上下文可以引用,但一个简单的解决方案是简单地保持每个订单和每个价格的最新状态,并将每个规则实现为引擎订阅。您的引擎可以使用以下 EPL 语句进行初始化:
/* Minimal schema-s */
create schema LiveOrder (user string, orderid string, quantity, double, symbol string);
create schema LivePrice (symbol string, price double);
/* create two windows to store the latest order by orderid, and latest price by symbol */
create window LiveOrders.std:unique(orderid) as select * from LiveOrder;
create window LivePrices.std:unique(symbol) as select * from LivePrice;
/* insert data into the windows when data arrives */
insert into LiveOrders select * from LiveOrder;
insert into LivePrices select * from LivePrice;
此时您将存储所有订单和价格,因此可以根据不同的规则轻松“加入”它们。如果用户在下订单和订购数量 > 100 时需要提醒,您只需创建以下 EPL 语句并附加一个监听器来发送提醒:
select * from LiveOrders where user='U1' and quantity > 100;
要在任何交易品种的订单金额超过 10000 时创建提醒,您可以对这个 EPL 执行相同的操作:
select LiveOrders.symbol as symbol, LiveOrders.quantity*LivePrices as total from LiveOrders
inner join LivePrices on LiveOrders.symbol=LivePrices.symbol
where LiveOrders.quantity*LivePrices > 10000
只要不再需要警报,您只需删除监听器并销毁 EPL 语句。
关于rule-engine - 自定义规则引擎中的esper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13413666/