首页 > 其他分享 >什么是事件传递优先级?

什么是事件传递优先级?

时间:2024-09-23 19:24:41浏览次数:9  
标签:SBB 优先级 处理 CallEndEvent 传递 事件 event

在 JAIN SLEE 中,事件传递优先级(Event Delivery Priority) 决定了多个事件到达时,SBB 实体应该以什么顺序来处理这些事件。SLEE 是一个基于事件驱动的架构,多个事件可能会同时触发,因此需要一种机制来控制事件的处理顺序,确保关键事件优先被处理。事件传递优先级可以通过编程配置、事件类型的定义以及运行时的动态调整来实现。

事件传递优先级的配置方式

  1. 事件类型(Event Type)配置
    在 JAIN SLEE 中,每个事件都有一个特定的事件类型,而事件类型通常通过 XML 文件进行配置,称为 event type descriptor。事件类型描述符可以为事件指定优先级。

    示例:

    <event-type>
        <event-type-name>MyEvent</event-type-name>
        <event-type-vendor>com.example</event-type-vendor>
        <event-type-version>1.0</event-type-version>
        <initial-event-selectivity>Low</initial-event-selectivity> 
        <priority>4</priority> <!-- 设置事件的优先级,数值越大优先级越高 -->
    </event-type>
    

    在上面的例子中,<priority> 元素定义了事件的优先级。数值越大,表示优先级越高。在此例中,MyEvent 事件的优先级为 4,其他优先级低于 4 的事件将会在它之后被处理。

  2. SBB 实体处理优先级
    在某些情况下,SBB 实体可以动态改变事件处理的优先级。通过 SleeEndpoint 接口,开发人员可以在代码中设定事件的优先级。

    例如:

    public class MySbb implements Sbb {
        // SLEE 管理器接口,允许对事件处理进行动态控制
        private SleeEndpoint sleeEndpoint;
    
        public void onEvent(FireableEventType event, ActivityContextInterface aci) {
            // 获取当前事件的优先级
            int currentPriority = sleeEndpoint.getEventPriority(event);
            
            // 如果事件优先级较低,提升其优先级
            if (currentPriority < 5) {
                sleeEndpoint.setEventPriority(event, 5);
            }
        }
    }
    

    在这个例子中,SleeEndpoint 提供了 getEventPriority()setEventPriority() 方法,用于获取和动态调整事件的优先级。这样可以在某些业务逻辑下根据特定条件提升事件的优先级。

事件传递优先级的实现原理

在 JAIN SLEE 中,事件的传递和处理是基于事件队列的,每个活动上下文(Activity Context)都会维护一个事件队列。事件在到达 SBB 实体之前,会被放入相应的队列中。事件传递优先级 决定了事件在队列中的处理顺序。具有较高优先级的事件将被优先出队并交给 SBB 实体进行处理。

  • 队列排序:SLEE 框架会根据事件的优先级对队列中的事件进行排序。具有较高优先级的事件会在较低优先级的事件之前被处理。

  • 多事件的情况:如果多个事件同时触发,SLEE 会先检查它们的优先级,然后按照从高到低的顺序将它们出队并传递给对应的 SBB 实体。

示例:使用事件优先级控制事件处理

假设有一个电信服务,它处理两个不同类型的事件:CallStartEvent(呼叫开始事件)和 CallEndEvent(呼叫结束事件)。我们希望确保在系统中,无论有多少事件,CallEndEvent 始终优先于 CallStartEvent 被处理。

  1. 事件类型定义(XML 配置):

    <!-- CallStartEvent 定义,优先级为 3 -->
    <event-type>
        <event-type-name>CallStartEvent</event-type-name>
        <event-type-vendor>com.example</event-type-vendor>
        <event-type-version>1.0</event-type-version>
        <priority>3</priority> 
    </event-type>
    
    <!-- CallEndEvent 定义,优先级为 5 -->
    <event-type>
        <event-type-name>CallEndEvent</event-type-name>
        <event-type-vendor>com.example</event-type-vendor>
        <event-type-version>1.0</event-type-version>
        <priority>5</priority> 
    </event-type>
    

    在这个配置中,我们定义了两个事件,CallStartEvent 的优先级是 3,而 CallEndEvent 的优先级是 5。因此,当系统同时接收到这两个事件时,CallEndEvent 会先于 CallStartEvent 被处理。

  2. SBB 实体处理事件

    public class CallHandlerSbb implements Sbb {
        // 处理呼叫开始事件
        public void onCallStartEvent(CallStartEvent event, ActivityContextInterface aci) {
            System.out.println("Handling Call Start Event");
            // 处理呼叫开始的逻辑
        }
    
        // 处理呼叫结束事件
        public void onCallEndEvent(CallEndEvent event, ActivityContextInterface aci) {
            System.out.println("Handling Call End Event");
            // 处理呼叫结束的逻辑
        }
    }
    

    在这个 SBB 实现中,onCallStartEvent 处理呼叫开始事件,onCallEndEvent 处理呼叫结束事件。由于我们在事件类型中配置了优先级,当系统接收到这两个事件时,会先处理优先级更高的 CallEndEvent,然后处理 CallStartEvent

动态调整优先级的场景

在某些业务场景中,事件的优先级可能需要动态调整。例如,当某个系统状态发生变化时,我们希望提升某些类型事件的优先级。SBB 实体可以通过 SleeEndpoint 动态控制事件的优先级。

