InvalidOperationException для CompleteAsyn c из очереди с включенной сессией - PullRequest
1 голос
/ 24 марта 2020
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 или по какой-то причине блокировка не работает, заставляя несколько слушателей обрабатывать сообщения одновременно ... кто-нибудь испытывал это?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...