2021SC@SDUSC
一、写在前面
本篇源码学习重点在分析ROS的消息队列机制,消息队列作为一个中间件,能够起到应用解耦、消息异步传送和流量削峰的作用,ROS中的消息队列也是基于这种思想,为了优化一些数据传递过程而产生的.
二、LazyMessage
public class LazyMessage<T> {
private final ChannelBuffer buffer;
private final MessageDeserializer<T> deserializer;
private final Object mutex;
private T message;
public LazyMessage(ChannelBuffer buffer, MessageDeserializer<T> deserializer) {
this.buffer = buffer;
this.deserializer = deserializer;
mutex = new Object();
}
@VisibleForTesting
LazyMessage(T message) {
this(null, null);
this.message = message;
}
public T get() {
synchronized (mutex) {
if (message != null) {
return message;
}
message = deserializer.deserialize(buffer);
}
return message;
}
}
LazyMessage为消息队列中传递的消息,能够通过延迟解码消息起到节省内存并提高运行速度的效果.
LazyMessage有三个私有常变量,ChannelBuffer为消息字节流的缓存区,为JBoss netty中的类,MessageDeserializer为消息的解码器,用于在第一次访问信息时解码消息.mutex为用于互斥访问的锁对象.
LazyMessage的构造方法接收两个参数,分别为字节流缓存与解码器,在构造方法中用参数初始化对应的私有常变量,同时新建互斥锁对象.另一个构造方法接收一个泛型对象,其类型与本LazyMessage接收的数据类型相同,在构造方法中使用这个对象为私有常变量message赋值.
访问message数据使用的是get方法,get方法在取得锁对象mutex后进入synchronized代码块,接着判断message对象是否为空,如果不为空则直接将其返回

本文深入分析ROS中的消息队列机制,重点探讨LazyMessage的延迟解码特性和MessageReceiver如何监听并缓存消息。LazyMessage通过延迟解码节省内存和提高运行效率,MessageReceiver使用环形阻塞队列安全地存储消息,确保线程安全和性能优化。

4265

被折叠的 条评论
为什么被折叠?



