骆驼中的事件处理
在上一篇有關駱駝-小水車的帖子中,我介紹了駱駝-小水車的組件,并使用駱駝路線中的規則實現了一些簡單的面向任務的過程。 今天,我將展示如何通過添加事件處理來擴展此示例。
那么如何描述一個事件呢? 每個事件在某個時間發生并持續一段時間,事件以特定順序發生。 然后我們有了一個“事件云”,我們要從中識別那些事件,這些事件形成了一些有趣的關聯。 在這里,Drools的用法變得合理了-我們不必對每個事件都做出反應,只需為這些有趣的關聯描述一組規則和后果。 Drools引擎將找到它們并觸發匹配規則。
假設我們的系統必須監視分配給用戶的任務的執行。 創建任務后,用戶有10天的時間完成任務。 如果他不這樣做,則應發送剩余的電子郵件。
規則定義如下所示:
import org.apache.camel.component.drools.stateful.model.* global org.apache.camel.component.drools.CamelDroolsHelper helperdeclare TaskCreated@role( event )@expires( 365d ) enddeclare TaskCompleted@role( event )@expires( 365d ) endrule "Task not completed after 10 days"when$t : TaskCreated()not(TaskCompleted(name==$t.name, this after [-*, 10d] $t))thenhelper.send("direct:escalation", $t.getName()); end如您所見,事件有兩種類型:TaskCreated(當系統將任務分配給用戶時)和TaskCompleted(當用戶完成任務時)。 我們通過'name'屬性將兩者關聯起來。 首先,我們需要通過添加@role(event)和@expires批注將模型類聲明為事件。 然后我們描述規則:“當TaskCreated事件10天后沒有TaskCompleted事件時,將任務名稱發送到direct:escalation路線”。 同樣,這可能是聲明式編程的示例–我們不必指定任務的實際名稱,只需按名稱將TaskCreated與TaskCompleted事件相關聯即可。
在此示例中,我使用了“之后”時間運算符。 有關其他說明,請參閱Drools Fusion文檔 。
最后,這是JUnit測試代碼片段:
public class TaskEventsTest extends GenericTest {DefaultCamelContext ctx;@Testpublic void testCompleted() throws Exception {insertAdvanceDays(new TaskCreated("Task1"), 4);assertContains(0);insertAdvanceDays(new TaskCompleted("Task1"), 4);advanceDays(5);assertContains(0);}@Testpublic void testNotCompleted() throws Exception {insertAdvanceDays(new TaskCreated("Task1"), 5);assertContains(0);advanceDays(5);assertContains("Task1");}@Testpublic void testOneNotCompleted() throws Exception {ksession.insert(new TaskCreated("Task1"));insertAdvanceDays(new TaskCreated("Task2"), 5);assertContains(0);insertAdvanceDays(new TaskCompleted("Task1"), 4);assertContains(0);advanceDays(1);assertContains("Task2");advanceDays(10);assertContains("Task2");}@Overrideprotected void setUpResources(KnowledgeBuilder kbuilder) throws Exception {kbuilder.add(new ReaderResource(new StringReader(IOUtils.toString(getClass().getResourceAsStream("/stateful/task-event.drl")))), ResourceType.DRL);}@Overridepublic void setUpInternal() throws Exception {this.ctx = new DefaultCamelContext();CamelDroolsHelper helper = new CamelDroolsHelper(ctx, new DefaultExchange(ctx)) {public Object send(String uri, Object body) {sentStuff.add(body.toString());return null;};};ksession.setGlobal("helper", helper);} }- 您可以在此處找到此示例的源代碼。
翻譯自: https://www.javacodegeeks.com/2014/03/event-processing-in-camel-drools.html
總結
- 上一篇: 小龙虾什么时候上市 小龙虾一般什么时候上
- 下一篇: Java 8:开发人员怎么看?