首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否已使用Azure服务总线BrokeredMessage?

是否已使用Azure服务总线BrokeredMessage?
EN

Stack Overflow用户
提问于 2012-09-07 05:09:57
回答 4查看 5.8K关注 0票数 9

我的Azure服务总线出现间歇性问题。偶尔,在总线上放置一条消息会导致以下异常:

类型: InvalidOperationException

消息:无法执行该操作,因为代理消息'723eab13dab34351a78bb687d0923b89‘已被消费。请使用新的BrokeredMessage实例执行该操作。

步进

代码语言:javascript
复制
at Microsoft.ServiceBus.Messaging.MessagingUtilities.ValidateAndSetConsumedMessages(IEnumerable`1 messages)
at Microsoft.ServiceBus.Messaging.MessageSender.Send(TrackingContext trackingContext, IEnumerable`1 messages, TimeSpan timeout)
at Microsoft.Practices.TransientFaultHandling.RetryPolicy.<>c__DisplayClass1.<ExecuteAction>b__0()
at Microsoft.Practices.TransientFaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 func)
at IQ.IR.Core.ServiceBus.AzureBus`1.Enqueue(T message) in c:\BuildAgent\work\cc0c51104c02a4e9\IQ.IR.Core\ServiceBus\AzureBus.cs:line 69
...Rest of stacktrace snipped as it's within my app

来自AzureBus的有问题的代码是:

代码语言:javascript
复制
public void Enqueue(T message)
{
    using (var brokeredMessage = new BrokeredMessage(message) { Label = message.GetType().FullName, TimeToLive = _timeToLive })
    {
        _retryPolicy.ExecuteAction(() => _sender.Send(brokeredMessage));
    }
}

传入的T消息的位置是

代码语言:javascript
复制
[Serializable]
public class ValidationMessage
{
    public string ValidationToken { get; set;}
}

而_retryPolicy是一个

代码语言:javascript
复制
RetryPolicy<ServiceBusTransientErrorDetectionStrategy>

_timeToLive是一个12小时的时间跨度

有什么想法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-07 14:13:19

该错误指示消息已“已发送”,但在处理过程中发生错误。不幸的是,没有一种简单的方法可以通过检查消息来了解这一点,并且消息不能再次重用,因为它被认为是被消费的。我们正在做一些改进,比如允许你查询这样一条消息的状态,抛出一个MessagingException而不是InvalidOperation。最后,克隆消息的能力将有助于更容易地从此类故障中恢复。

票数 5
EN

Stack Overflow用户

发布于 2012-09-08 00:22:51

……接下来是Abhishek的回答:现在您需要为每次重试构建一个新的BrokeredMessage,因此您的重试策略范围需要更高一级。请注意,如果您放入一个流,我们将按原样使用代理消息中的流,并将其直接拉到网络上,因此您将需要提前为重试循环制作流的副本。

票数 6
EN

Stack Overflow用户

发布于 2018-08-23 21:20:36

我最近遇到了这种情况,并发现了另一个原因:如果您正在构造BrokeredMessage,并在使用MessageSender发送它之前设置了断点,并检查消息的属性,则它将尝试访问队列并抛出此异常。只需先发送消息,而不在IDE中检查其属性,不会导致此问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12308440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档