【问题标题】:Cancel an Azure Service Bus QueueClient long running Receive?取消 Azure 服务总线 QueueClient 长时间运行的接收?
【发布时间】:2013-06-08 00:27:21
【问题描述】:

我正在编写一个测试程序来处理 Azure 服务总线队列中的消息。我希望能够提供启动和停止出队功能的能力。

如果我想知道是否有办法取消对 QueueClient.Receive(TimeSpan) 的调用?有一个 QueueClient.Abort() 方法,还有一个 QueueClient.Close() 方法,但是关于这些的文档很少。而且,中止或关闭后似乎没有对应的“打开”方法。

如果无法取消长时间运行的接收,那么我会使用较短(或没有)TimeSpan 来让用户有机会停止出队。通过这样做,我几乎是在对自己进行轮询,这破坏了长期运行接收功能的优势。

我是使用服务总线队列的新手,所以也许我在这里的方法是错误的,并且不了解应该如何处理队列中的消息的精神?

【问题讨论】:

    标签: c# azure servicebus


    【解决方案1】:

    关闭创建队列客户端的消息工厂,接收方将中止。关闭消息传递工厂会删除与服务总线服务的连接。请注意,从工厂创建的其他 MessagingEntities 也已关闭,因此请使用专用工厂进行接收循环。

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

    根据我的经验,QueueClient 上的 Abort 方法有时不会在合理的时间内中止实际的接收操作。

    要再次开始接收,您需要从新的 MessagingFactory 创建一个新的 QueueClient。

    【讨论】:

      【解决方案2】:

      设计方案确实是关闭客户端。

      【讨论】:

      • 这是一个可怕的设计顺便说一句.. 消息处理继续运行,只有在你“完成”的最后,你会收到一个错误,让你知道你实际上无法完成,即使您可能已经提交了您打开的任何数据库事务。
      【解决方案3】:

      您可能会在它自己的后台线程上进行此调用,您可以简单地杀死线程本身。顺便说一句,您应该先关闭QueueClient 对象。

      当您准备好再次接收时,创建一个新实例,并开始您的后台线程。

      【讨论】:

      • 嗯,真的没有比这更优雅的了吗?
      • QueueClient 不完全支持新的异步功能 - 因此没有接受 CancelationToken 的重载。
      猜你喜欢
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多