我正在尝试使用EventProcessorHost来使用JAVA中来自eventhub的消息。遵循给出了here1和here2的步骤,但是当我运行代码时,我得到以下错误。
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接收来自事件中心的消息,它对我来说很好用。
邮件已存储到我配置的Azure Blob存储中。
根据您的描述,即使您在EventProcessorOptions中将ReceiveTimeOut设置为12分钟,仍然会发生超时异常。根据我的经验,即使消息是一一收到的,也不需要花费12分钟的时间。对于我们来说,通常不可能在应用程序中设置如此长的超时时间。因此,我认为错误不再来自SDK级别。这可能是网络环境问题。
据我所知,事件中心消息发送客户端使用HTTP protocol
并且不会被防火墙阻止。 EPH消息接收客户端使用AMQP协议,该协议本质上是TCP protocol
,并且受代理服务器设置或防火墙的限制。我假设您的Eph客户端与事件中心没有连接。
我不知道您的实际网络环境,因此建议您检查代理设置或防火墙白名单以解决网络环境问题。
如有任何疑问,请告诉我。