我需要使用 ESPER实现一个规则引擎
为此我必须准备查询规则(如果有任何其他优化方式,请提出建议)。规则在运行时必须是可声明的和可修改的。
此外,我将不得不创建一个 UI 来定义规则。
请建议任何更好和优化的方法。
一个例子:
可以在运行时定义更多的规则。
问问题
985 次
1 回答
1
可以参考的上下文非常少,但一个简单的解决方案是简单地保持每个订单和每个价格的最新状态,并将每个规则作为引擎订阅来实现。您的引擎可以使用以下 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 语句。
于 2014-09-30T02:37:49.087 回答