/// <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)); } } }
/// <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); } }
/// <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); }
/// <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)); } }
/// <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); }
/// <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); } }
/// <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); }