2016-05-05 14 views
0

Wir verwenden die SendBatch() - Methode des Azure-Servicebus SDK 3.1.7, um Daten an Azure Event Hub zu senden. Im Folgenden finden Sie den Code-Schnipsel:Überschreitet das aktuell zulässige Limit (262144 Byte) für die Verknüpfung Ausnahme bei SendBatch() -Methode des Azure-Servicebusses SDK

foreach (var packet in transformedPackets) 
     { 
      EventData eventData = new EventData(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(packet, settings)));; 
      try 
      { 
       eventData.Properties.Add(AppConstants.TenantDeploymentUniqueIdKey, tenantDeploymentUniqueId); 
       eventData.Properties.Add(AppConstants.DataTypeKey, DataTypeKey); 
       byteCount += eventData.SerializedSizeInBytes;     
       if (byteCount > MaxBatchSize) 
       { 
        sender.SendBatch(transformedMessages); 
        transformedMessages.Clear(); 
        byteCount = eventData.SerializedSizeInBytes; 
       } 
       transformedMessages.Add(eventData); 
      } 
      catch (System.Exception) 
      { 
       eventData.Dispose(); 
       throw; 
      } 

     } 

Ereignis nach dem SerializedSizeInBytes Eigenschaft überprüfen, bevor die Ereignisdaten zu der Charge hinzugefügt (maximal zulässige Limit: 256 KB), wir die folgende Ausnahme erhalten:

Die empfangene Nachricht (Übermittlungs-ID: 0, Größe: 262279 Byte) überschreitet das aktuell zulässige Limit (262144 Byte) für den Link. bei Microsoft.ServiceBus.Common.ExceptionDispatcher.Throw (Exception Ausnahme) bei Microsoft.ServiceBus.Common.AsyncResult.End [TAsyncResult] (IAsyncResult result) bei Microsoft.ServiceBus.Common.AsyncResult 1.End(IAsyncResult asyncResult) at Microsoft.ServiceBus.Messaging.MessageSender.RetrySenderEventDataAsyncResult.End(IAsyncResult r) at Microsoft.ServiceBus.Messaging.MessageSender.EndSendEventData(IAsyncResult result) at Microsoft.ServiceBus.Messaging.EventHubSender.SendBatch(IEnumerable 1 eventDataList)

Antwort

0

ich auch am Event-Hub mit dem gleichen Problem konfrontiert. Aber kluger Weg, um diese Funktion zu handhaben, ist, rekursiven Anruf zu verwenden. Hier, indem Sie den Beispielcode eingeben, der für mich funktioniert.

Methode 1: Prozess des Normalen SendBatchAsync Betriebes

public async Task SendBatchToEHAsync(IEnumerable<string> inputContent) // Taking List of String to process (50000 Lines Approx) 
{ 
    try 
    { 
     var batch = new List<EventData>(); 
     foreach (var item in inputContent) // Add it to Batch 
      { 
       var bind = new EventData(Encoding.UTF8.GetBytes(item)); 
       batch.Add(bind); 
      } 
      try 
      { 
       await eventHubClient.SendBatchAsync(batch); 

      } 
      catch (MessageSizeExceededException) 
      { 
       await ReprocessQuotaExceededBatch(batch); 
      } 
    } 
    catch (Exception ex) 
    { 

     throw; 
    } 
} 

Methode 2: für Gegenstände Helper Methode, um spalt: Griff und rechts die rekursive Funktion "MessageSizeExceededException"

public async Task ReprocessQuotaExceededBatch(List<EventData> batch) 
{ 
    try 
    { 
     var noOfCalls = 2; 
     var noOfRecordsPerSplitBatch = (int)Math.Ceiling((double)batch.Count/noOfCalls); 
     var counter = 0; 
     while (counter < noOfCalls) 
     { 
      var insertSubList = GetSubListForEventDataBatch(batch, counter); 
      try 
      { 
       await eventHubClient.SendBatchAsync(insertSubList); 

      } 
      catch (MessageSizeExceededException) 
      { 
       await ReprocessQuotaExceededBatch(insertSubList); 
       // Perform SPlit processing in case of this exception occures 
      } 
      counter++; 
     } 
    } 
    catch (Exception ex) 
    { 

     throw; 
    } 
} 

Methode 3 zu handhaben

private static List<EventData> GetSubListForEventDataBatch(List<EventData> list, int count) 
{ 

    var sList = list.Skip(count * noOfRecordsPerSplitBatch).Take(noOfRecordsPerSplitBatch); 
    List<EventData> subList = new List<EventData>(); 
    subList.AddRange(sList); 
    return subList; 
} 

Hoffe, dass das Problem für andere zu lösen s. Bitte notieren Sie Ihre Verbesserungen für diesen Code, falls vorhanden.