使用Java连接Azure Event Hub时遭遇连接重置错误求助
解决Azure Event Hub Java客户端连接重置错误
核心问题定位
你在Java代码中错误地混合使用了连接字符串和DefaultAzureCredential来构建客户端。当持有完整的Event Hub连接字符串时,不需要再传入DefaultAzureCredential,这会导致认证逻辑冲突,进而触发连接重置错误。而你的Node.js代码是直接用连接字符串初始化客户端,这是正确的用法。
修正后的Java代码
直接使用连接字符串构建EventHubConsumerAsyncClient,无需调用credential方法:
EventHubConsumerAsyncClient consumer = new EventHubClientBuilder() .connectionString(connectionString, eventHubName) .consumerGroup(EventHubClientBuilder.DEFAULT_CONSUMER_GROUP_NAME) .buildAsyncConsumerClient(); // 动态获取分区ID(避免硬编码) consumer.getPartitionIds().subscribe(partitionIds -> { String partitionId = partitionIds.get(0); EventPosition startingPosition = EventPosition.latest(); Disposable subscription = consumer.receive(partitionId, startingPosition) .subscribe(partitionEvent -> { PartitionContext partitionContext = partitionEvent.getPartitionContext(); EventData event = partitionEvent.getData(); System.out.printf("Received event from partition '%s'%n", partitionContext.getPartitionId()); System.out.printf("Contents of event as string: '%s'%n", event.getBodyAsString()); }, error -> { System.err.println("An error occurred: " + error.getMessage()); }, () -> { System.out.println("Stream has ended."); }); }); // 保持主线程存活(异步客户端依赖主线程运行才能接收事件) try { Thread.sleep(Long.MAX_VALUE); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
额外注意事项
- 主线程存活:异步客户端是非阻塞的,必须确保主线程不会立即退出,否则订阅会被销毁,无法接收事件。
- 动态分区ID:尽量避免硬编码
partitionId,通过getPartitionIds()动态获取更适配不同的Event Hub配置。 - 依赖版本:确保
azure-messaging-eventhubs依赖为最新稳定版,旧版本可能存在已知的连接兼容性问题。
内容的提问来源于stack exchange,提问作者nicolasSiandro
相关产品推荐
相关产品推荐

