How to Pick the Right Rule Engine: 5 Popular Choices Compared
This article examines the conflict between rapidly changing business rules and system stability, introduces rule engines as a solution, compares five widely used Java rule engines—including Drools, Easy Rules, QLExpress, Aviator, and LiteFlow—by their scenarios, advantages, disadvantages, performance, and provides practical guidance for selecting and avoiding common pitfalls.
Introduction
Core pain point: frequent business rule changes clash with system stability, especially in e‑commerce promotion scenarios where hard‑coded if‑else logic quickly becomes unmaintainable.
public BigDecimal calculateDiscount(Order order) {
BigDecimal discount = BigDecimal.ZERO;
if (order.getTotalAmount().compareTo(new BigDecimal("100")) >= 0) {
discount = discount.add(new BigDecimal("10"));
}
if (order.getUser().isVip()) {
discount = discount.add(new BigDecimal("5"));
}
// more nested if‑else …
return discount;
}When rules become more complex (e.g., "non‑VIP users get $30 off orders over $200, VIP users get $40 off orders over $150, plus an extra 5% discount on Tuesdays"), the code turns into a maintenance nightmare.
Why Use a Rule Engine?
A rule engine separates rule logic from business code, offering:
External rule storage (database or file)
Dynamic rule loading
Declarative rule syntax
Independent execution environment
Below are five commonly used Java rule engines.
1. Drools – Enterprise‑grade Rule Engine
Website: https://www.drools.org/
Applicable scenarios:
Financial risk control with hundreds of complex rules
Insurance claim calculations
E‑commerce promotion systems
Sample rule file (discount.drl):
rule "VIP user gets $20 off when order > 100"
when
$user: User(level == "VIP")
$order: Order(amount > 100)
then
$order.addDiscount(20);
endJava invocation:
KieServices kieServices = KieServices.Factory.get();
KieContainer kContainer = kieServices.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("discountSession");
kSession.insert(user);
kSession.insert(order);
kSession.fireAllRules();Pros:
Full RETE algorithm implementation
Supports complex rule networks
Rich monitoring console
Cons:
Steep learning curve
High memory consumption
Requires KIE container
Suitable for large enterprises with high‑complexity rule sets.
2. Easy Rules – Lightweight Rule Engine
Website: https://github.com/j-easy/easy-rules
Applicable scenarios:
Parameter validation
Simple risk‑control rules
Approval flow engines
Annotation‑based rule example:
@Rule(name = "Rain discount", description = "9% off on rainy days")
public class RainDiscountRule {
@Condition
public boolean when(@Fact("weather") String weather) {
return "rainy".equals(weather);
}
@Action
public void then(@Fact("order") Order order) {
order.setDiscount(0.9);
}
}Engine execution:
RulesEngineParameters params = new RulesEngineParameters()
.skipOnFirstAppliedRule(true); // stop after first match
RulesEngine engine = new DefaultRulesEngine(params);
engine.fire(rules, facts);Pros:
Can be up and running in five minutes
No third‑party dependencies
Supports rule composition
Cons:
Does not support complex rule chains
Lacks a visual UI
Ideal for small projects or teams with limited resources.
3. QLExpress – Alibaba Script Engine
Website: https://github.com/alibaba/QLExpress
Applicable scenarios:
Dynamic calculation logic
Financial formula evaluation
Flexible marketing rule changes
Dynamic script execution:
ExpressRunner runner = new ExpressRunner();
DefaultContext<String, Object> context = new DefaultContext<>();
context.put("user", user);
context.put("order", order);
String express = "if (user.level == 'VIP') { order.discount = 0.85; }";
runner.execute(express, context, null, true, false);Pros:
Hot‑update of scripts
Java‑like syntax
Sandbox security
Cons:
Debugging can be difficult
Complex rules are hard to read
Best for business scenarios that require frequent rule modifications.
4. Aviator – High‑Performance Expression Engine
Website: https://github.com/killme2008/aviatorscript
Applicable scenarios:
Real‑time pricing engines
Risk‑control metric calculations
Big‑data field processing
Performance test (10 000 executions):
// Aviator expression
Expression exp = AviatorEvaluator.compile("user.age > 18 && order.amount > 100");
exp.execute(map);
// Groovy script (for comparison)
new GroovyShell().evaluate("user.age > 18 && order.amount > 100");Result: Aviator 220 ms vs Groovy 1 850 ms.
Pros:
Performance far exceeds peers
Supports bytecode generation
Lightweight with no dependencies
Cons:
Only supports expressions, not full scripts
No flow‑control constructs
Perfect for compute‑intensive scenarios where speed is critical.
5. LiteFlow – Rule Orchestration Engine
Website: https://liteflow.com/
Applicable scenarios:
Complex business processes
Order state machines
Workflow approvals
Chain definition example:
<chain name="orderProcess">
<then value="checkStock,checkCredit"/> <!-- parallel -->
<when value="isVipUser">
<then value="vipDiscount"/>
</when>
<otherwise>
<then value="normalDiscount"/>
</otherwise>
<then value="saveOrder"/>
</chain>Java invocation:
LiteflowResponse response = FlowExecutor.execute2Resp("orderProcess", order, User.class);
if (response.isSuccess()) {
System.out.println("Process succeeded");
} else {
System.out.println("Failure reason: " + response.getCause());
}Pros:
Visual workflow composition
Supports async, parallel, and conditional branches
Hot‑update of rules
Cons:
Documentation is still sparse
Community ecosystem is immature
Suitable for projects that need flexible, visual workflow orchestration.
Horizontal Evaluation (Performance & Memory)
Engine Time Memory Characteristics
Drools 420ms High Feature‑rich
Easy Rules 38ms Low Lightweight & easy to use
QLExpress 65ms Medium Alibaba script engine
Aviator 28ms Very low High‑performance expression
LiteFlow 120ms Medium Flow orchestration specialistTechnical Selection Guidelines
Simple scenarios: combine Easy Rules and Aviator.
Financial risk control: use Drools for its robustness.
E‑commerce operations: QLExpress offers flexible rule changes.
Workflow‑driven processes: LiteFlow provides powerful orchestration.
Common Pitfalls
Drools memory leak: use stateless sessions to avoid memory buildup.
KieSession session = kContainer.newStatelessKieSession();QLExpress security issue: disable dangerous methods.
runner.addFunctionOfServiceMethod("exit", System.class, "exit", null, null);Rule conflict detection: enforce sequential execution in Drools.
KieSessionConfiguration config = KieServices.Factory.get().newKieSessionConfiguration();
config.setProperty("drools.sequential", "true"); // execute in orderConclusion
Can use: replace tangled if‑else with a rule engine for beginner‑level improvements.
Use well: leverage hot‑update and visual tools for intermediate mastery.
Use expertly: combine orchestration and performance tuning for advanced scenarios.
As the author says, “Tools never replace thinkers; they only eliminate manual labor.”
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Su San Talks Tech
Su San, former staff at several leading tech companies, is a top creator on Juejin and a premium creator on CSDN, and runs the free coding practice site www.susan.net.cn.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
