一种消息分发方法和装置的制造方法
【技术领域】
[0001] 本发明涉及计算机通信领域技术,特别涉及一种消息分发方法和装置。
【背景技术】
[0002] JMS,即JavaMessageService,Java消息服务,是Java标准化组织(JCP)开 发的一种标准(代号为JSR914),它是一个Java平台中关于面向消息中间件(MOM)的 API(ApplicationProgrammingInterface,应用程序编程接口)。JMS用于在两个应用程 序之间,或分布式系统中发送消息,进行异步通信。
[0003] JMS提供了创建、发送、接收、读取消息的服务,JMS规范下有两种基本消息模型, 即PTP(点对点)和Pub/Sub(发布/订阅)。其中,Pub/Sub模型可以定义多个消费者消费 消息,它在企业级开发中广泛采用,方便了系统间消息的传递,省去了大量开发时间以及节 省了存储消息的资源空间。
[0004] JMS的Pub/Sub模型中,消息的订阅分发通常采用基于JMSTOPIC规范来实现。JMS TOPIC规范有两种实现方式,第一种是不提供存储而直接转发消息,第二种是为每个订阅者 提供缓存队列。
[0005] 现有的基于JMS TOPIC规范的消息分发步骤如下:
[0006] 1)消息发送方创建一条消息,并将该条消息发送给TopicManager(主题管理 器);
[0007] 2)Topic Manager查询该条消息的所有订阅者;
[0008] 3)将该条消息转发给其所有订阅者;
[0009] 4)在预设时间周期后重复步骤1)~3)。
[0010] 从上述现有的消息分发步骤来看,消息的订阅者不能指定开始订阅点,JMSTOPIC 规范只支持订阅者被动接收实时消息,不支持订阅者对历史消息的订阅。同时,对于订阅者 来说,消息的获得并不支持断点续传,当订阅者连接超时或者中断,并重新连接后,不能进 行断点续传,从上次成功订阅消息的时间点继续订阅消息。另外,JMSTOPIC规范也不支持 消息的核对,对于消息一致性要求很高的业务场景(例如财务数据,订单数据等)需要周期 性核对消息,而现有的JMSTOPIC规范不支持历史消息的查阅,因此无法核对历史消息的一 致性,当出现消息不一致的情况时也难以核查。
[0011] 另外,虽然上述JMSTOPIC规范的两种实现方式中的后一种为每个订阅者提供了 缓存,但受限于缓存队列的深度,无法保证消息不丢失,同时因为针对每个订阅者分别提供 缓存,进而同时存储了多份消息拷贝,进而造成了对存储资源的浪费。
【发明内容】
[0012] 有鉴于此,本发明提供一种消息分发方法和装置,以实现订阅消息的持久化和消 息订阅的记录功能,进而为消息订阅者提供可订阅消息范围的查询、订阅、以及断点续传等 服务。
[0013] 本发明的技术方案是这样实现的:
[0014] -种消息分发方法,包括:
[0015] 接收消息生产者所创建的消息,并将所接收的消息写入消息数据库;
[0016] 获取消息订阅者的消息订阅范围,根据所述消息订阅范围确定所述消息数据库中 的起始消息订阅点;
[0017] 从所述起始消息订阅点开始,将所述消息订阅者的消息订阅范围内的各条消息分 发给所述消息订阅者。
[0018] 进一步,将所接收的消息写入消息数据库时,在所述消息数据库中同时记录写入 消息时的时间值和写入的消息的顺序值。
[0019] 进一步,根据所述消息订阅范围确定所述消息数据库中的起始消息订阅点包括:
[0020] 根据所述消息订阅范围,在所述消息数据库中确定所述消息订阅范围内的最早写 入的消息,并将其作为所述起始消息订阅点。
[0021] 进一步,从所述起始消息订阅点开始,将所述消息订阅者的消息订阅范围内的各 条消息分发给所述消息订阅者,包括:
[0022] 依据所述时间值和顺序值,将所述消息订阅者的消息订阅范围内的各条消息逐条 分发给所述消息订阅者。
[0023] 进一步,在将所述消息订阅者的消息订阅范围内的各条消息逐条分发给所述消息 订阅者的同时,将所分发的各条消息的时间值和顺序值同时发送给所述消息订阅者;
[0024] 当连接中断或者所述消息订阅者所接收的消息丢失时,将最近一次成功分发的消 息作为新的起始消息订阅点,并从所述新的起始消息订阅点开始,将所述消息订阅者的消 息订阅范围内尚未分发的各条消息分发给所述消息订阅者。
[0025] 进一步,若消息订阅者的消息订阅范围的最晚时间晚于当前时间,且当所述消息 数据库中的所有消息订阅范围内的消息全部分发给所述消息订阅者时,等待消息数据库中 写入新消息,并将写入的新消息分发给消息订阅者。
[0026] 进一步,当所述消息数据库的存储容量不足时,依据所述时间值和顺序值,逐条删 除最早写入所述消息数据库的消息。
[0027] 进一步,所述方法还包括:
[0028] 设置清理周期,在每个清理周期中,依据所述时间值和顺序值,逐条删除最早写入 所述消息数据库的消息。
[0029] 进一步,所述方法还包括:
[0030] 设置所述消息数据库的数据量阈值,所述数据量阈值小于所述消息数据库的存储 容量;
[0031] 在删除最早写入所述消息数据库的消息时,当所述消息数据库的数据量降到所述 数据量阈值时,停止继续对所述消息数据库中消息的删除。
[0032] 一种消息分发装置,包括:
[0033]消息接收模块,用于接收消息生产者所创建的消息,并将所接收的消息写入消息 数据库;
[0034] 消息订阅模块,用于获取消息订阅者的消息订阅范围,根据所述消息订阅范围确 定所述消息数据库中的起始消息订阅点;
[0035] 消息分发模块,用于从所述起始消息订阅点开始,将所述消息订阅者的消息订阅 范围内的各条消息分发给所述消息订阅者;以及,
[0036] 消息数据库,用于存储所述消息。
[0037]进一步,所述消息接收模块,还用于将所接收的消息写入消息数据库时,在所述消 息数据库中同时记录写入消息时的时间值和写入的消息的顺序值。
[0038]进一步,所述消息订阅模块根据所述消息订阅范围,在所述消息数据库中确定所 述消息订阅范围内的最早写入的消息,并将其作为所述起始消息订阅点。
[0039]进一步,所述消息分发模块依据所述时间值和顺序值,将所述消息订阅者的消息 订阅范围内的各条消息逐条分发给所述消息订阅者。
[0040]进一步,在将所述消息订阅者的消息订阅范围内的各条消息逐条分发给所述消息 订阅者的同时,所述消息分发模块将所分发的各条消息的时间值和顺序值同时发送给所述 消息订阅者;
[0041] 当连接中断或者所述消息订阅者所接收的消息丢失时:
[0042]所述消息订阅模块将最近一次成功分发的消息作为新的起始消息订阅点;