2016-11-21 4 views
1

을 사용하여 EventHub에 데이터를 보내는 경우 NullReferenceException 짧은 버전이 표시됩니다. 연결이 끊어지는 이유는 무엇입니까?Azure EventHub - NullReferenceException의 EventHubClient.Send() 결과가

긴 설명 :

나는 C#에서 EventHubClient 클래스에서 SendBatch 방법을 사용하여 EventHub로 데이터를 전송하기 위해 노력하고있어. (https://docs.microsoft.com/en-us/dotnet/api/microsoft.servicebus.messaging.eventhubclient)

일괄 처리 크기는 100json 개체이므로 너무 커서는 안됩니다. 더 큰 크기와 더 작은 배치 크기 모두에서 동일한 문제가 발생했습니다. 또한 객체를 하나씩 보내려면 Send()을 사용해 보았습니다. 같은 결과.

이 시간의 큰 99 %를 작동하지만, 때때로 다음과 같은 스택 추적 남겨두고 NullReferenceException 결과 : 나는 두 EventHubClient.RetryPolicy = RetryPolicy.Default;를 사용하여 수동으로 수행하여 재시도 정책을 구현하기 위해 노력했습니다

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) 

을 연결 시간을 다시 설정하려면 재귀 메서드 호출을 Thread.Sleep(n)과 함께 사용합니다.

가끔씩 연결은 10 초 후, 때로는 60 초 후로 바뀌며 대개는 절대 사용하지 않습니다. (또는 메서드의 재귀 호출이 StackOverflowException에 도달 할 때까지 약 30 분 후에 발생하지만 스레드가 놓이는 시간에 따라 다릅니다. 자다). 논리적으로, 나는이 시스템의 불안정한 부분을 가질 수 없다.

누구든지이 예외가 발생하는 이유를 알고 있으며 연결이 끊어짐으로 인해 발생했는지 확인하십시오.

답변

0

여기에 대한 대답은 오버로드 된 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) 
} 
} 
관련 문제