EventHub EventDataBatch превышает MaxMessageSize - PullRequest
0 голосов
/ 16 апреля 2019

Я использую Microsoft.Azure.EventHubs 2.0.0 NuGet для добавления сообщений в пакет:

private EventDataBatch _currentBatch;
_currentBatch = _eventHubClient.CreateBatch();
...
var json = @event.ToEventJson();
var data = new EventData(Encoding.UTF8.GetBytes(json));
if (_currentBatch.TryAdd(data))
            {
                return;
            }

Но случайно созданный пакет (не для всех созданных пакетов) выдает:

{Microsoft.Azure.EventHubs.MessageSizeExceededException: полученное сообщение (идентификатор доставки: 0, размер: 262192 байта) превышает ограничение (262144 байта), в настоящее время разрешенное для ссылки.

во время

await _eventHubClient.SendBatchAsync(batch);

Это детерминированный набор данных, который всегда выдает эту ошибку во время тестов.

1 Ответ

0 голосов
/ 17 апреля 2019

Обновление :

Если вы используете Microsoft.Azure.EventHubs 2.0.0 NuGet, а размер сообщения превышает 256 КБ, вы должны увидеть это сообщение об ошибке:

System.ArgumentException: 'There are no event data supplied. Please make sure input events are not empty.
Parameter name: eventDatas'.

если вы явно не указали максимальный размер (он может составлять до 1М), то максимальный размер по умолчанию равен 256 КБ.

Метод _currentBatch.TryAdd(data) проверит размер, если он превышает максимальныйразмер вы установили.Если он превышает максимальный размер, возвращает false, а если возвращает false, метод SendAsync() сгенерирует исключение;иначе возвращаем true.

Вы можете явно установить максимальный размер (он может достигать 1M), используя следующий код:

BatchOptions bo = new BatchOptions() { MaxMessageSize = 1048576 }; 
_currentBatch = eventHubClient.CreateBatch(bo);

Пример кода в виде удара, данные для отправкиболее 256 КБ и менее 1 МБ:

private static async Task SendTest()
    {
        var connectionStringBuilder = new EventHubsConnectionStringBuilder(EventHubConnectionString)
        {
            EntityPath = EventHubName
        };
        eventHubClient = EventHubClient.CreateFromConnectionString(connectionStringBuilder.ToString());
        EventDataBatch _currentBatch;
        BatchOptions bo = new BatchOptions() { MaxMessageSize = 1048576 }; // the max size can be 1M
        _currentBatch = eventHubClient.CreateBatch(bo);            
        StreamReader sr = new StreamReader(@"D:\azure stack overflow\2019\04\18\test1.txt");
        string s = sr.ReadToEnd();
        Console.WriteLine(s.Length);
        var data = new EventData(Encoding.UTF8.GetBytes(s));
        if (_currentBatch.TryAdd(data))
        {
            Console.WriteLine("data has been added successfully!!!");
            //return;                
        }
        else
        {
            Console.WriteLine("no data added,the data is too larger!!!");
        }
       await eventHubClient.SendAsync(_currentBatch);
    }

И работает без исключений:

enter image description here


Исключение«MessageSizeExceededException» выбрасывается из-за этого:

Брошено, если общий сериализованный размер eventDataList превышает допустимый предел размера для одной передачи события (256 КБ по умолчанию).

Пожалуйста, убедитесь, чторазмер не более 256 тыс.

Более подробную информацию можно найти в документе здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...