From 36dbf8446e90c30c1fdbfc68e95b44b2a6b35d16 Mon Sep 17 00:00:00 2001 From: benas Date: Fri, 22 Mar 2013 23:24:07 +0100 Subject: [PATCH] update order tutorial to make suspect order rule configurable via JMX at runtime --- .../benas/easyrules/samples/order/Order.java | 2 -- .../samples/order/OrderSampleLauncher.java | 15 ++++++++-- .../order/SuspectOrderJmxManagedRule.java | 29 +++++++++++++++++++ .../samples/order/SuspectOrderRule.java | 17 +++++++++-- 4 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 easyrules-samples/src/main/java/net/benas/easyrules/samples/order/SuspectOrderJmxManagedRule.java diff --git a/easyrules-samples/src/main/java/net/benas/easyrules/samples/order/Order.java b/easyrules-samples/src/main/java/net/benas/easyrules/samples/order/Order.java index 0b5adb5..2cd026f 100644 --- a/easyrules-samples/src/main/java/net/benas/easyrules/samples/order/Order.java +++ b/easyrules-samples/src/main/java/net/benas/easyrules/samples/order/Order.java @@ -31,8 +31,6 @@ package net.benas.easyrules.samples.order; */ class Order { - public static float ORDER_AMOUNT_THRESHOLD = 1000; - private long orderId; private float amount; diff --git a/easyrules-samples/src/main/java/net/benas/easyrules/samples/order/OrderSampleLauncher.java b/easyrules-samples/src/main/java/net/benas/easyrules/samples/order/OrderSampleLauncher.java index 6892f60..d18e100 100644 --- a/easyrules-samples/src/main/java/net/benas/easyrules/samples/order/OrderSampleLauncher.java +++ b/easyrules-samples/src/main/java/net/benas/easyrules/samples/order/OrderSampleLauncher.java @@ -34,7 +34,7 @@ import net.benas.easyrules.core.DefaultRulesEngine; */ public class OrderSampleLauncher { - public static void main(String[] args) { + public static void main(String[] args) throws InterruptedException { Order order = new Order(6654, 1200); Customer customer = new Customer(2356, true); @@ -44,7 +44,7 @@ public class OrderSampleLauncher { */ SuspectOrderRule suspectOrderRule = new SuspectOrderRule( "Suspect Order", - "Send alert if a new customer checks out an order with amount greater than 1000$", + "Send alert if a new customer checks out an order with amount greater than a threshold", 1); /** @@ -57,12 +57,21 @@ public class OrderSampleLauncher { * Create a default rules engine and register the business rule */ RulesEngine rulesEngine = new DefaultRulesEngine(); - rulesEngine.registerRule(suspectOrderRule); + rulesEngine.registerJmxManagedRule(suspectOrderRule, true, SuspectOrderJmxManagedRule.class); /** * Fire rules */ rulesEngine.fireRules(); + // Suspend execution for 30s to have time to update suspect order amount threshold via a JMX client. + Thread.sleep(30000); + + System.out.println("**************************************************************"); + System.out.println("Re fire rules after updating suspect order amount threshold..."); + System.out.println("**************************************************************"); + + rulesEngine.fireRules(); + } } diff --git a/easyrules-samples/src/main/java/net/benas/easyrules/samples/order/SuspectOrderJmxManagedRule.java b/easyrules-samples/src/main/java/net/benas/easyrules/samples/order/SuspectOrderJmxManagedRule.java new file mode 100644 index 0000000..822a80f --- /dev/null +++ b/easyrules-samples/src/main/java/net/benas/easyrules/samples/order/SuspectOrderJmxManagedRule.java @@ -0,0 +1,29 @@ +package net.benas.easyrules.samples.order; + +import net.benas.easyrules.api.JmxManagedRule; + +import javax.management.MXBean; + +/** + * Interface to make suspect order rule manageable via JMX.
+ * Suspect order threshold should be changed at runtime. + * + * @author benas (md.benhassine@gmail.com) + */ + +@MXBean +public interface SuspectOrderJmxManagedRule extends JmxManagedRule { + + /** + * Get the current suspect order amount threshold + * @return current suspect order amount threshold + */ + float getSuspectOrderAmountThreshold(); + + /** + * Set the suspect order amount threshold + * @param suspectOrderAmountThreshold the new suspect order amount threshold + */ + void setSuspectOrderAmountThreshold(float suspectOrderAmountThreshold); + +} diff --git a/easyrules-samples/src/main/java/net/benas/easyrules/samples/order/SuspectOrderRule.java b/easyrules-samples/src/main/java/net/benas/easyrules/samples/order/SuspectOrderRule.java index d093c37..14ac0a0 100644 --- a/easyrules-samples/src/main/java/net/benas/easyrules/samples/order/SuspectOrderRule.java +++ b/easyrules-samples/src/main/java/net/benas/easyrules/samples/order/SuspectOrderRule.java @@ -31,7 +31,9 @@ import net.benas.easyrules.core.Rule; * * @author benas (md.benhassine@gmail.com) */ -class SuspectOrderRule extends Rule { +class SuspectOrderRule extends Rule implements SuspectOrderJmxManagedRule { + + private float suspectOrderAmountThreshold = 1000; private Order order; @@ -43,13 +45,13 @@ class SuspectOrderRule extends Rule { @Override public boolean evaluateConditions() { - return order.getAmount() > Order.ORDER_AMOUNT_THRESHOLD && customer.isNew(); + return order.getAmount() > suspectOrderAmountThreshold && customer.isNew(); } @Override public void performActions() throws Exception { System.out.println("Alert : A new customer [id=" + customer.getCustomerId() + "] has checked out an order [id=" + - order.getOrderId() + "] with amount " + order.getAmount() + " > " + Order.ORDER_AMOUNT_THRESHOLD); + order.getOrderId() + "] with amount " + order.getAmount() + " > " + suspectOrderAmountThreshold); } public void setOrder(Order order) { @@ -59,4 +61,13 @@ class SuspectOrderRule extends Rule { public void setCustomer(Customer customer) { this.customer = customer; } + + public float getSuspectOrderAmountThreshold() { + return suspectOrderAmountThreshold; + } + + public void setSuspectOrderAmountThreshold(float suspectOrderAmountThreshold) { + this.suspectOrderAmountThreshold = suspectOrderAmountThreshold; + } + }