ROS源码学习 十三、消息队列

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

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对象是否为空,如果不为空则直接将其返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值