예제 #1
0
        /// <summary>
        /// Receives the next transport message or null if none is available. Can block if it wants to, just respect the <paramref name="cancellationToken"/>
        /// </summary>
        public override async Task<TransportMessage> Receive(ITransactionContext context, CancellationToken cancellationToken)
        {
            if (amqpReceiver == null) return null;

            AmqpLite.Message msg = await amqpReceiver.ReceiveAsync(TimeSpan.FromSeconds(0.5));

            if (msg == null) return null;

            if (!(msg.Properties?.AbsoluteExpiryTime != DateTime.MinValue && msg.Properties?.AbsoluteExpiryTime.ToUniversalTime() > DateTime.Now.ToUniversalTime())) return null;
            
            context.OnCompleted(async ctx =>
            {
                amqpReceiver.Accept(msg);
            });

            context.OnAborted(async ctx =>
            {
                amqpReceiver.Modify(msg, true);
            });

            context.OnDisposed(async ctx =>
            {
                //amqpReceiver.Close();
            });


            var result = new TransportMessage(GetHeaders(msg), GetBytes(msg.Body.ToString()));

            return result;
        }