Azureservicebus 超出Azure service bus SDK的SendBatch()方法上的链接异常当前允许的限制(262144字节)

Azureservicebus 超出Azure service bus SDK的SendBatch()方法上的链接异常当前允许的限制(262144字节),azureservicebus,azure-eventhub,Azureservicebus,Azure Eventhub,我们正在使用Azure service bus SDK 3.1.7的SendBatch()方法将数据发送到Azure事件中心。以下是代码片段: foreach (var packet in transformedPackets) { EventData eventData = new EventData(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(packet, settings)));;

我们正在使用Azure service bus SDK 3.1.7的SendBatch()方法将数据发送到Azure事件中心。以下是代码片段:

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;
            }

        }
事件在将事件数据添加到批处理(允许的最大限制:256 KB)之前检查SerializedSizeInBytes属性后,我们得到以下异常:

接收到的消息(传递id:0,大小:262279字节)超出了链接上当前允许的限制(262144字节)。 位于Microsoft.ServiceBus.Common.ExceptionDispatcher.Throw(异常) 位于Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult结果) 在Microsoft.ServiceBus.Common.AsyncResult
1.End(IAsyncResult AsyncResult)上
位于Microsoft.ServiceBus.Messaging.MessageSender.RetrySenderEventDataAsyncResult.End(IAsyncResult r)
位于Microsoft.ServiceBus.Messaging.MessageSender.EndSendEventData(IAsyncResult结果)

在Microsoft.ServiceBus.Messaging.EventHubSender.SendBatch(IEnumerable
1 eventDataList)

中,当事件转换为单个
AmqpMessage
时,会向批头添加一些附加信息

确保所有
EventData
的聚合大小低于250k


在这里,您可以找到有关此问题的详细信息:

我在Event Hub上也面临同样的问题。但处理这些函数的聪明方法是使用递归调用。在这里张贴的样本代码,这对我来说很好

方法1:处理正常的SendBatchAsync操作

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;
    }
}
public async Task sendbacktoehasync(IEnumerable inputContent)//获取要处理的字符串列表(大约50000行)
{
尝试
{
var batch=新列表();
foreach(inputContent中的var项)//将其添加到批处理
{
var bind=neweventdata(Encoding.UTF8.GetBytes(item));
批量添加(绑定);
}
尝试
{
等待eventHubClient.SendBatchAsync(批处理);
}
捕获(MessageSizeExceedeException)
{
等待重新处理报价超出批次(批次);
}
}
捕获(例外情况除外)
{
投掷;
}
}
方法2:处理递归函数并将其右键以处理“MessageSizeExceedeException”

公共异步任务重新处理QuotaExceededBatch(列表批处理)
{
尝试
{
var noOfCalls=2;
var noOfRecordsPerSplitBatch=(int)数学上限((double)batch.Count/noOfCalls);
var计数器=0;
while(计数器
方法3:对项目进行拆分的助手方法

 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;
}
private static List GetSubListForEventDataBatch(List List,int count)
{
var sList=list.Skip(count*noOfRecordsPerSplitBatch).Take(noOfRecordsPerSplitBatch);
列表子列表=新列表();
子列表。添加范围(sList);
返回子列表;
}
希望这能为其他人解决问题。
如果有,请写下您对此代码的改进。

我正在尝试向eventHub发送数据表,并收到以下错误消息,收到的消息(传递id:0,大小:18719987字节)超出了链接上当前允许的限制(262144字节)。在这种情况下,如何处理datatable的修补?
 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;
}