@@ -137,18 +137,23 @@ private Task ServiceBusSessionProcessor_SessionClosingAsync(ProcessSessionEventA
137
137
}
138
138
139
139
private Task ServiceBusSessionProcessor_ProcessMessageAsync ( ProcessSessionMessageEventArgs args )
140
- => ProcessMessageAsyncInternal ( args . Message , args . CompleteMessageAsync , args . AbandonMessageAsync , args . CancellationToken ) ;
140
+ => ProcessMessageAsyncInternal ( args . Message , args . CompleteMessageAsync , args . AbandonMessageAsync , args . DeadLetterMessageAsync , args . CancellationToken ) ;
141
141
142
142
private Task ServiceBusSessionProcessor_ProcessErrorAsync ( ProcessErrorEventArgs args )
143
143
=> ProcessErrorAsyncInternal ( args . Exception , args . ErrorSource ) ;
144
144
145
145
protected Task ServiceBusProcessor_ProcessMessagesAsync ( ProcessMessageEventArgs args )
146
- => ProcessMessageAsyncInternal ( args . Message , args . CompleteMessageAsync , args . AbandonMessageAsync , args . CancellationToken ) ;
146
+ => ProcessMessageAsyncInternal ( args . Message , args . CompleteMessageAsync , args . AbandonMessageAsync , args . DeadLetterMessageAsync , args . CancellationToken ) ;
147
147
148
148
protected Task ServiceBusProcessor_ProcessErrorAsync ( ProcessErrorEventArgs args )
149
149
=> ProcessErrorAsyncInternal ( args . Exception , args . ErrorSource ) ;
150
150
151
- protected async Task ProcessMessageAsyncInternal ( ServiceBusReceivedMessage message , Func < ServiceBusReceivedMessage , CancellationToken , Task > completeMessage , Func < ServiceBusReceivedMessage , IDictionary < string , object > , CancellationToken , Task > abandonMessage , CancellationToken token )
151
+ protected async Task ProcessMessageAsyncInternal (
152
+ ServiceBusReceivedMessage message ,
153
+ Func < ServiceBusReceivedMessage , CancellationToken , Task > completeMessage ,
154
+ Func < ServiceBusReceivedMessage , IDictionary < string , object > , CancellationToken , Task > abandonMessage ,
155
+ Func < ServiceBusReceivedMessage , string , string , CancellationToken , Task > deadLetterMessage ,
156
+ CancellationToken token )
152
157
{
153
158
// Process the message.
154
159
Logger . LogDebug ( "Received message - Path: {Path}, SubscriptionName: {SubscriptionName}, SequenceNumber: {SequenceNumber}, DeliveryCount: {DeliveryCount}, MessageId: {MessageId}" , TopicSubscription . Path , TopicSubscription . SubscriptionName , message . SequenceNumber , message . DeliveryCount , message . MessageId ) ;
@@ -160,29 +165,38 @@ protected async Task ProcessMessageAsyncInternal(ServiceBusReceivedMessage messa
160
165
// to avoid unnecessary exceptions.
161
166
Logger . LogDebug ( "Abandon message - Path: {Path}, SubscriptionName: {SubscriptionName}, SequenceNumber: {SequenceNumber}, DeliveryCount: {DeliveryCount}, MessageId: {MessageId}" , TopicSubscription . Path , TopicSubscription . SubscriptionName , message . SequenceNumber , message . DeliveryCount , message . MessageId ) ;
162
167
await abandonMessage ( message , null , token ) . ConfigureAwait ( false ) ;
163
-
164
168
return ;
165
169
}
166
170
167
171
var r = await MessageProcessor . ProcessMessage ( message , message . ApplicationProperties , cancellationToken : token ) . ConfigureAwait ( false ) ;
168
- if ( r . Exception != null )
172
+ switch ( r . Result )
169
173
{
170
- Logger . LogError ( r . Exception , "Abandon message (exception occurred while processing) - Path: {Path}, SubscriptionName: {SubscriptionName}, SequenceNumber: {SequenceNumber}, DeliveryCount: {DeliveryCount}, MessageId: {MessageId}" , TopicSubscription . Path , TopicSubscription . SubscriptionName , message . SequenceNumber , message . DeliveryCount , message . MessageId ) ;
171
-
172
- var messageProperties = new Dictionary < string , object >
173
- {
174
- // Set the exception message
175
- [ "SMB.Exception" ] = r . Exception . Message
176
- } ;
177
- await abandonMessage ( message , messageProperties , token ) . ConfigureAwait ( false ) ;
178
-
179
- return ;
174
+ case ProcessResult . Success :
175
+ // Complete the message so that it is not received again.
176
+ // This can be done only if the subscriptionClient is created in ReceiveMode.PeekLock mode (which is the default).
177
+ Logger . LogDebug ( "Complete message - Path: {Path}, SubscriptionName: {SubscriptionName}, SequenceNumber: {SequenceNumber}, DeliveryCount: {DeliveryCount}, MessageId: {MessageId}" , TopicSubscription . Path , TopicSubscription . SubscriptionName , message . SequenceNumber , message . DeliveryCount , message . MessageId ) ;
178
+ await completeMessage ( message , token ) . ConfigureAwait ( false ) ;
179
+ return ;
180
+
181
+ case ProcessResult . Abandon :
182
+ Logger . LogError ( r . Exception , "Dead letter message - Path: {Path}, SubscriptionName: {SubscriptionName}, SequenceNumber: {SequenceNumber}, DeliveryCount: {DeliveryCount}, MessageId: {MessageId}" , TopicSubscription . Path , TopicSubscription . SubscriptionName , message . SequenceNumber , message . DeliveryCount , message . MessageId ) ;
183
+ await deadLetterMessage ( message , r . Exception ? . GetType ( ) . Name ?? string . Empty , r . Exception ? . Message ?? string . Empty , token ) . ConfigureAwait ( false ) ;
184
+ return ;
185
+
186
+ case ProcessResult . Fail :
187
+ var messageProperties = new Dictionary < string , object > ( ) ;
188
+ {
189
+ // Set the exception message
190
+ messageProperties . Add ( "SMB.Exception" , r . Exception . Message ) ;
191
+ }
192
+
193
+ Logger . LogError ( r . Exception , "Abandon message (exception occurred while processing) - Path: {Path}, SubscriptionName: {SubscriptionName}, SequenceNumber: {SequenceNumber}, DeliveryCount: {DeliveryCount}, MessageId: {MessageId}" , TopicSubscription . Path , TopicSubscription . SubscriptionName , message . SequenceNumber , message . DeliveryCount , message . MessageId ) ;
194
+ await abandonMessage ( message , messageProperties , token ) . ConfigureAwait ( false ) ;
195
+ return ;
196
+
197
+ default :
198
+ throw new NotImplementedException ( ) ;
180
199
}
181
-
182
- // Complete the message so that it is not received again.
183
- // This can be done only if the subscriptionClient is created in ReceiveMode.PeekLock mode (which is the default).
184
- Logger . LogDebug ( "Complete message - Path: {Path}, SubscriptionName: {SubscriptionName}, SequenceNumber: {SequenceNumber}, DeliveryCount: {DeliveryCount}, MessageId: {MessageId}" , TopicSubscription . Path , TopicSubscription . SubscriptionName , message . SequenceNumber , message . DeliveryCount , message . MessageId ) ;
185
- await completeMessage ( message , token ) . ConfigureAwait ( false ) ;
186
200
}
187
201
188
202
protected Task ProcessErrorAsyncInternal ( Exception exception , ServiceBusErrorSource errorSource )
0 commit comments