我遇到Azure Service总线的间歇性问题.偶尔,在总线上放置一条消息会导致以下异常:
TYPE:InvalidOperationException
消息:由于已经消耗了代理消息"723eab13dab34351a78bb687d0923b89",因此无法执行操作.请使用新的BrokeredMessage实例进行操作.
堆栈跟踪
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
Run Code Online (Sandbox Code Playgroud)
AzureBus的违规代码是:
public void Enqueue(T message)
{
using (var brokeredMessage = new BrokeredMessage(message) { Label = message.GetType().FullName, TimeToLive = _timeToLive })
{
_retryPolicy.ExecuteAction(() => _sender.Send(brokeredMessage));
}
}
Run Code Online (Sandbox Code Playgroud)
传入T消息的地方是
[Serializable]
public class ValidationMessage
{
public string ValidationToken { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
_retryPolicy是一个
RetryPolicy<ServiceBusTransientErrorDetectionStrategy>
Run Code Online (Sandbox Code Playgroud)
_timeToLive是12小时的时间跨度
有任何想法吗?
我一直在执行设定平等(即列表比较,其中的顺序是无关紧要的)和阅读做题等之后尝试这个和这个,写了下面的简单扩展:
public static bool SetEqual<T>(this IEnumerable<T> enumerable, IEnumerable<T> other)
{
if (enumerable == null && other == null)
return true;
if (enumerable == null || other == null)
return false;
var setA = new HashSet<T>(enumerable);
return setA.SetEquals(other);
}
Run Code Online (Sandbox Code Playgroud)
但是,我遇到了一个简单的数据结构,这种方法不起作用,而Enumerable.SequenceEqual则不行.
public class Test : IEquatable<Test>
{
public Guid Id { get; set; }
public List<Test> RelatedTest { get; set; }
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if …Run Code Online (Sandbox Code Playgroud)