Java Mq和Native Mq之间的关系

简介: Java Mq和Native Mq之间的关系

相关名词

mq:消息队列MessageQuene的缩写

流程

java的mq初始化的时候会先初始化native的mq再native的mq中又创建了native层的looper。同时native层把自己mq传入到了java中mq的mptr对象

java消息队列中调用nativepollonce(javaMq中的next方法)最终会调用到mtpr的nativepollonce(mtpr是native层的消息队列对象)该方法用于等待一个java层的消息来临

native的mq的nativepollonce会调用looper的pollonce方法(这个looper是native层的)

pollonce方法中会取出responce(其他监听的fd来的request封装的)处理

接着会调用pollinner。

pollinner才是真正决定是否有消息处理的地方

pollinner中会等待pipe唤醒(代表有消息来了需要处理),唤醒之后查看是否是消息来还是其他fd发出的request。

之后

取出管道的事件进行处理,先处理native的消息。

fd发出的request:对其封装成一个response。添加到mresponse数组中。

等待native消息处理完后再取出response数组处理监听fd得到的事件。

最后返回java的消息回到java的nativepollonce方法中。

java和native中都是利用handler发消息,都是调用的管道流进行唤醒。

java层的next会调用nativepollonce进入到native的消息队列中,native层looper的pollinner实现阻塞。(唤醒可能是由于消息或者fd发生request)。

为fd的request创建对应response添加到response数组中,等待native的消息处理完,在处理request,接着返回到java的消息。java的mq恢复处理。

注意点

根据上面的分析流程我们可以知道,即使CPU充足堆栈情况正常也不能一定保证java发出的消息可以按计划得到执行。这个时候很有可能是native在处理自己的消息或者在native中对监听到的fd做处理,最后才会轮到java中的消息处理。nativePollonce才因此返回进入java消息处理过程。

mq为什么采用epoll机制?

select和epoll机制区别:

1.关于监听fd的复制次数

select每次调用都需要将监听的事件复制到内核中。而epoll只需要在epllctl进行加入操作时才复制一份

2.效率问题

epoll使用红黑树保存监听事件,而select内部使用数组存储(监听事件数量有限10个)。当监听事件变得多时select效率没有epoll好,但是当事件少时两者查找效率差不多

epoll和pipe区别

epoll等待监听事件触发。等待监听的fd和对应接受的动作

使用pipe用于唤醒,使用pipe用作线程间通信的原因是因为:写端发送的数据读端不感兴趣,只做简单的唤醒,无需对数据处理,因此使用pipe读端不关心数据只起到唤醒作用


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
30天前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
5月前
|
网络协议 JavaScript 前端开发
Java一分钟之-GraalVM Native Image:构建原生可执行文件
【6月更文挑战第13天】GraalVM Native Image是Java开发的创新技术,它将应用编译成独立的原生可执行文件,实现快速启动和低内存消耗,对微服务、桌面应用和嵌入式系统有重大影响。本文讨论了如何使用Native Image,包括常见挑战如反射与动态类加载、静态初始化问题和依赖冲突,并提供了解决方案和代码示例。通过合理规划和利用GraalVM工具,开发者可以克服这些问题,充分利用Native Image提升应用性能。
240 5
|
1月前
|
消息中间件 存储 JSON
rabbitmq基础教程(ui,java,springamqp)
本文提供了RabbitMQ的基础教程,包括如何使用UI创建队列和交换机、Java代码操作RabbitMQ、Spring AMQP进行消息发送和接收,以及如何使用不同的交换机类型(fanout、direct、topic)进行消息路由。
22 0
rabbitmq基础教程(ui,java,springamqp)
|
1月前
|
消息中间件 前端开发 Java
java高并发场景RabbitMQ的使用
java高并发场景RabbitMQ的使用
81 0
|
2月前
|
消息中间件 缓存 Java
RocketMQ的JAVA落地实战
RocketMQ作为一款高性能、高可靠、高实时、分布式特点的消息中间件,其核心作用主要体现在异步处理、削峰填谷以及系统解耦三个方面。
168 0
|
3月前
|
Java
MQTT(EMQX) - Java 调用 MQTT Demo 代码
MQTT(EMQX) - Java 调用 MQTT Demo 代码
151 0
MQTT(EMQX) - Java 调用 MQTT Demo 代码
|
4月前
|
消息中间件 Java Maven
如何在Java中使用RabbitMQ
如何在Java中使用RabbitMQ
|
5月前
|
消息中间件 Java
Java一分钟之-RabbitMQ:AMQP协议实现
【6月更文挑战第11天】RabbitMQ是基于AMQP协议的开源消息队列服务,支持多种消息模式。本文介绍了RabbitMQ的核心概念:生产者、消费者、交换器、队列和绑定,以及常见问题和解决方案。例如,通过设置消息持久化和确认机制防止消息丢失,配置死信队列处理不可消费消息,以及妥善管理资源防止泄漏。还提供了Java代码示例,帮助读者理解和使用RabbitMQ。通过理解这些基础和最佳实践,可以提升RabbitMQ在分布式系统中的可靠性和效率。
125 0
Java一分钟之-RabbitMQ:AMQP协议实现
|
4月前
|
消息中间件 负载均衡 Java
JAVA面试之MQ
JAVA面试之MQ
69 0
|
4月前
|
消息中间件 Java Maven
如何在Java中使用RabbitMQ
如何在Java中使用RabbitMQ