コード例 #1
0
        /// <inheritdoc />
        public RemoveMessageStatus Remove(IMessageId id, RemoveMessageReason reason)
        {
            var header = _getHeader.GetHeaders(id);

            if (header != null)
            {
                var spanContext = header.Extract(_tracer, _headers);
                if (spanContext != null)
                {
                    using (IScope scope = _tracer.BuildSpan("Remove").AddReference(References.FollowsFrom, spanContext).StartActive(finishSpanOnDispose: true))
                    {
                        scope.Span.SetTag("RemovedBecause", reason.ToString());
                        return(_handler.Remove(id, reason));
                    }
                }
                else
                {
                    using (IScope scope = _tracer.BuildSpan("Remove").StartActive(finishSpanOnDispose: true))
                    {
                        scope.Span.AddMessageIdTag(id);
                        scope.Span.SetTag("RemovedBecause", reason.ToString());
                        return(_handler.Remove(id, reason));
                    }
                }
            }
            else
            {
                using (IScope scope = _tracer.BuildSpan("Remove").StartActive(finishSpanOnDispose: true))
                {
                    scope.Span.AddMessageIdTag(id);
                    scope.Span.SetTag("RemovedBecause", reason.ToString());
                    return(_handler.Remove(id, reason));
                }
            }
        }
コード例 #2
0
 /// <summary>
 /// Commits the processed message, by deleting the message
 /// </summary>
 /// <param name="context">The context.</param>
 public void Commit(IMessageContext context)
 {
     if (context != null)
     {
         _removeMessage.Remove(context.MessageId, RemoveMessageReason.Complete);
     }
 }
コード例 #3
0
        /// <inheritdoc />
        public long ClearMessages(CancellationToken cancelToken)
        {
            if (string.IsNullOrWhiteSpace(_connectionInfo?.ConnectionString))
            {
                return(0);
            }

            var messages = _findErrorMessagesQueryHandler.Handle(new FindErrorMessagesToDeleteQuery(cancelToken));
            var count    = 0;

            foreach (var message in messages)
            {
                if (cancelToken.IsCancellationRequested)
                {
                    break;
                }

                var status = _removeMessage.Remove(new MessageQueueId(message), RemoveMessageReason.Error);
                if (status == RemoveMessageStatus.Removed)
                {
                    count++;
                }
            }
            return(count);
        }
コード例 #4
0
        /// <inheritdoc />
        public RemoveMessageStatus Remove(IMessageId id, RemoveMessageReason reason)
        {
            var header = _getHeader.GetHeaders(id);

            if (header != null)
            {
                var activityContext = header.Extract(_tracer, _headers);
                using (var scope = _tracer.StartActivity("Remove", ActivityKind.Internal, parentContext: activityContext))
                {
                    scope?.AddMessageIdTag(id);
                    scope?.SetTag("RemovedBecause", reason.ToString());
                    return(_handler.Remove(id, reason));
                }
            }
            using (var scope = _tracer.StartActivity("Remove"))
            {
                scope?.AddMessageIdTag(id);
                scope?.SetTag("RemovedBecause", reason.ToString());
                return(_handler.Remove(id, reason));
            }
        }
コード例 #5
0
 /// <summary>
 /// Deletes the job based on the job name.
 /// </summary>
 /// <param name="name">The name.</param>
 protected override void DeleteJob(string name)
 {
     _removeMessage.Remove(new MessageQueueId(_getJobId.Handle(new GetJobIdQuery(name))), RemoveMessageReason.Error);
 }
コード例 #6
0
        /// <inheritdoc />
        public RedisMessage Handle(ReceiveMessageQuery query)
        {
            byte[] message = null;
            byte[] headers = null;
            string messageId;
            var    poisonMessage = false;
            RedisQueueCorrelationIdSerialized correlationId = null;

            try
            {
                var          unixTimestamp = _unixTimeFactory.Create().GetCurrentUnixTimestampMilliseconds();
                RedisValue[] result        = _dequeueLua.Execute(unixTimestamp);

                if (result == null || result.Length == 1 && !result[0].HasValue || !result[0].HasValue)
                {
                    return(null);
                }

                if (!result[1].HasValue)
                {
                    //at this point, the record has been de-queued, but it can't be processed.
                    poisonMessage = true;
                }

                messageId = result[0];
                var id = new RedisQueueId(messageId);
                query.MessageContext.SetMessageAndHeaders(id, null);
                if (!poisonMessage)
                {
                    message = result[1];
                    headers = result[2];
                    if (result[3].HasValue)
                    {
                        if (result[3].TryParse(out long messageExpiration))
                        {
                            if (messageExpiration - unixTimestamp < 0)
                            {
                                //message has expired
                                var allHeaders = _serializer.InternalSerializer.ConvertBytesTo <IDictionary <string, object> >(headers);
                                query.MessageContext.SetMessageAndHeaders(id, new ReadOnlyDictionary <string, object>(allHeaders));
                                _removeMessage.Remove(query.MessageContext, RemoveMessageReason.Expired);
                                return(new RedisMessage(messageId, null, true));
                            }
                        }
                    }
                }
            }
            catch (Exception error)
            {
                throw new ReceiveMessageException("Failed to dequeue a message", error);
            }

            if (poisonMessage)
            {
                //at this point, the record has been de-queued, but it can't be processed.
                throw new PoisonMessageException(
                          "An error has occurred trying to re-assemble a message de-queued from Redis; a messageId was returned, but the LUA script returned a null message. The message payload has most likely been lost.", null,
                          new RedisQueueId(messageId), new RedisQueueCorrelationId(Guid.Empty),
                          null, null);
            }

            try
            {
                var allHeaders = _serializer.InternalSerializer.ConvertBytesTo <IDictionary <string, object> > (headers);
                correlationId = (RedisQueueCorrelationIdSerialized)allHeaders[_redisHeaders.CorrelationId.Name];
                var messageGraph = (MessageInterceptorsGraph)allHeaders[_redisHeaders.Headers.StandardHeaders.MessageInterceptorGraph.Name];
                var messageData  = _serializer.Serializer.BytesToMessage <MessageBody>(message, messageGraph, allHeaders);

                var newMessage = _messageFactory.Create(messageData.Body, allHeaders);
                query.MessageContext.SetMessageAndHeaders(query.MessageContext.MessageId, new ReadOnlyDictionary <string, object>(allHeaders));

                return(new RedisMessage(
                           messageId,
                           _receivedMessageFactory.Create(
                               newMessage,
                               new RedisQueueId(messageId),
                               new RedisQueueCorrelationId(correlationId.Id)), false));
            }
            catch (Exception error)
            {
                //at this point, the record has been de-queued, but it can't be processed.
                throw new PoisonMessageException(
                          "An error has occurred trying to re-assemble a message de-queued from redis", error,
                          new RedisQueueId(messageId), new RedisQueueCorrelationId(correlationId),
                          message, headers);
            }
        }
コード例 #7
0
 /// <summary>
 /// Commits the processed message, by deleting the message
 /// </summary>
 /// <param name="context">The context.</param>
 public void Commit(IMessageContext context)
 {
     _removeMessage.Remove(context, RemoveMessageReason.Complete);
 }