示例场景:如果一个电话呼叫接近超时,系统可以提升 CallEndEvent 的优先级以确保它优先处理。

public class DynamicPrioritySbb implements Sbb {
    private SleeEndpoint sleeEndpoint;

    public void onCallStartEvent(CallStartEvent event, ActivityContextInterface aci) {
        // 动态提升 CallEndEvent 的优先级
        sleeEndpoint.setEventPriority(event, 6);
    }

    public void onCallEndEvent(CallEndEvent event, ActivityContextInterface aci) {
        System.out.println("Handling Call End Event with dynamic priority");
    }
}

总结

  • 事件传递优先级 决定了在多个事件同时到达时,SBB 实体应该优先处理哪些事件。优先级通过事件类型描述符配置,数值越大优先级越高。
  • SLEE 框架根据优先级在事件队列中进行排序,确保高优先级事件优先被处理。
  • 可以通过 XML 配置优先级,也可以在运行时通过 SleeEndpoint 动态调整事件的优先级。

标签:SBB,优先级,处理,CallEndEvent,传递,事件,event
From: https://blog.csdn.net/pumpkin84514/article/details/142437782

相关文章

  • MySQL零基础入门教程-3 条件查询、模糊查询、条件关键字和其优先级关系,基础+实战
    教程来源:B站视频BV1Vy4y1z7EX001-数据库概述_哔哩哔哩_bilibili我听课收集整理的课程的完整笔记,供大家学习交流下载:夸克网盘分享本文内容为完整笔记的第三篇 14、条件查询&模糊查询P19-2514.1什么是条件查询?不是将表中所有数据都查出来。是查询出来符合条件的条件查询需要用到whe......
  • 【Web APIs day02 事件绑定处理和事件对象、网页交互】
    WebAPIs-第二天笔记掌握事件绑定处理和事件对象,完成常见网页交互事件监听事件类型事件对象拓展知识综合案例事件监听以前写的代码都是自动执行的,我们希望一段代码在某个特定的时机才去执行,比如点击按钮可以弹出警示框比如鼠标经过显示下拉菜单等等事件事件是程......
  • 【理论篇】关于聚合根,领域事件的那点事---深入浅出理解DDD
    前言最近有空会跟同事讨论DDD架构的实践落地的情况,但真实情况是,实际中对于领域驱动设计中的实体,值对象,聚合根,领域事件这些战术类的实践落地,每个人理解依然因人而异,大概率是因为这些概念还是有一些抽象,同时有有别于传统的MVC架构开发。在此,通过小demo的方式跟大家分享一下我对DDD......
  • 基于nodejs+vue校内突发事件预警系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着教育事业的快速发展和校园规模的不断扩大,校园安全问题日益凸显,尤其是突发事件的频繁发生,给学校管理和师生安全带来了严峻挑战。近年来,从自然灾害到公共......
  • fastapi-events fastapi 异步事件分发处理扩展
    fastapi-eventsfastapi异步事件分发处理扩展,提供了本地,以及远程消息处理能力,同时包含了一些内置的handler,对于自定义handler也是比较灵活的参考使用app.pyfromfastapiimportFastAPIfromfastapi.requestsimportRequestfromfastapi.responsesimportJSONResponsefrom......
  • windows10事件代码1074自动重启进程 C:\WINDOWS\system32\svchost.exe用户 NT AUTH
    PSC:\WINDOWS\system32>Get-Eventlog-LogNameSystem-Source"User32"-Newest1|Where-Object{$_.EventID-eq1074}|fl*EventID:1074MachineName:DESKTOP-4COHMG5Data:{}Index:5515......
  • ABBAC900F学习笔记330:用户权限管理、登陆注销事件记录
    某浪博客又抽风了,莫名其妙的将访问量清零了,这是赶人走的意思吧?我把那边的内容搬到这里吧,万一哪天那边关张了,辛辛苦苦的学习笔记就没了。原博客地址:ABBAC900F学习笔记330:用户权限管理、登陆注销事件记录_来自金沙江的小鱼_新浪博客(sina.com.cn)现场有几套ABBAC900F控制系统,使......
  • C语言函数的形参传递
    在C语言中,函数形参的传递分为值传递和地址传递(指针传递)。这两种传递方式决定了函数内如何使用这些参数,并且在函数外部的影响也不同。下面详细解释C语言中形参的传递机制和具体内容。1.值传递在C语言中,默认的传递方式是值传递。当我们调用一个函数时,函数的形参接收......
  • 如何在Java后端中实现事件驱动架构:从事件总线到事件溯源
    如何在Java后端中实现事件驱动架构:从事件总线到事件溯源大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代软件架构中,事件驱动架构(EDA)已经成为提高系统解耦性、可伸缩性和响应性的热门选择。本文将详细探讨如何在Java后端实现事件驱动架构,包括事件......
  • 防止泄密,应该做到哪些?分享4个防范泄密事件发生的有效措施
    防止泄密,应该做到哪些?时至今日,诺大的企业如同一个庞大的数据生态系统,蕴含着无数的商业秘密、客户资料以及核心技术。然而,数据泄密事件频发,给企业的安全带来了巨大威胁。“未雨绸缪,毋临渴而掘井”,快来查收这份防泄密小锦囊吧!一、加强物理安全防护物理安全是防止泄密的第一道......