Skip to content

Message edit and retry does not work if the message has been retried once before #4837

@jpalac

Description

@jpalac

Describe the bug

Description

If a message is retried but fails, and then it's retried a second time using the Edit & retry functionality ServiceControl returns a value cannot be an empty string or composed entirely of whitespace error.

Expected behavior

Message is retried successfully at the originating endpoint if the endpoint is able to process the message.

Actual behavior

An error is returned from ServiceControl: System.ArgumentException: The value cannot be an empty string or composed entirely of whitespace. (Parameter 'destination')

Versions

6.2.1+

Steps to reproduce

This was tested using the RabbitMQ transport.

  • Send a message to a handler and have it fail
  • Retry the message from ServicePulse - have the message fail again
  • Update the handler to no longer fail the message
  • Retry the message in ServicePulse via the Retry & edit functionality

Observe the returned error from ServiceControl

Relevant log output

System.ArgumentException: The value cannot be an empty string or composed entirely of whitespace. (Parameter 'destination')
   at System.ArgumentException.ThrowNullOrWhiteSpaceException(String argument, String paramName)
   at NServiceBus.Routing.UnicastAddressTag..ctor(String destination) in /_/src/NServiceBus.Core/Routing/UnicastAddressTag.cs:line 16
   at NServiceBus.Routing.UnicastRoutingStrategy.Apply(Dictionary`2 headers) in /_/src/NServiceBus.Core/Routing/UnicastRoutingStrategy.cs:line 24
   at NServiceBus.RoutingContextExtensions.ToTransportOperation(IRoutingContext context, RoutingStrategy strategy, DispatchConsistency dispatchConsistency, Boolean copySharedMutableMessageState) in /_/src/NServiceBus.Core/Pipeline/Outgoing/RoutingContextExtensions.cs:line 16
   at NServiceBus.RoutingToDispatchConnector.Invoke(IRoutingContext context, Func`2 stage) in /_/src/NServiceBus.Core/Pipeline/Outgoing/RoutingToDispatchConnector.cs:line 33
   at NServiceBus.AttachSenderRelatedInfoOnMessageBehavior.Invoke(IRoutingContext context, Func`2 next) in /_/src/NServiceBus.Core/Pipeline/Outgoing/AttachSenderRelatedInfoOnMessageBehavior.cs:line 45
   at NServiceBus.Pipeline.Behavior`1.<>c__DisplayClass0_0.<Invoke>b__0() in /_/src/NServiceBus.Core/Pipeline/Behavior.cs:line 24
   at NServiceBus.NativeMessageCustomizationBehavior.Invoke(IRoutingContext context, Func`1 next) in /_/src/Transport/Sending/NativeMessageCustomizationBehavior.cs:line 24
   at NServiceBus.Pipeline.Behavior`1.Invoke(TContext context, Func`2 next) in /_/src/NServiceBus.Core/Pipeline/Behavior.cs:line 24
   at NServiceBus.Pipeline`1.Invoke(TContext context) in /_/src/NServiceBus.Core/Pipeline/Pipeline.cs:line 49
   at NServiceBus.PipelineInvocationExtensions.InvokePipeline[TContext](TContext context) in /_/src/NServiceBus.Core/Pipeline/PipelineInvocationExtensions.cs:line 10
   at NServiceBus.ForkExtensions.Fork[TFromContext,TToContext,TForkContext](IForkConnector`3 forkConnector, TForkContext context) in /_/src/NServiceBus.Core/Pipeline/ForkExtensions.cs:line 15
   at NServiceBus.RetryAcknowledgementBehavior.<>c__DisplayClass2_0.<<Invoke>g__ConfirmSuccessfulRetry|0>d.MoveNext() in /_/src/NServiceBus.Core/ServicePlatform/Retries/RetryAcknowledgementBehavior.cs:line 44
--- End of stack trace from previous location ---
   at NServiceBus.RetryAcknowledgementBehavior.Invoke(ITransportReceiveContext context, Func`2 next) in /_/src/NServiceBus.Core/ServicePlatform/Retries/RetryAcknowledgementBehavior.cs:line 29
   at NServiceBus.MainPipelineExecutor.Invoke(MessageContext messageContext, CancellationToken cancellationToken) in /_/src/NServiceBus.Core/Pipeline/MainPipelineExecutor.cs:line 50
   at NServiceBus.MainPipelineExecutor.Invoke(MessageContext messageContext, CancellationToken cancellationToken) in /_/src/NServiceBus.Core/Pipeline/MainPipelineExecutor.cs:line 78
   at NServiceBus.Transport.RabbitMQ.MessagePump.Process(AsyncEventingBasicConsumer consumer, BasicDeliverEventArgs message, CancellationToken messageProcessingCancellationToken) in /_/src/NServiceBus.Transport.RabbitMQ/Receiving/MessagePump.cs:line 414

Additional Information

This is being caused by the ServiceControl.Retry.AcknowledgementQueue header being cleared and seems to be introduced by this PR in the 6.2.1 release.

Workarounds

Possible solutions

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions