当前位置: 首页 > 知识库问答 >
问题:

Azure EventHub-EventHubClient.send()结果为NullReferenceException

尉迟明辉
2023-03-14

这在99%的情况下都有效,但有时会导致NullReferenceException,留下以下StackTrace:

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秒后恢复,通常永远不会恢复(或者直到我对方法的递归调用击中StackOverflowException,大约30分钟后,但取决于线程进入Hibernate状态的时间)。从逻辑上讲,我不能拥有我系统中这个不稳定的部分。

有人知道为什么会出现这个异常吗?如果是由于连接中断?

共有1个答案

公良昕
2023-03-14

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

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

当然,在C#中使用永恒的while循环而不是递归调用。这将防止StackOverflowException。(菜鸟错误)。

public bool SendMessageAsList(List<EventData list) 
{
while(true)
{
    var batchList = new List<EventData>();
    for (var i = 0; i < list.Count; i + 100)
    try
    {
        if (i % 10000)
            Thread.Sleep(500);
        batchList = list.Skip(i).Take(100).ToList();
        EventHubClient.SendBatch(batchList);
        // Gets here at success
        list = list.Skip(100).ToList();
        if (batchList.Count < 100)
            break;
    }
    catch (NullReferanceException e)
    {
        Console.WriteLine(e);
        Thread.Sleep(2000)
}
}
 类似资料:
  • 问题内容: 目前,我正在编写一个应用程序(使用TargetiOS6,已启用ARC),该应用程序使用JSON进行数据传输,并使用CoreData进行持久存储。JSON数据是通过PHP脚本通过json_encode从MySQL数据库生成的。 我的问题是,对于某些表中的数据,以下代码将失败: 程序始终在显示self.jsonSerializationResult的行上崩溃并显示EXC_BAD_ACCES

  • 我们有以下内容:

  • 问题内容: 我已经检查了很多其他线程,因为它们无法使用Django中的静态文件应用程序提供静态内容,但尚未找到解决方案。 settings.py 模板 相关行… 日志 从日志看来,路径是正确的,但可惜它仍然会产生404。 问题答案: 对于本地提供的静态文件, 如果您尚未 设置任何形式的静态文件收集并且运行的是Django 1.3+,我相信这是您引用静态文件时应采用的方式 注意,我在这里省略了。这是

  • 我正在制作一个php注册脚本,注册工作正常,所有内容都已成功输入数据库,激活电子邮件工作正常,但每当我使用mysqli查询来选择或更新信息时,它都不起作用。 例如,当我使用我知道数据库中存在的帐户登录时,它告诉我用户名不存在,当单击电子邮件中的激活链接时,查询无法以相同的方式更新数据库。 我相信这是一个非常简单的错误,我忽略了我的新手,但我找了几个小时后找不到合适的答案。我真的不确定问题出在哪里。

  • 我正在使用Pycharm并试图将文本打印到控制台 最终打印命令('

  • 我正在尝试编写一个SeleniumWebDriver测试,它可以导航到Google,搜索一些东西,然后验证Google是否搜索了输入的内容。然而,下面的代码给出了一个“false”输出,当我看到它是真的时。 我在这个场景中找到的所有代码似乎都是Google Instant之前的代码,我无法在FirefoxDriver中关闭Instant。它还应该等待网页,图像,视频等酒吧被点击之前,检查任何东西;