Exemple #1
0
        public Message(TData payload, DeliveryInfo deliveryInfo, Ack ack, Nack nack)
        {
            Payload      = payload ?? throw new ArgumentNullException(nameof(payload));
            DeliveryInfo = deliveryInfo ?? throw new ArgumentNullException(nameof(deliveryInfo));

            this.ack  = ack ?? throw new ArgumentNullException(nameof(ack));
            this.nack = nack ?? throw new ArgumentNullException(nameof(nack));
        }
        public SerializedPayload NewNack(Guid messageId)
        {
            var payload = new Nack
            {
                Id = messageId
            };

            return(_serializer.Serialize(payload));
        }
Exemple #3
0
        private void OnMessageNack(Guid clientId, Nack nack)
        {
            _logger.LogInformation($"Nack received for message with id: {nack.Id} from client: {clientId}");

            if (_clientStore.TryGet(clientId, out var client))
            {
                client.OnPayloadNackReceived(nack.Id);
            }
        }
        public void Serialization_NackMatchResults()
        {
            var nack = new Nack {
                Id = Guid.NewGuid()
            };

            var b = _serializer.Serialize(nack);

            var result = _deserializer.ToNack(b.DataWithoutSize);

            Assert.Equal(nack.Id, result.Id);
        }
        public SerializedPayload Serialize(Nack ack)
        {
            var binaryWriter = ObjectPool.Shared.Rent <BinaryProtocolWriter>();

            try
            {
                return(binaryWriter
                       .WriteType(PayloadType.Nack)
                       .WriteId(ack.Id)
                       .ToSerializedPayload());
            }
            finally
            {
                ObjectPool.Shared.Return(binaryWriter);
            }
        }
Exemple #6
0
 /// <summary>
 /// Оповестить брокер о результате обработки.
 /// </summary>
 /// <param name="acknowledgement">Данные о результате обработки.</param>
 /// <param name="channel">Канал.</param>
 /// <param name="messageContext">Контекст сообщения.</param>
 /// <param name="settings">Настройки очереди.</param>
 public Task HandleAsync <TMessage>(
     Acknowledgement acknowledgement,
     IModel channel,
     MessageContext messageContext,
     SubscriberSettings settings
     ) where TMessage : class, IMessage
 {
     return(acknowledgement switch
     {
         Ack _ => HandleAck(channel, messageContext, settings),
         Reject reject => HandleRejectAsync <TMessage>(reject, channel, messageContext, settings),
         Nack nack => HandleNackAsync <TMessage>(nack, channel, messageContext, settings),
         Retry retry => HandleRetryAsync <TMessage>(retry, channel, messageContext, settings),
         _ => throw new ArgumentOutOfRangeException(
             nameof(acknowledgement),
             typeof(Acknowledgement),
             "Передан неизвестный подтип Acknowledgement."
             )
     });
Exemple #7
0
        public void OnUpdate()
        {
            if (this.LastUpdateTime < 0)
            {
                this.Disconnect("timedout");
                return;
            }

            if (this.ACKQueue.Count > 0)
            {
                Ack        pk  = new Ack();
                List <int> pks = new List <int>();
                foreach (KeyValuePair <int, int> kv in this.ACKQueue.ToArray())
                {
                    pks.Add(kv.Value);
                }

                pks.Sort();

                pk.Packets = pks.ToArray();
                this.SendPacket(pk);

                this.ACKQueue.Clear();
            }

            if (this.NACKQueue.Count > 0)
            {
                Nack       pk  = new Nack();
                List <int> pks = new List <int>();
                foreach (KeyValuePair <int, int> kv in this.NACKQueue.ToArray())
                {
                    pks.Add(kv.Value);
                }

                pks.Sort();

                pk.Packets = pks.ToArray();
                this.SendPacket(pk);

                this.NACKQueue.Clear();
            }

            if (this.ResendQueue.Count > 0)
            {
                for (int i = 0; i < this.ResendQueue.Count; ++i)
                {
                    DataPacket pk;
                    this.ResendQueue.TryDequeue(out pk);
                    pk.SeqNumber = this.LastSendSeqNumber++;
                    this.SendPacket(pk);

                    Logger.Debug("%server.network.dataPacket.resend");
                }
            }

            if (this.SendedPacket.Count > 0)
            {
                foreach (DataPacket pk in this.SendedPacket.Values)
                {
                    if (pk.SendTimedOut < 0)
                    {
                        DataPacket remove;
                        this.ResendQueue.Enqueue(pk);
                        this.SendedPacket.TryRemove(pk.SeqNumber, out remove);
                    }

                    --pk.SendTimedOut;
                }
            }

            if (this.LastPingTime < 0)
            {
                OnlinePing ping = new OnlinePing();
                ping.PingID = DateTime.Now.Ticks;

                this.QueueConnectedPacket(ping, RakNetPacketReliability.UNRELIABLE, -1, RakNetProtocol.FlagImmediate);
            }

            this.SendQueuePacket();

            --this.LastPingTime;
            --this.LastUpdateTime;
        }
Exemple #8
0
 internal WithNackElse(Nack nk, Else xE) : base(xE.pk)
 {
     this.nk = nk;
     this.xE = xE;
 }
Exemple #9
0
 protected virtual void HandleNack(Nack nack, IModel channel, BasicDeliverEventArgs deliveryArgs)
 {
     channel.BasicNack(deliveryArgs.DeliveryTag, false, nack.Requeue);
 }