一种消息处理方法及系统 【技术领域】
本发明涉及通信技术领域, 特别是涉及一种消息处理方法。背景技术 中间件是一种独立的系统软件或服务程序, 分布式应用软件借助这种软件在不同 的技术之间共享资源。中间件运行于客户机或服务器的操作系统上, 管理计算机资源和网 络通讯, 连接两个或两个以上独立运行的应用程序或独立的系统。被连接的系统或应用程 序通过中间件交换信息, 协同工作。 消息中间件是中间件的一种, 它通过支持应用之间的消 息队列、 格式化信息和文件的传输来实现应用之间的连接。消息中间件利用高效可靠的消 息传递机制进行平台无关的数据交流, 并基于数据通信来进行分布式系统的集成。通过提 供消息传递和消息排队模型, 它可以在分布式环境下扩展进程间的通信。
对于消息中间件, 需要按照消息的优先级来处理得到的消息, 以保证紧急的消息 优先处理。 一般的, 消息中间件可以支持消息队列, 并且以多线程的方式对队列中的消息进
行处理, 也就是说, 消息中间件可以一次性提取队列中的多个消息, 由多个处理线程分别对 所提取的多个消息进行处理。
中间件根据消息的优先级提取消息, 保证了优先级高的消息先被提取, 但是, 在多 线程处理中, 由于处理线程本身的运行是由操作系统调度的, 具有不确定性, 如果具有低优 先级消息的处理线程比具有高优先级消息的处理线程先运行, 将导致具有高优先级紧急消 息无法及时处理。 发明内容
为解决上述技术问题, 本发明实施例提供一种消息处理方法, 以实现严格按照消 息的用户优先级处理消息, 技术方案如下 :
一种消息处理方法, 包括 :
接收待处理的消息 ;
根据消息中携带的用户优先级信息, 为消息设置队列优先级 ; 其中, 为消息设置的 队列优先级的初始值等于该消息的用户优先级的值 ;
按照所设置的队列优先级, 将消息添加到消息队列中 ;
为消息队列中的消息分配处理线程, 并根据消息的用户优先级为相应的处理线程 设置对应的操作系统调度优先级。
其中, 所述根据消息的用户优先级为相应的处理线程设置对应的操作系统调度优 先级, 具体为 :
根据预先建立的操作系统调度优先级与消息用户优先级的映射关系为相应的处 理线程设置对应的操作系统调度优先级。
其中, 在将消息添加到消息队列之后, 还包括 :
根据消息的接收时刻, 对具有相同队列优先级的多个消息的队列位置进行排序 ;其中, 将接收时刻较早的消息排在接收时刻较晚的消息之前。
其中, 还包括 :
为消息队列中等待时间超过预设阈值的消息提升队列优先级 ;
对提升队列优先级的消息的等待时间进行初始化 ;
根据提升后的队列优先级调整该消息的队列位置。
其中, 所述为消息队列中等待时间超过预设阈值的消息提升队列优先级, 包括 :
为消息队列中等待时间超过预设阈值、 且队列优先级不高于预设上限的消息提升 队列优先级。
相应的, 本发明还提供一种与方法相对应的消息处理系统, 该系统包括 :
接收单元, 用于接收待处理的消息 ;
队列优先级设置单元, 用于根据接收单元接收的消息中携带的用户优先级信息, 为消息设置队列优先级 ; 其中, 为消息设置的队列优先级的初始值等于该消息的用户优先 级的值 ;
第一排队单元, 用于按照所述队列优先级设置单元设置的队列优先级, 将消息添 加到消息队列中 ;
消息分配单元, 用于为消息队列中的消息分配处理线程, 并根据消息的用户优先 级为相应的处理线程设置对应的操作系统调度优先级。
其中, 所述消息分配单元, 用于为消息队列中的消息分配处理线程, 并根据预先建 立的操作系统调度优先级与消息用户优先级的映射关系为相应的处理线程设置对应的操 作系统调度优先级。
其中, 还包括 :
第二排队单元, 用于根据消息的接收时刻, 对具有相同队列优先级的多个消息的 队列位置进行排序, 其中, 将接收时刻较早的消息排在接收时刻较晚的消息之前。
其中, 还包括 :
队列优先级提升单元, 用于为消息队列中等待时间超过预设阈值的消息提升队列 优先级 ;
等待时间初始化单元, 用于对提升队列优先级的该消息的等待时间进行初始化。
其中, 所述队列优先级提升单元, 用于为消息队列中等待时间超过预设阈值、 且队 列优先级不高于预设上限的消息提升队列优先级。
由以上本发明实施例提供的技术方案可见, 与现有技术相比, 在多线程处理中, 为 消息设置用户优先级和队列优先级的同时, 根据消息的用户优先级为处理线程设置对应的 操作系统调度优先级。由于操作系统具有按调度优先级调度处理线程的能力, 所以操作系 统调用处理线程不再是不确定的, 调度优先级高的处理线程优先接受操作系统的调用。这 样使得分配到用户优先级较高的消息的处理线程优先运行, 以此实现严格按照消息的用户 优先级处理消息。 附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案, 下面将对实施例或现 有技术描述中所需要使用的附图作简单地介绍, 显而易见地, 下面描述中的附图仅仅是本发明中记载的一些实施例, 对于本领域普通技术人员来讲, 还可以根据这些附图获得其他 的附图。
图 1 为本发明实施例所提供的消息处理方法的流程图 ;
图 2 为本发明实施例所提供的消息处理方法的第二种流程图 ;
图 3 为本发明实施例所提供的消息处理方法的第三种流程图 ;
图 4 为本发明实施例所提供的消息处理系统的结构示意图 ;
图 5 为本发明实施例所提供的消息处理系统的第二种结构示意图 ;
图 6 为本发明实施例所提供的消息处理系统的第三种结构示意图。 具体实施方式
为了使本技术领域的人员更好地理解本发明中的技术方案, 下面将结合本发明实 施例中的附图, 对本发明实施例中的技术方案进行清楚、 完整地描述, 显然, 所描述的实施 例仅仅是本发明一部分实施例, 而不是全部的实施例。 基于本发明中的实施例, 本领域普通 技术人员所获得的所有其他实施例, 都应当属于本发明保护的范围。
如图 1 所示, 本发明提供了一种消息处理方法, 该方法包括 : S101 : 接收待处理的消息 ;
用户根据需要为每个需要处理的消息设置用户优先级, 以此区分紧急消息与非紧 急消息。消息中间件接收用户提交的每个待处理的消息。
S102 : 根据消息中携带的用户优先级信息, 为消息设置队列优先级 ; 其中, 为消息 设置的队列优先级的初始值等于该消息的用户优先级的值 ;
为了将待处理的消息按照优先级顺序添加到预先设置好的消息队列中, 所以根据 待处理的消息所携带的用户优先级为消息设置队列优先级。 所述消息队列为带优先级的队 列。这些待处理的消息队列优先级的初始值设置为该消息的用户优先级。同时, 记录每个 待处理消息进入消息中间件的进入时间。
S103 : 按照所设置的队列优先级, 将消息添加到消息队列中 ;
根据待处理的消息的队列优先级将消息添加到消息队列中。 按照队列优先级从高 到低的顺序将待处理的消息从消息队列头排列到消息队列尾, 也就是队列优先级高的消息 添加到消息队列头部, 队列优先级低的消息排列到消息队列尾部。
其中, 在多个待处理的消息具有相同队列优先级的情况下, 可以随机排列这些消 息之间的顺序。
在本发明实施例的一种优选实施方式中, 对于多个具有相同队列优先级的待处理 的消息, 根据消息进入消息中间件的时间进行排序, 将进入时间较早的待处理的消息排列 在进入时间较晚的待处理的消息之前, 使得进入较早的待处理的消息优先于进入时间较晚 的相同队列优先级的消息被提取。
S104 : 为消息队列中的消息分配处理线程, 并根据消息的用户优先级为相应的处 理线程设置对应的操作系统调度优先级。
在多线程处理中, 多个处理线程可以同时提取多个待处理的消息。所以为消息队 列中的队列优先级较高的多个待处理的消息同时分配多个处理线程, 也就是说, 当为空闲 的处理线程分配待处理的消息时, 从消息队列头提取与空闲的处理线程个数相同的待处理
的消息, 以此实现将多个队列优先级较高的待处理消息分配给多个处理线程。并且处理线 程按照所分配到的待处理的消息的用户优先级设置其自身的操作系统调度优先级, 使具有 较高用户优先级的消息的处理线程具有较高的调度优先级。 操作系统具有识别调度优先级 的能力, 所以操作系统对处理线程的调度不再是不确定的, 而是根据处理线程的所设置的 操作系统调度优先级来进行调度, 为处理线程分配 CPU 资源, 这样可使用户优先级较高消 息的处理线程先于用户优先级较低消息的处理线程运行, 保证紧急消息的优先处理, 达到 了严格按照消息的用户优先级来处理消息的效果。
本发明的方法实施例中, 在多线程处理中, 为消息设置用户优先级和队列优先级 的同时, 根据消息的用户优先级为处理线程设置对应的操作系统调度优先级。由于操作系 统具有按调度优先级调度处理线程的能力, 所以操作系统调用处理线程不再是不确定的。 调度优先级高的处理线程优先接受操作系统的调用, 这样使得分配到用户优先级较高的消 息的处理线程优先运行, 以此实现严格按照消息的用户优先级处理消息。
需要说明的是, 常用的操作系统都具有按调度优先级调度进程或线程的能力, 只 是操作系统定义的调度优先级可能与消息的用户优先级是两套不同的优先级规则。 所以优 选地, 消息中间件需要预先将操作系统所能识别的调度优先级与消息的用户优先级建立一 定的映射关系, 较高的调度优先级与较高的用户优先级相对应, 较低的调度优先级与较低 的用户优先级相对应, 使处理线程能够根据消息的用户优先级设置为操作系统所能识别的 调度优先级, 保证操作系统能够识别处理线程的调度优先级。 进一步的, 当有新的消息进入消息中间件时, 整个消息队列的待处理的消息会按 照队列优先级重新排列。 当为处理线程分配待处理的消息时, 队列优先级高的消息被提取。 因为时刻有新的待处理的消息被添加到消息队列中, 这些新添加的消息的队列优先级如果 较高, 则会被优先处理, 而处于等待状态的队列优先级较低的消息只能继续等待。 在实际应 用中, 在经过一段时间后, 队列优先级较低的消息会变得紧急, 需要及时被处理, 所以为了 兼顾这些队列优先级较低的消息, 如图 2 所示, 本发明实施例所提供的消息处理方法在步 骤 S103 之后, 还可以进一步包括 :
S201 : 判断消息队列中待处理的消息的等待时间是否超过预设的时间阈值, 如果 否, 则该消息继续等待, 不对其做操作, 如果是, 则进入步骤 S202 ;
消息中间件实时检测消息队列中的待处理的消息的等待时间, 所述等待时间由消 息对应的特定的计时器从消息进入中间件的时间开始记录。 当消息中间件检测到消息队列 中待处理消息中存在等待时间超过预设时间阈值时, 则执行步骤 S202 ; 若检测的结果是不 存在等待时间超过预设的时间阈值的待处理的消息时, 则不对消息做任何操作。
S202 : 为该待处理的消息提升队列优先级 ;
当消息中间件检测到消息队列中存在等待时间超过预设的时间阈值的待处理消 息时, 则会提升该待处理的消息的队列优先级。
S203 : 对提升队列优先级的消息的等待时间进行初始化 ;
提升该待处理的消息的队列优先级后, 需要将该消息的等待时间进行初始化, 即 将该消息的进入时间修改为提升队列优先级的时间, 并将该消息对应的计时器的时间初始 化为零。
S204 : 根据提升后的队列优先级调整该消息的队列位置。
按照队列优先级的顺序调整提升后的待处理的消息在消息队列中的位置。优选 地, 相同队列优先级的待处理消息进入时间早的排列在进入时间较晚的待处理消息之前。
本实施例所提供的方案, 为等待时间较长的待处理消息提升队列优先级, 防止了 用户优先级较低的消息等待时间过长。此外, 为了保证更高用户优先级的待处理的消息得 到优先处理, 仅为那些等待时间超过预设时间阈值并且队列优先级不高于预设上限的待处 理的消息提升队列优先级, 而对那些队列优先级已经超过预设上限的消息将不再提升其队 列优先级。这样既保证了等待时间较长的用户优先级较低的待处理消息可以被及时提取, 又为用户优先级较高的待处理的消息的处理留出资源。
为了使本技术领域的人员更好地理解本发明方案, 下面结合具体实施例和附图对 本发明作进一步的详细说明。
消息中间件将消息的用户优先级定义为 0-9 级, 数值越大, 优先级越高。用户根据 需要将消息 a、 消息 b、 消息 c、 消息 d 的用户优先级依次定义为 3 级、 4 级、 5 级、 6 级, 以此区 分各个消息的紧急程度。
如图 3 所示, 本发明所述方法包括 :
S301 : 接收用户提交的待处理消息 a、 消息 b、 消息 c、 消息 d ; 消息中间件接收用户提交的待处理的消息 a、 消息 b、 消息 c、 消息 d。
S302 : 根据各个消息中携带的用户优先级信息, 为各个消息设置队列优先级, 队列 优先级的初始值为各个消息的用户优先级 ;
消息中间件根据消息 a 的用户优先级设置消息 a 的队列优先级为 3, 类似的, 依次 设置消息 b 的队列优先级为 4, 消息 c 的队列优先级为 5, 消息 d 的队列优先级为 6。同时记 录各个消息进入消息中间件的时间。
S303 : 按照所设置的队列优先级, 将各个消息添加到消息队列中合适的位置 ;
假设消息队列中存在的待处理的消息为消息 e、 消息 f、 消息 g, 消息 e 的队列优先 级和用户优先级都为 5, 消息 f 的队列优先级和用户优先级都为 7、 消息 g 的队列优先级和 用户优先级都为 8。在消息 a、 消息 b、 消息 c、 消息 d 添加到消息队列时, 对于相同队列优先 级的消息则将进入时间较早的待处理的消息排列在进入时间较晚的待处理的消息之前, 所 以按照各个消息的队列优先级将所有消息进行排序, 排序结果如下 :
消息 队列优先级 用户优先级
g 8 8
f 7 7
d 6 6
e 5 5
c 5 5
b 4 4
a 3 3
其中, 对于消息 e 和消息 c 具有相同的队列优先级, 但消息 e 进入消息中间件的时 间早于消息 c, 所以, 优选地, 将消息 e 排列在消息 c 之前。
S304 : 为消息队列中的各个待处理消息分配处理线程, 并根据预先建立的操作系 统调度优先级与消息用户优先级的映射关系为处理线程设置相对应的操作系统调度优先
级。 假设操作系统存在三个空闲的处理线程可提供给消息中间件, 这三个处理线程为 处理线程 1、 处理线程 2、 处理线程 3。 消息中间件为这三个处理线程分配消息队列中的队列 优先级较高的三个待处理的消息, 分配结果如下 :
处理线程 消息 用户优先级
1 g 8
2 f 7
3 d 6
当然各个处理线程所分配到的待处理的消息并不一定为上述所示, 只要保证一个 空闲处理线程分配到一个待处理的消息即可。
本实施例中, 所述的操作系统为 Windows 操作系统, 它的任务调度以线程为单位 进行, 线程拥有 33 个调度优先级, 数值为 0-32, 其中 0 为最低调度优先级, 32 为最高调度优 先级, 最低调度优先级和最高调度优先级均保留给系统使用。其余的调度优先级可供用户 使用。由于操作系统的调度优先级与消息的用户优先级是不同的优先级规则, 所以消息中 间件预先将操作系统调度优先级与消息的用户优先级建立映射关系, 如下 :
[0, 1]、 [1, 4]、 [2, 7]、 [3, 10]、 [4, 13]、 [5, 16]、 [6, 19]、 [7, 22]、 [8, 25]、 [9, 28]。
其中, [x, y] 中的 x 表示消息的用户优先级, y 表示操作系统的调度优先级。处理 线程根据消息的用户优先级可设置为操作系统可识别的调度优先级。这样, 操作系统就可 以识别出处理线程的调度优先级, 并按照调度优先级来调度处理线程。
由上可知, 处理线程 1、 处理线程 2、 处理线程 3 的调度优先级依次为 25、 22、 19。 所 以, 三个处理线程的分配结果以及调度优先级, 表示如下 :
处理线程 消息 用户优先级 调度优先级
1 g 8 25
2 f 7 22
3 d 6 19
本实施例中, 操作系统按照处理线程的设置的调度优先级依次调用并运行处理线 程 1、 处理线程 2、 处理线程 3, 这样保证了具有较高用户优先级的待处理消息 g 先于具有较 低用户优先级的待处理的消息 f 和消息 d 运行。
当然, 上述操作系统的调度优先级与消息的用户优先级的映射关系仅仅是一种方 式, 只要保证较高的用户优先级与较高的调度优先级相映射, 还可以根据消息用户优先级 的实际情况, 建立其他的映射关系。例如, 当用户优先级定义为 0-30 时, 0 级表示用户优先 级最低, 30 级表示用户优先级最高。 此时, 建立操作系统的调度优先级与消息用户优先级的 映射关系时, 可以进行如下映射 :
[0, 1]、 [1, 2]、 [2, 3]、 [3, 4]、 [4, 5]、 [6, 7]......[29, 30]、 [30, 31]。
其中, [x, y] 中的 x 表示消息的用户优先级, y 表示操作系统的调度优先级。
本发明所述的实施例中, 操作系统的调度优先级与消息的用户优先级是两套不同 的优先级规则, 所以, 需要将调度优先级与消息的用户优先级建立一定的映射关系。 可以理 解的是, 当操作系统调度优先级与消息的用户优先级是同一套优先级规则时, 则不需要建 立映射关系, 操作系统便可以识别处理线程的调度优先级。
可以理解的是, 当处理线程运行完毕, 处于空闲状态时, 消息中间件可以继续提取 消息队列中的待处理消息, 然后将所提取的待处理的消息分配给处于空闲状态的处理线 程。
消息中间件会实时检测所有待处理消息的等待时间, 当等待时间超过预设的时间 阈值时, 则会提升超过时间阈值的待处理的消息的队列优先级。当检测到待处理的消息 e 的等待时间超过预设的时间阈值时, 即消息 e 已经在消息队列中等待很久, 仍然处于等待 状态, 未被执行, 则消息中间件会为消息 e 提升队列优先级, 将其队列优先级提升至 6, 改变 其在消息队列中的位置, 使消息 e 尽快分配给处理线程。并且, 将消息 e 的进入时间修改为 提升队列优先级的时间, 将消息 e 对应的计时器初始化为零。由此可见, 为等待时间过久的 消息提升队列优先级, 可以提高等待时间过久的用户优先级较低消息被及时提取的几率, 避免用户优先级较低的待处理的消息无限制的等待。
当然, 本实施例中将等待时间过久的待处理消息的队列优先级提升一级, 并不代 表当提升队列优先级时, 只能够提升一级, 可根据实际情况, 为需要提升队列优先级的消息 提升二级, 甚至多级。
需要说明的是, 为了优先处理那些用户优先级较高的消息, 所以当为等待时间过 久的用户优先级较低的消息提升队列优先值时有一个上限值, 当待处理的消息的队列优先 级达到上限值时, 不再为其提升队列优先级。在本实施例中定义的优先级为 0-9 级, 所以上 限值可以设置为 7 级, 即等待时间过久的用户优先级较低的消息的队列优先级最高提升至 7 级, 当达到 7 级时, 不再为其提升队列优先级。这样既兼顾了等待时间久的用户优先级较 低的待处理的消息, 又保证了用户优先级较高的消息得到及时处理。 相应于上面的方法实施例, 本发明还提供一种消息处理系统, 如图 4 所示, 所述消 息处理系统包括 :
接收单元 01, 用于接收待处理的消息 ;
队列优先级设置单元 02, 用于根据接收单元 01 接收的消息中携带的用户优先级 信息, 为消息设置队列优先级 ; 其中, 所述队列优先级的初始值为用户优先级的值 ;
第一排队单元 03, 用于按照队列优先级设置单元 02 设置的队列优先级, 将消息添 加到消息队列中 ;
消息分配单元 04, 用于为消息队列中的消息分配处理线程, 并根据消息的用户优 先级为相应的处理线程设置对应的操作系统调度优先级。
操作系统中的任务调度程序则会按照消息分配单元 04 中定义的处理线程的调度 优先级来运行各个处理线程。
对于操作系统的调度优先级与消息的用户优先级为两套不同的优先级规则时, 所 述消息分配单元 04, 用于为消息队列中的消息分配处理线程, 并根据预先建立的操作系统 调度优先级与消息用户优先级建立的映射关系为处理线程设置对应的操作系统调度优先 级。
对于处理具有相同队列优先级的消息的排序, 如图 5 所示, 本系统还包括 :
第二排队单元 05, 用于根据消息的接收时刻, 对具有相同队列优先级的多个消息 的队列位置进行排序, 其中, 将接收时刻较早的消息排在接收时刻较晚的消息之前。
为了兼顾那些等待时间很久, 用户优先级较低的待处理消息, 如图 6 所示, 本系统
还包括 :
队列优先级提升单元 06, 用于为消息队列中等待时间超过预设阈值的消息提升队 列优先级 ;
等待时间初始化单元 07, 用于对提升队列优先级的该消息的等待时间进行初始 化。
为了既保证用户优先级较高的待处理的消息得到及时处理, 同时又兼顾等待时间 很久的用户优先级较低的待处理的消息, 这样队列优先级提升单元 06 则用于为消息队列 中等待时间超过预设阈值、 且队列优先级不高于预设上限的待处理消息提升队列优先级。
为了描述的方便, 描述以上系统时以功能分为各种单元分别描述。 当然, 在实施本 发明时可以把各单元的功能在同一个或多个软件和 / 或硬件中实现。
本说明书中的各个实施例均采用递进的方式描述, 各个实施例之间相同相似的部 分互相参见即可, 每个实施例重点说明的都是与其他实施例的不同之处。 尤其, 对于系统实 施例而言, 由于其基本相似于方法实施例, 所以描述得比较简单, 相关之处参见方法实施例 的部分说明即可。以上所描述的系统实施例仅仅是示意性的, 其中所述作为分离部件说明 的单元可以是或者也可以不是物理上分开的, 作为单元显示的部件可以是或者也可以不是 物理单元, 即可以位于一个地方, 或者也可以分布到多个网络单元上。 可以根据实际的需要 选择其中的部分或者全部模块来实现本实施例方案的目的。 本领域普通技术人员在不付出 创造性劳动的情况下, 即可以理解并实施。 以上所述仅是本发明的具体实施方式, 应当指出, 对于本技术领域的普通技术人 员来说, 在不脱离本发明原理的前提下, 还可以做出若干改进和润饰, 这些改进和润饰也应 视为本发明的保护范围。