骆驼祥子大事件时间轴_骆驼中的事件处理
駱駝祥子大事件時間軸
在上一篇有關駱駝-小水車的文章中,我介紹了駱駝-小水車的組件,并使用駱駝路線中的規(guī)則實現(xiàn)了一些簡單的面向任務的過程。 今天,我將展示如何通過添加事件處理來擴展此示例。
那么如何描述一個事件呢? 每個事件在某個時間發(fā)生并持續(xù)一段時間,事件以特定順序發(fā)生。 然后,我們有一個“事件云”,我們要從中識別那些事件,這些事件形成了一些有趣的關聯(lián)。 在這里,Drools的用法變得合理了-我們不必對每個事件都做出React,只需為這些有趣的關聯(lián)描述一組規(guī)則和后果。 Drools引擎將找到它們并觸發(fā)匹配規(guī)則。
假設我們的系統(tǒng)必須監(jiān)視分配給用戶的任務的執(zhí)行。 創(chuàng)建任務后,用戶有10天的時間完成任務。 如果他不這樣做,則應發(fā)送剩余的電子郵件。
規(guī)則定義如下所示:
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(當系統(tǒng)將任務分配給用戶時)和TaskCompleted(當用戶完成任務時)。 我們通過“名稱”屬性將二者關聯(lián)起來。 首先,我們需要通過添加@role(event)和@expires批注將模型類聲明為事件。 然后我們描述規(guī)則:“當TaskCreated事件10天后沒有TaskCompleted事件時,將任務名稱發(fā)送到direct:escalation路線”。 同樣,這可能是聲明式編程的示例–我們不必指定任務的實際名稱,而只需按名稱將TaskCreated與TaskCompleted事件相關聯(lián)。
在此示例中,我使用了“之后”時間運算符。 有關其他說明,請參閱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
駱駝祥子大事件時間軸
總結(jié)
以上是生活随笔為你收集整理的骆驼祥子大事件时间轴_骆驼中的事件处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux装win7系统教程(linux
- 下一篇: 精选枚举代替开关