Отменить длительное получение QueueClient служебной шины Azure?

Я пишу тестовую программу для обработки сообщений в очереди служебной шины Azure. Я хочу иметь возможность запускать и останавливать функцию удаления из очереди.

Если мне интересно, есть ли способ отменить вызов QueueClient.Receive (TimeSpan)? Существует метод QueueClient.Abort (), а также метод QueueClient.Close (), но документации по ним немного. И, похоже, нет соответствующего метода «Открыть» после прерывания или закрытия.

Если нет возможности отменить длительное получение, я застрял в использовании короткого (или нулевого) TimeSpan, чтобы дать пользователю возможность прекратить исключение из очереди. И, делая это, я в значительной степени провожу опрос, который сводит на нет преимущество длительной функции приема.

Я новичок в использовании очереди служебной шины, поэтому, возможно, я ошибаюсь в своем подходе и не понимаю, как должны обрабатываться сообщения в очереди?


person Darryl    schedule 08.06.2013    source источник


Ответы (3)


Дизайнерское решение действительно - закрыть клиента.

person Clemens Vasters    schedule 09.06.2013
comment
Это ужасный дизайн, кстати ... обработка сообщения продолжает выполняться, и только в самом конце, когда вы завершаете, вы получаете сообщение об ошибке, сообщающее вам, что вы на самом деле не можете завершить, даже если вы, вероятно, совершили какие-либо транзакции с базами данных у вас есть открытый. - person Shane Courtrille; 19.02.2020

Закройте фабрику сообщений, создавшую клиента очереди, и приемник прекратит работу. При закрытии фабрики сообщений удаляется соединение со службой служебной шины. Обратите внимание, что другие объекты MessagingEntities, созданные на основе фабрики, также закрыты, поэтому используйте выделенную фабрику для цикла приема.

var myFactory = MessagingFactory.FromConnectionString(...);
myFactory.Close();

По моему опыту, метод Abort в QueueClient иногда не прерывает фактическую операцию приема в течение разумного периода времени.

Чтобы снова начать получать, вам нужно будет создать новый QueueClient из нового MessagingFactory.

person Thomas    schedule 12.08.2013

Вероятно, у вас будет этот вызов в собственном фоновом потоке, для которого вы можете просто убить сам поток. Боковой момент, вы должны сначала закрыть объект QueueClient.

Когда вы будете готовы снова получить, создайте новый экземпляр и начните свой фоновый поток.

person Timothy Khouri    schedule 08.06.2013
comment
Хммм, разве нет ничего более элегантного, чем это? - person Darryl; 08.06.2013
comment
QueueClient не поддерживает полностью новые асинхронные функции, поэтому нет перегрузки, которая принимает CancelationToken. - person Timothy Khouri; 08.06.2013