骆驼祥子大事件时间轴
在上一篇有关骆驼-小水车的文章中,我介绍了骆驼-小水车的组件,并使用骆驼路线中的规则实现了一些简单的面向任务的过程。 今天,我将展示如何通过添加事件处理来扩展此示例。
那么如何描述一个事件呢? 每个事件在某个时间发生并持续一段时间,事件以特定顺序发生。 然后,我们有一个“事件云”,我们要从中识别那些事件,这些事件形成了一些有趣的关联。 在这里,Drools的用法变得合理了-我们不必对每个事件都做出React,只需为这些有趣的关联描述一组规则和后果。 Drools引擎将找到它们并触发匹配规则。
假设我们的系统必须监视分配给用户的任务的执行。 创建任务后,用户有10天的时间完成任务。 如果他不这样做,则应发送剩余的电子邮件。
规则定义如下所示:
import org.apache.camel.component.drools.stateful.model.*
global org.apache.camel.component.drools.CamelDroolsHelper helper
declare TaskCreated
@role( event )
@expires( 365d )
end
declare TaskCompleted
@role( event )
@expires( 365d )
end
rule "Task not completed after 10 days"
when
$t : TaskCreated()
not(TaskCompleted(name==$t.name, this after [-*, 10d] $t))
then
helper.send("direct:escalation", $t.getName());
end
如您所见,事件有两种类型:TaskCreated(当系统将任务分配给用户时)和TaskCompleted(当用户完成任务时)。 我们通过“名称”属性将二者关联起来。 首先,我们需要通过添加@role(event)和@expires批注将模型类声明为事件。 然后我们描述规则:“当TaskCreated事件10天后没有TaskCompleted事件时,将任务名称发送到direct:escalation路线”。 同样,这可能是声明式编程的示例–我们不必指定任务的实际名称,而只需按名称将TaskCreated与TaskCompleted事件相关联。
在此示例中,我使用了“之后”时间运算符。 有关其他说明,请参阅Drools Fusion文档 。
最后,这是JUnit测试代码片段:
public class TaskEventsTest extends GenericTest {
DefaultCamelContext ctx;
@Test
public void testCompleted() throws Exception {
insertAdvanceDays(new TaskCreated("Task1"), 4);
assertContains(0);
insertAdvanceDays(new TaskCompleted("Task1"), 4);
advanceDays(5);
assertContains(0);
}
@Test
public void testNotCompleted() throws Exception {
insertAdvanceDays(new TaskCreated("Task1"), 5);
assertContains(0);
advanceDays(5);
assertContains("Task1");
}
@Test
public 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");
}
@Override
protected void setUpResources(KnowledgeBuilder kbuilder) throws Exception {
kbuilder.add(new ReaderResource(new StringReader(
IOUtils.toString(getClass()
.getResourceAsStream("/stateful/task-event.drl")))),
ResourceType.DRL);
}
@Override
public 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
骆驼祥子大事件时间轴