epi*_*eek 3 java rule-engine drools
我正在编写一个 RESTful 服务来根据一些规则计算一些值。
例如:
有一个这样的 JSON:
{ "amount": 100,
"destination":"A"
}
Run Code Online (Sandbox Code Playgroud)
该数据是请求正文,发布到我的控制器:
@RequestMapping(value = "/orders", method= RequestMethod.POST)
public void getOrderRequest(@RequestBody Order order){
// use Drools to calculate and return the result
}
Run Code Online (Sandbox Code Playgroud)
这是实体类:
public class Order{
private Integer amount;
private String destination;
private Float price;
// getters and setters
}
Run Code Online (Sandbox Code Playgroud)
我用Drools来计算价格(假代码):
package rules
import entity.Order
rule "rule1"
no-loop true
lock-on-active true
salience 1
when
$s : Order(amount <= 50 && destination=="A")
then
$s.setPrice(1000);
update($s);
rule "rule2"
no-loop true
lock-on-active true
salience 1
when
$s : Order(amount > 50 && destination=="A")
then
$s.setPrice(2000);
update($s);
Run Code Online (Sandbox Code Playgroud)
这工作正常。所有规则都可以更改并运行,而无需重新启动我的 REST 服务。
这是一个场景,一个新字段添加到订单 JSON 中:
{ "amount": 100,
"destination":"A",
"customer":"Trump"
}
Run Code Online (Sandbox Code Playgroud)
添加新规则:如果客户是特朗普,则价格加倍:
rule "rule3"
no-loop true
lock-on-active true
salience 1
when
$s : Order(customer == "Trump")
then
$s.setPrice(price * 2);
update($s);
Run Code Online (Sandbox Code Playgroud)
但我必须向我的 Order 类添加一个新变量并重新启动我的服务。
我想知道有什么方法可以在不重新启动 REST 服务的情况下实现这一点吗?
或者我可以使用其他 BRMS 动态处理 JSON 数据吗?
使用 Map 携带所有订单详细信息:
public class Order{
private Map<String, Object> fields;
// getters and setters
}
Run Code Online (Sandbox Code Playgroud)
如果您设法将 JSON 中的值添加到 Map 中,那么您可以像这样编写规则:
rule "rule3"
no-loop true
lock-on-active true
salience 1
when
$s : Order(fields["customer"] == "Trump")
then
$s.setPrice(price * 2);
update($s);
Run Code Online (Sandbox Code Playgroud)