예제 #1
0
        private static List <BaseMessage> DeserializePulledMessages(BrokerGroup brokerGroup, byte[] content)
        {
            var messages = new List <BaseMessage>();

            var packet = new Packet(content, 0, content.Length);

            if (packet.IsReadable())
            {
                var pullLogOffset     = packet.ReadInt64();
                var consumerLogOffset = packet.ReadInt64();

                while (packet.IsReadable())
                {
                    var flag        = (Flag)packet.ReadByte();
                    var createdTime = packet.ReadInt64();
                    var expiredTime = packet.ReadInt64();


                    var realSubject = RetrySubjectUtils.RealSubject(packet.ReadUTF8());
                    var messageId   = packet.ReadUTF8();

                    var message = new BaseMessage(realSubject, messageId);
                    if (Flags.IsDelayMessage(flag))
                    {
                        message.SetDelayTime(DateTimeUtils.FromTime(expiredTime));
                    }
                    ReadTags(message, flag, packet);

                    var bodyLength = packet.ReadInt32();
                    var body       = new byte[bodyLength];
                    packet.Read(body, 0, bodyLength);
                    var bodyPacket = new Packet(body, 0, bodyLength);
                    try
                    {
                        while (bodyPacket.IsReadable())
                        {
                            var key   = bodyPacket.ReadUTF8();
                            var value = bodyPacket.ReadUTF8();
                            message.SetPropertyForInternal(key, value);
                        }
                    }
                    catch
                    {
                        message.SetProperty(BaseMessage.keys.qmq_corruptData, "true");
                    }

                    message.SetPropertyForInternal(BaseMessage.keys.qmq_createTime.ToString(), createdTime);
                    message.SetExpiredTime(DateTimeUtils.FromTime(expiredTime));
                    message.SetProperty(BaseMessage.keys.qmq_brokerGroupName, brokerGroup.Name);
                    message.SetProperty(BaseMessage.keys.qmq_pullOffset, pullLogOffset);
                    message.SetProperty(BaseMessage.keys.qmq_consumerOffset, consumerLogOffset);

                    messages.Add(message);
                    pullLogOffset++;
                    consumerLogOffset++;
                }
            }

            return(messages);
        }
예제 #2
0
        public Puller(string subject, string consumerGroup, bool isBroadcast, TagType tagType, string[] tags, ConsumeMode consumeMode, PullController controller, PullStrategy pullStrategy, LoadBalance loadBalance)
        {
            _subject       = subject;
            _originSubject = RetrySubjectUtils.RealSubject(_subject);
            _consumerGroup = consumerGroup;
            _isBroadcast   = isBroadcast;
            _consumeMode   = consumeMode;
            _tagType       = (_tags == null || _tags.Length == 0) ? (byte)0 : (byte)tagType;
            _tags          = tags;

            _controller = controller;

            _pullStrategy = pullStrategy;
            _loadBalance  = loadBalance;
        }
예제 #3
0
        internal DefaultPullConsumer(string subject, string group, ConsumeMode mode, bool isBroadcast, string appCode, string metaServer, TagType tagType, string[] tags)
        {
            CheckArgument(subject, group, isBroadcast);

            if (isBroadcast)
            {
                group = ClientId.CurrentUniqeConsumerGroup;
            }

            Subject       = subject;
            ConsumerGroup = group;
            ConsumeMode   = mode;
            IsBroadcast   = isBroadcast;

            _localBuffer = new ConcurrentQueue <Message>();

            _controller = new PullController(appCode, metaServer);
            var retrySubject = RetrySubjectUtils.BuildRetrySubject(subject, group);

            _pullers[0] = new Puller(retrySubject, group, isBroadcast, tagType, tags, mode, _controller, new WeightPullStrategy(), new RoundRobinLoadBalance());
            _pullers[1] = new Puller(subject, group, isBroadcast, tagType, tags, mode, _controller, new AlwaysPullStrategy(), new WeightLoadBalance());
        }