使用NullReferenceException
向EventHub发送数据时的短版本:EventHubClient.SendBatch
。为什么连接被丢弃?
更长的解释:
我正在尝试使用C#中EventHub
类的SendBatch
方法将数据发送到EventHubClient
。 (https://docs.microsoft.com/en-us/dotnet/api/microsoft.servicebus.messaging.eventhubclient)
批量大小为100个json对象,不应太大。我遇到了更大和更小批量的相同问题。我也尝试使用Send()
来逐个发送对象。结果相同。
99%的情况下这很有用,但有时会产生NullReferenceException
,留下以下的堆栈跟踪:
System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.ServiceBus.Messaging.MessageSender.RetrySenderEventDataAsyncResu
lt.<>c.<.ctor>b__5_0(EventData e)
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate
)
at Microsoft.ServiceBus.Messaging.MessageSender.RetrySenderEventDataAsyncResu
lt..ctor(MessageSender sender, TrackingContext trackingContext, IEnumerable`1 me
ssages, TimeSpan timeout, AsyncCallback callback, Object state)
at Microsoft.ServiceBus.Messaging.MessageSender.BeginSendEventData(TrackingCo
ntext trackingContext, IEnumerable`1 eventDatas, TimeSpan timeout, AsyncCallback
callback, Object state)
at Microsoft.ServiceBus.Messaging.EventHubClient.SendBatch(IEnumerable`1 even
tDataList)
我试图实现重试策略,两者都使用
EventHubClient.RetryPolicy = RetryPolicy.Default;
并通过手动对Thread.Sleep(n)
进行递归方法调用,以便给连接时间重新建立。
有时连接会在10秒后恢复,有时会在60秒后恢复,并且通常永远不会(或者直到我的方法的递归调用在约30分钟后命中StackOverflowException
,但取决于线程的持续时间睡着了)。从逻辑上讲,我不能拥有我系统中不稳定的部分。
任何人都知道为什么会发生此异常,以及是否由于连接丢失?
答案 0 :(得分:0)
这里的答案原来是一个重载的EventHub。
对于每100批,等待0.5秒。对于每个NullReferenceException,等待2秒再重试相同的数据。在连接恢复之前,可能需要重试100次以上。我尝试了指数等待时间,这在我的情况下是不成功的(最后等了几个小时,仍然没有连接)。
当然 - 使用永久的while循环而不是role1
@role2
@role3
@role4
$arole
中的递归调用。这会阻止C#
。 (新秀错误)。
工作代码:
StackOverflowException