我正在尝试使用EventProcessorHost来使用JAVA中来自eventhub的消息。遵循给出了here1here2的步骤,但是当我运行代码时,我得到以下错误。



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






注意:Blog已弃用EventProcessorHost的构造函数。

在线搜索错误,我能找到的是增加存储超时,但是不确定如何证明EventProcessorHost中存储的特定超时。任何帮助表示赞赏。

最佳答案

我按照official document接收来自事件中心的消息,它对我来说很好用。

java - 注册EventProcessorHost时失败-LMLPHP

邮件已存储到我配置的Azure Blob存储中。

java - 注册EventProcessorHost时失败-LMLPHP

根据您的描述,即使您在EventProcessorOptions中将ReceiveTimeOut设置为12分钟,仍然会发生超时异常。根据我的经验,即使消息是一一收到的,也不需要花费12分钟的时间。对于我们来说,通常不可能在应用程序中设置如此长的超时时间。因此,我认为错误不再来自SDK级别。这可能是网络环境问题。

据我所知,事件中心消息发送客户端使用HTTP protocol并且不会被防火墙阻止。 EPH消息接收客户端使用AMQP协议,该协议本质上是TCP protocol,并且受代理服务器设置或防火墙的限制。我假设您的Eph客户端与事件中心没有连接。

我不知道您的实际网络环境,因此建议您检查代理设置或防火墙白名单以解决网络环境问题。

如有任何疑问,请告诉我。

08-04 16:38