Azure EventHub - EventHubClient.Send()导致NullReferenceException

时间:2016-11-21 13:47:07

标签: c# azure nullreferenceexception

使用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,但取决于线程的持续时间睡着了)。从逻辑上讲,我不能拥有我系统中不稳定的部分。

任何人都知道为什么会发生此异常,以及是否由于连接丢失?

1 个答案:

答案 0 :(得分:0)

这里的答案原来是一个重载的EventHub。

对于每100批,等待0.5秒。对于每个NullReferenceException,等待2秒再重试相同的数据。在连接恢复之前,可能需要重试100次以上。我尝试了指数等待时间,这在我的情况下是不成功的(最后等了几个小时,仍然没有连接)。

当然 - 使用永久的while循环而不是role1 @role2 @role3 @role4 $arole 中的递归调用。这会阻止C#。 (新秀错误)。

工作代码:

StackOverflowException