,等待接收数据;
[0056] 通过查询"读/写"管道的状态,来完成消息中间件的读取数据主线程与消息队列 接收线程之间的同步;一旦消息队列线程接收到数据,读取数据主线程可通过查询"读"管 道文件描述符的状态变更,获悉消息队列已收到数据,从而将该数据返回给应用进程。
[0057]S5、进程发送数据接口实现:根据发送报文头中的发送进程ID以及预先配置的路 由表,判断通信发生在节点间还是节点内;根据发送报文长度,判断通信方式采用UDP还是 TCP。
[0058] 可选地,所述步骤S5包括:
[0059] 为应用进程提供数据发送接口函数,应用进程填入需要发送的数据以及发送的目 的进程ID;消息中间件根据预设的路由表和目的进程ID,查找进程ID和目的节点的匹配关 系,以获得消息发送的地址;
[0060] 判断发送的报文长度是否小于大报文数据长度门限值,如小于大报文数据长度门 限值,则判断数据发往本节点或外节点;如发往本节点,将数据发送至应用进程所述的消息 队列;如发往外节点采用IPD通信Socket发送数据;
[0061] 如果大于或等于大报文数据长度门限值,则根据发送目的进程ID和预设的路 由表,判断数据发送是否为点播,在数据发送为点播时,直接连接目的进程通过TCP通信 Socket发送数据;在数据发送为组播时,通过TCP发送线程池发送数据。
[0062] S6、TCP组播线程池的实现:根据预先配置的路由表,解析组播地址中包括的IP地 址,创建TCP发送线程池,并通过TCP发送线程池完成多地址TCP报文发送的并行处理。通 过TCP发送线程池完成多地址TCP报文发送的并行处理,可以保证数据发送的及时性。
[0063] 可选地,所述步骤S6包括:
[0064] 根据预先配置的路由表,解析组播地址中的IP地址;
[0065] 创建TCP发送线程池;
[0066] 将TCP通信Socket设置为非阻塞模式;
[0067] 连接发送目的地址,通过TCP发送线程池完成多地址TCP报文发送的并行处理。
[0068] 如图3所示,本发明实施例还提供一种轻量级跨平台消息中间件的实现系统,包 括如下模块:
[0069] 路由表配置模块10,用于配置路由表,路由表包括进程ID、IP地址、组播地址路由 关系信息,消息中间件根据路由表解析出消息转发控制规则;
[0070] 进程初始化模块20,用于初始化应用进程,创建该进程通信所需要的相关资源。
[0071] 可选地,如图4所示,所述进程初始化模块20包括如下单元:
[0072] 缓冲区初始化单元21,用于初始化进程通信所需的缓冲区及缓冲区长度;
[0073] 管道及描述符创建单元22,用于创建消息队列的"读/写"管道以及相应的文件描 述符;
[0074] 通过"读/写"管理标记消息队列接收或读取数据,将管道的文件描述符作为I/O 复用函数Select的参数;Select函数允许进程指示内核等待消息队列、UDP通信Socket、 TCP通信Socket中任意一个接收到数据,并仅在一个或多个事件发生或经过预先指定的时 间后才唤醒进程;
[0075]UDP通信Socket创建单元23,用于创建节点间短报文通信所需的UDP通信 Socket:
[0076] 分别创建UDP通信接收和发送Socket,并根据进程ID为每个进程分配唯一的端口 号,将接收Socket与接收端口号绑定;
[0077]TCP通信Socket创建单元24,用于创建节点间短报文通信所需的TCP通信 Socket:
[0078] 分别创建TCP通信接收和发送Socket,并根据进程ID为每个进程分配唯一的端口 号,将接收Socket与接收端口号绑定;
[0079]消息队列接收线程创建单元25,用于创建一个并发性线程,用于消息队列接收数 据。
[0080]消息队列接收线程模块30,用于调用消息队列接收函数,将消息队列接收线程阻 塞,如消息队列收到数据,将数据拷贝至进程专属缓冲区中,并改写消息队列"读"与"写"管 道状态;
[0081] 进程读取数据接口模块40,用于利用P0SIX库的1/0复用Select函数,轮询消息 队列"写"管道、UDP通信Socket和TCP通信Socket,如收到数据则将数据拷贝至进程专属 缓冲区中,并改写消息队列"读"与"写"管道状态。
[0082] 可选地,所述进程读取数据接口模块40包括:
[0083] 分配一个描述字集,并将描述字集初始化;
[0084] 将"读"管道文件描述符、UDP通信Socket句柄、TCP通信Socket句柄加入到描述 字集;使用Select函数轮询描述字集,等待接收数据;
[0085] 通过查询"读/写"管道的状态,来完成消息中间件的读取数据主线程与消息队列 接收线程之间的同步;一旦消息队列线程接收到数据,读取数据主线程可通过查询"读"管 道文件描述符的状态变更,获悉消息队列已收到数据,从而将该数据返回给应用进程。
[0086] 进程发送数据接口模块50,用于根据发送报文头中的发送进程ID以及预先配置 的路由表,判断通信发生在节点间还是节点内;根据发送报文长度,判断通信方式采用UDP 还是TCP。
[0087] 可选地,所述进程发送数据接口模块50包括:
[0088] 为应用进程提供数据发送接口函数,应用进程填入需要发送的数据以及发送的目 的进程ID;消息中间件根据预设的路由表和目的进程ID,查找进程ID和目的节点的匹配关 系,以获得消息发送的地址;
[0089] 判断发送的报文长度是否小于大报文数据长度门限值,如小于大报文数据长度门 限值,则判断数据发往本节点或外节点;如发往本节点,将数据发送至应用进程所述的消息 队列;如发往外节点采用IPD通信Socket发送数据;
[0090] 如果大于或等于大报文数据长度门限值,则根据发送目的进程ID和预设的路 由表,判断数据发送是否为点播,在数据发送为点播时,直接连接目的进程通过TCP通信 Socket发送数据;在数据发送为组播时,通过TCP发送线程池发送数据。
[0091] TCP组播线程池模块60,用于根据预先配置的路由表,解析组播地址中包括的IP 地址,创建TCP发送线程池,并通过TCP发送线程池完成多地址TCP报文发送的并行处理。
[0092] 可选地,所述TCP组播线程池模块60包括:
[0093] 根据预先配置的路由表,解析组播地址中的IP地址;
[0094] 创建TCP发送线程池;
[0095] 将TCP通信Socket设置为非阻塞模式;
[0096] 连接发送目的地址,通过TCP发送线程池完成多地址TCP报文发送的并行处理。
[0097] 结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执 行的软件模块,或者二者的结合来实施。软件模块可以置于随机储存器、内存、只读存储器、 电可编程R0M、电可擦除可编程R0M、寄存器、硬盘、可移动磁盘、⑶-R0M、或技术领域内所公 知的任意其他形式的存储介质中。
[0098] 可以理解的是,对于本领域的普通技术人员来说,可以根据本发明的技术构思做 出其它各种相应的改变与变形,而所有这些改变与变形都应属于本发明权利要求的保护范 围。
【主权项】
1. 一种轻量级跨平台消息中间件的实现方法,其特征在于,包括如下步骤: 51、 配置路由表,路由表包括进程ID、IP地址、组播地址路由关系信息,消息中间件根 据路由表解析出消息转发控制规则; 52、 初始化应用进程,创建该进程通信所需要的相关资源; 53、 消息队列接收线程实现:调用消息队列接收函数,将消息队列接收线程阻塞,如消 息队列收到数据,将数据拷贝至进程专属缓冲区中,并改写消息队列"读"与"写"管道状 态; 54、 进程读取数据接口实现:利用POSIX库的I/O复用Select函数,轮询消息队列"写" 管道、UDP通信Socket和TCP通信Socket,如收到数据则将数据拷贝至进程专属缓冲区中, 并改写消息队列"读"与"写"管道状态; 55、 进程发送数据接口实现:根据发送报文头