美文网首页
common模块阅读11: MessageExt

common模块阅读11: MessageExt

作者: 赤子心_d709 | 来源:发表于2017-09-27 19:35 被阅读366次

    说明

    消息拓展类,源码中大部分字段的set方法可以参考 MessageDecoder.decode(java.nio.ByteBuffer, boolean, boolean, boolean)的实现

    字段

        private int queueId;//队列id
    
        private int storeSize;//整个存储空间,包含TOTALSIZE,MAGICCODE,BODYCRC等
    
        private long queueOffset;//逻辑队列长度
        private int sysFlag;//参考MessageSysFlag类
        private long bornTimestamp;//消息产生的时间
        private SocketAddress bornHost;//消息产生的来源host
    
        private long storeTimestamp;//存放消息的时间(不是写入mappedFile的时间)
        private SocketAddress storeHost;//存放消息的host
        private String msgId;//消息id
        private long commitLogOffset;//物理偏移
        private int bodyCRC;//CRC验证
        private int reconsumeTimes;//消费次数(又称为重试的次数)
    
        private long preparedTransactionOffset;//这个不知道有什么用,似乎不是0就是commitLogOffset,事务?
    

    这里不展开调用的逻辑,说明:

    preparedTransactionOffset暂时不知道有什么用,看代码没看明白

    方法

    大部分get,set不讲

    parseTopicFilterType方法,判断tag是MULTI_TAG还是SINGLE_TAG

        /**
         * 看是 MULTI_TAG 还是 SINGLE_TAG
         */
        public static TopicFilterType parseTopicFilterType(final int sysFlag) {
            if ((sysFlag & MessageSysFlag.MULTI_TAGS_FLAG) == MessageSysFlag.MULTI_TAGS_FLAG) {
                return TopicFilterType.MULTI_TAG;
            }
    
            return TopicFilterType.SINGLE_TAG;
        }
    

    socketAddress2ByteBuffer方法,用于将socket地址写入byteBuffer

        public static TopicFilterType parseTopicFilterType(final int sysFlag) {
            if ((sysFlag & MessageSysFlag.MULTI_TAGS_FLAG) == MessageSysFlag.MULTI_TAGS_FLAG) {
                return TopicFilterType.MULTI_TAG;
            }
    
            return TopicFilterType.SINGLE_TAG;
        }
    
        public static ByteBuffer socketAddress2ByteBuffer(final SocketAddress socketAddress, final ByteBuffer byteBuffer) {
            InetSocketAddress inetSocketAddress = (InetSocketAddress) socketAddress;
            byteBuffer.put(inetSocketAddress.getAddress().getAddress(), 0, 4);
            byteBuffer.putInt(inetSocketAddress.getPort());
            byteBuffer.flip();
            return byteBuffer;
        }
    

    问题

    sysFlag,reconsumeTimes,preparedTransactionOffset在具体保存逻辑中的用处

    涉及tag,重试,最后preparedTransactionOffset还不知道是干吗的

    refer

    http://www.jianshu.com/p/790d6bc4a1c1 reconsumeTimes意义

    相关文章

      网友评论

          本文标题:common模块阅读11: MessageExt

          本文链接:https://www.haomeiwen.com/subject/kztpextx.html