骆驼iptv_骆驼中的事件处理

news/2024/7/19 13:24:10 标签: java, python, javascript, js, flink
骆驼iptv

骆驼iptv

在上一篇有关骆驼-小水车的帖子中,我介绍了骆驼-小水车的组件,并使用骆驼路线中的规则实现了一些简单的面向任务的过程。 今天,我将展示如何通过添加事件处理来扩展此示例。

那么如何描述一个事件呢? 每个事件在某个时间发生并持续一段时间,事件以特定顺序发生。 然后我们有了一个“事件云”,我们要从中识别那些事件,这些事件形成了一些有趣的关联。 在这里,Drools的用法变得合理了-我们不必对每个事件都做出React,只需描述规则集和那些有趣的关联的后果。 Drools引擎将找到它们并触发匹配规则。

假设我们的系统必须监视分配给用户的任务的执行。 创建任务后,用户有10天的时间完成任务。 如果他不这样做,则应发送剩余的电子邮件。

规则定义如下所示:

java">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(当用户完成任务时)。 我们通过'name'属性将两者关联起来。 首先,我们需要通过添加@role(event)和@expires批注将模型类声明为事件。 然后我们描述规则:“当TaskCreated事件10天后没有TaskCompleted事件时,将任务名称发送到direct:escalation路线”。 同样,这可能是声明式编程的示例–我们不必指定任务的实际名称,而只需按名称将TaskCreated与TaskCompleted事件相关联。

在此示例中,我使用了“之后”时间运算符。 有关其他说明,请参阅Drools Fusion文档。

最后,这是JUnit测试代码片段:

java">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);
    }
}
  • 您可以在此处找到此示例的源代码。
参考:来自我们的JCG合作伙伴Piotr Jagielski在全栈JVM开发中的骆驼事件中的事件处理…博客。

翻译自: https://www.javacodegeeks.com/2014/03/event-processing-in-camel-drools.html

骆驼iptv


http://www.niftyadmin.cn/n/1707944.html

相关文章

c语言函数多线程,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统,C语言实现多线程:#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦,参数是:%s\n" , (char *)threadArg );return …

javafx 塔防游戏_JavaFX中的塔防(5)

javafx 塔防游戏这是有关使用FXGameEngine在JavaFX中创建塔防游戏的本教程的第5部分。 敌人现在飞向目标的攻击路径,炮塔瞄准并射击。 因此,最重要的部分在那里,但是仍然缺少许多细节。 游戏只是开始,没有给我们准备下一个浪潮的机…

外部中断_用Java可外部化

外部中断在理解Externalizable接口之前,您需要了解序列化。您可以在java中的序列化上阅读有关序列化的更多信息。 Java提供了一种称为序列化的机制,以按字节的有序或字节序列的形式持久化Java对象,其中包括对象的数据以及有关对象类型和存储在…

kafka streams_使用Java 8 Streams进行编程对算法性能的影响

kafka streams多年来,使用Java进行多范式编程已经成为可能,它支持混合的面向服务,面向对象和面向方面的编程。 带有lambda和java.util.stream.Stream类的Java 8是个好消息,因为它使我们可以将功能性编程范例添加到混合中。 确实&a…

Android属于绑定服务特点是,Android P HIDL服务绑定模式与直通模式的分析 (原创)

从Android 8.0之后,Android 引入Treble机制,主要是为了解决目前Android 版本之间升级麻烦的问题,将OEM适配的部分vendor与google 对android 大框架升级的部分system部分做了分离,一旦适配了一个版本的vendor信息之后,…

lucene搜索引擎_在崩溃或断电后测试Lucene的索引耐久性

lucene搜索引擎Lucene有用的事务功能之一就是索引持久性,它可以确保一旦成功调用IndexWriter.commit ,即使操作系统或JVM崩溃或断电,或者您杀死-KILL JVM进程,在重新启动后,索引也将保持完整(未损坏),并将反…

spring_跟踪异常–第4部分– Spring的邮件发件人

spring如果您阅读过本系列以前的任何博客,您可能会记得我正在开发一个小型但几乎具有工业实力的应用程序,该应用程序在日志文件中搜索异常。 您可能还记得,我现在有一个可以包含大量结果的类,这些结果需要发送给感兴趣的任何人。 …

java安装_Java中的三态布尔值

java安装我不时地错过Java中SQL的三值BOOLEAN语义。 在SQL中,我们有: TRUE FALSE UNKNOWN (也称为NULL ) 时不时地,我希望自己也可以用Java来表达这种UNKNOWN或UNINITIALISED语义,而普通的true和false还不够。 实现一个ResultS…