Ошибка при регистрации EventProcessorHost
Я пытаюсь использовать EventProcessorHost для получения сообщений от EventHub в JAVA. Выполнены шаги, которые приведены здесь1 и здесь2, но когда я запускаю код, я получаю ошибку ниже..
Registering host named <name>
Failure while registering: java.util.concurrent.ExecutionException: com.microsoft.azure.storage.StorageException: The client could not finish the operation within specified maximum execution timeout.
Press enter to stop
Больше деталей:
Создана новая учетная запись хранения, как упомянуто в блоге, а также создан BLOB-объект.
Класс EventProcessor и класс ErrorNotificationHandler точно такие же, как указано в документах Microsoft.
Код для регистрации звонков, как показано ниже...
final String consumerGroupName = "test"; final String namespaceName = "--namespace--"; final String eventHubName = "--eventhub name --"; final String sasKeyName = "--saskey name--"; final String sasKey = "--sas-key"; final String containerName = "--container name --"; final String storageAccountName = "--storage account name --"; final String storageAccountKey = "--storage -- account key--"; final String connectionString = "--eventhub connection string copied from azure portal --"; final String storageConString = "--storage connection string copied from azure portal --"; EventProcessorHost host = new EventProcessorHost( namespaceName, // Also tried with full name <namespace name>.servicebus.windows.net eventHubName, consumerGroupName, connectionString, storageConString, containerName // "<blobprefix>" Also tried with blob prefix ); System.out.println("Registering host named " + host.getHostName()); EventProcessorOptions options = new EventProcessorOptions(); options.setReceiveTimeOut(Duration.ofMinutes(12 L)); options.setExceptionNotification(new ErrorNotificationHandler()); try { host.registerEventProcessor(EventProcessor.class, options).get(15, TimeUnit.MINUTES); } catch (Exception e) { System.out.print("Failure while registering: "); if (e instanceof ExecutionException) { Throwable inner = e.getCause(); System.out.println(inner.toString()); } else { System.out.println(e.toString()); } }
Примечание. Блог не поддерживает конструктор EventProcessorHost.
В сети искал ошибку, и я смог найти увеличение тайм-аута для хранилища, но не уверен, как я могу доказать конкретный тайм-аут для хранилища в EventProcessorHost. Любая помощь приветствуется.
1 ответ
Я следовал за официальным документом, чтобы получать сообщения от концентратора событий, и он хорошо работает для меня.
Сообщения были сохранены в хранилище BLOB-объектов Azure, которое я настроил.
Согласно вашему описанию, исключение тайм-аута по-прежнему происходит, даже если вы установите для параметра ReceiveTimeOut значение 12 минут в EventProcessorOptions. По моему опыту, даже если сообщения принимаются одно за другим, это не может занять 12 минут. И мы обычно не можем установить тайм-аут в нашем приложении. Поэтому я думаю, что ошибка больше не от уровня SDK. Это может быть проблема сетевой среды.
Как я знаю, клиент отправки сообщений концентратора событий использует HTTP protocol
и не будет заблокирован брандмауэром. Клиент приема сообщений EPH использует протокол AMQP, который по существу TCP protocol
и будет ограничен настройками прокси-сервера или брандмауэра. Я предполагаю, что ваш Eph-клиент не имеет связи с концентратором событий.
Я не знаю вашей реальной сетевой среды, поэтому я предлагаю вам проверить настройки прокси-сервера или белый список брандмауэра для устранения проблем с сетевой средой.
Любое беспокойство, пожалуйста, дайте мне знать.