Using Microsoft.Azure.ServiceBus;
У меня есть очередь с включенным сеансом, и я хочу подписаться как на активную очередь, так и на DLQ, чтобы, когда мои сеансовые сообщения были полностью помечены буквами, я мог обрабатывать эти сообщения из DLQ.
Я звоню queueClient.RegisterSessionHandler
, чтобы подписаться на основную (активная очередь), и queueClient.RegisterMessageHandler
, чтобы подписаться на DLQ. Затем каждый раз, когда я получаю сообщение от DLQ, я хочу завершить сообщение (удалить из DLQ). Однако, когда я пытаюсь завершить, я получаю это исключение:
Encountered exception in message processing context. Action: UserCallback. Exception: System.InvalidOperationException: It is not possible for an entity that requires sessions to create a non-sessionful message receiver.
at Microsoft.Azure.ServiceBus.Core.MessageReceiver.<DisposeMessagesAsync>d__99.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.ServiceBus.RetryPolicy.<RunOperation>d__19.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.Azure.ServiceBus.RetryPolicy.<RunOperation>d__19.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.ServiceBus.Core.MessageReceiver.<CompleteAsync>d__68.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Media.Stream.SubstrateReplication.Common.Azure.Messaging.Providers.BrokeredMessageBase`1.<CompleteAsync>d__20.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Media.Stream.SubstrateReplication.Common.Azure.Messaging.Providers.ServiceBusProviderBase.<ProcessReceivedDeadLetterMessageAsync>d__17`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Media.Stream.SubstrateReplication.Common.Azure.Messaging.Providers.ServiceBusQueueProvider.<>c__DisplayClass5_0`1.<<OnMessageReceivedAsync>b__3>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.ServiceBus.MessageReceivePump.<MessageDispatchTask>d__13.MoveNext() File Name:C:\s\src\Common\Azure\Messaging\Providers\ExceptionHandler.cs Method Name:HandleExceptionAsync Line Number:35 Exception:
Я нашел эту статью о том, что CompleteAsyn c разрешен только для несессионной подписки (я при условии, что то же самое относится и к очереди?). Но почему? Я был в состоянии завершить сообщения очень хорошо, когда я только что зарегистрировал свой sessionHandler. С тех пор, как я добавил registerMessageHandler
в DLQ основной очереди, я получаю эту ошибку всякий раз, когда пытаюсь завершить ...: - (
Так что мой вопрос ... почему я получаю это исключение? Что я делаю что-то не так?
Также еще один элемент, я думаю, что я обрабатываю одни и те же сообщения о мертвых письмах снова и снова, поэтому мои метрики (количество мертвых букв) сильно отличаются от тех, которые предоставляет портал azure. Я понятия не имею, что происходит, я не знаю, добавляется ли одно и то же сообщение несколько раз в DLQ или по какой-то причине блокировка не работает, заставляя несколько слушателей обрабатывать сообщения одновременно ... кто-нибудь испытывал это?
Спасибо!