PulsarClientException:连接已关闭 - 已验证网络、防火墙、Pulsar 令牌和角色正确

Posted

技术标签:

【中文标题】PulsarClientException:连接已关闭 - 已验证网络、防火墙、Pulsar 令牌和角色正确【英文标题】:PulsarClientException: Connection already closed - verified network, firewall, Pulsar token and role are correct 【发布时间】:2021-10-02 20:24:20 【问题描述】:

我正在为 Apache Pulsar 使用 Java Spring 使用者,但我的应用无法启动。

我们已经验证了以下内容:

Pulsar 令牌是正确的。 (我们正在使用 Pulsar 令牌身份验证。) 我们可以使用 telnet 和 curl 命令访问目标 SSL Pulsar 端口 (6651),因此这不是防火墙或网络问题 角色在 Pulsar 中具有足够的权限 我们正在为正确的 Pulsar 集群找到正确的端点 我们在我们的客户端中为此环境使用了正确的信任证书

我们还可以使用此客户端代码从另一个环境重现该问题:

import org.apache.pulsar.client.api.PulsarClient;
PulsarClient client = PulsarClient.builder()
                .serviceUrl("pulsar+ssl://pulsarUrl:6651/")
                .tlsTrustCertsFilePath("path/to/ca.cert.pem")
                .enableTlsHostnameVerification(true)
                .allowTlsInsecureConnection(false)
                .authentication(AuthenticationFactory.token("yourTokenHere"))
                .build();

我们在日志中看到了这个异常:

无法初始化 Pulsar 消费者: org.apache.pulsar.client.api.PulsarClientException: java.util.concurrent.ExecutionException: org.apache.pulsar.client.api.PulsarClientException: 已经连接 关闭

更详细的日志在这里:

2021 年 7 月 26 日 10:00:19 -0600 [15277 1] com.newrelic 信息:使用默认值 收集器主机:collector.newrelic.com "@timestamp":"2021-07-26T16:01:31.184Z", "log.level":"ERROR", “消息”:“应用程序运行失败”,“ecs.version”: "1.2.0","service.name":"ProductExampleWoker","event.dataset":"AppExampleWoker.log","process.thread.name":"main","log.logger":"org.springframework .boot.SpringApplication","log.origin":"file.name":"SpringApplication.java","function":"reportFailure","file.line":826,"error.type":"org .springframework.beans.factory.eanCreationException","error.message":"错误 创建在类路径资源中定义的名称为“消费者”的 bean [com/myCompany/Example/ppw/service/config/ServiceConfig.class]:豆 通过工厂方法实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化 [org.apache.pulsar.client.api.Consumer]:工厂方法 “消费者”抛出异常;嵌套异常是 org.apache.pulsar.client.api.PulsarClientException: java.util.concurrent.ExecutionException: org.apache.pulsar.client.api.PulsarClientException: 已经连接 关闭","error.stack_trace":[ “org.springframework.beans.factory.BeanCreationException:错误 创建在类路径资源中定义的名称为“消费者”的 bean [com/overstock/Example/ppw/service/config/ServiceConfig.class]:豆 通过工厂方法实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化 [org.apache.pulsar.client.api.Consumer]:工厂方法 “消费者”抛出异常;嵌套异常是 org.apache.pulsar.client.api.PulsarClientException: java.util.concurrent.ExecutionException: org.apache.pulsar.client.api.PulsarClientException: 已经连接 关闭”,

可能是什么问题?

【问题讨论】:

【参考方案1】:

连接已经关闭

这意味着连接在连接后但在完成握手之前断开。

在这种情况下,Pulsar 集群的配置方式要求禁用主机名验证。 请在您的 Pulsar 消费者客户端中设置.enableTlsHostnameVerification(false)

另一个可能导致此问题的原因是,如果令牌有多余的空格字符或格式不正确(例如,如果它在末尾缺少一个字符。)

如果您在尝试连接的主题上运行查找命令,您可以跟踪该代理的日志,并在重新启动消费者时观察是否出现类似的异常:

javax.naming.AuthenticationException:无法验证令牌: 无法使用配置的 PublicKey 验证 RSA 签名。签名 长度不正确:得到 255 但期待 256 在 org.apache.pulsar.broker.authentication.AuthenticationProviderToken.parseToken(AuthenticationProviderToken.java:116) ~[org.apache.pulsar-pulsar-broker-common-2.6.2.jar:2.6.2] 在 org.apache.pulsar.broker.authentication.AuthenticationProviderToken.authenticate(AuthenticationProviderToken.java:76) ~[org.apache.pulsar-pulsar-broker-common-2.6.2.jar:2.6.2] 在 org.apache.pulsar.broker.authentication.OneStageAuthenticationState.(OneStageAuthenticationState.java:46) ~[org.apache.pulsar-pulsar-broker-common-2.6.2.jar:2.6.2] 在 org.apache.pulsar.broker.authentication.AuthenticationProvider.newAuthState(AuthenticationProvider.java:76) ~[org.apache.pulsar-pulsar-broker-common-2.6.2.jar:2.6.2] 在 org.apache.pulsar.broker.service.ServerCnx.handleConnect(ServerCnx.java:548) [org.apache.pulsar-pulsar-broker-2.6.2.jar:2.6.2] 在 org.apache.pulsar.common.api.PulsarDecoder.channelRead(PulsarDecoder.java:148) [org.apache.pulsar-pulsar-common-2.6.2.jar:2.6.2] 在 。 . .

并非所有身份验证失败都会以这种方式显示,但如果您看到该异常,那么您就会确定问题所在。

如果主题不存在,因为您需要暂停上游消费者,您可以手动创建订阅,以找出主题所在的代理,以便您在故障排除时知道要遵循哪个代理日志。

【讨论】:

以上是关于PulsarClientException:连接已关闭 - 已验证网络、防火墙、Pulsar 令牌和角色正确的主要内容,如果未能解决你的问题,请参考以下文章

无线网络连接已断开?

如何知道已连接的WiFi的密码?

宽带连接已断开连接怎么回事?

调用 SOAP 时,“底层连接已关闭:预期保持活动状态的连接已被服务器关闭”

MongoError:拓扑已关闭,尽管已建立数据库连接,请连接

如何用C语言检测网络是不是连接上、已连接、已断开状态