尝试使用 SSL 读取大消息时,通过 Stomp 与 Artemis 的连接中断
Connection to Artemis via Stomp breaks when trying to read big messages using SSL
我的代码相当简单。我正在 https://github.com/stomp-php/stomp-php 使用图书馆,并尝试从 Artemis 队列中读取消息。这只是一个简单的 $stomp->read();
.
预期行为:
- 我从队列中收到一条消息,或者被告知队列中没有消息
发生了什么:
- 读取方法抛出异常(见下文)
- 当我们不使用 SSL 进行连接时,使用基本的 TCP 连接,没有证书,一切正常。它仅在我们使用证书连接 ssl 方案、SSL 端口时发生。
异常是:Was not possible to read data from stream.
,抛在[stomp-php目录]/src/Network/Connection.php第473行
这是流连接的上下文:
ssl:
peer_name: '[censored]'
cafile: '[censored certificate path].cer'
证书文件存在并且被正确读取(因为当我更改路径时甚至在尝试发送消息之前就抛出了异常)。对等名称也正确,因为另一个触发另一个错误告诉我对等名称不正确。
我的测试很简单:我有一个发送消息的文件和一个读取消息的文件。当我不订阅队列时,发送总是有效。阅读有点乱
新信息: 当我从发送中删除 5 条特定消息时,阅读似乎有效。这意味着如果我发送这 5 个中的一个,读取会抛出异常。如果只有这 5 条消息中的 none 以外的其他消息,则读取效果很好。我会假设消息是有原因的,但同样,当我不使用 SSL 连接时,一切正常。
又有新消息:为了不出错我不得不发送的每条消息都有大量的行。我试图再次发送其中一个并从其内容中删除除一个节点之外的每个节点(XML):它工作正常。所以我尝试了 ~900 个节点:错误。 ~200 个节点:错误。 ~130 个节点:有时会出错。 ~80 个节点:工作。
SSL 在处理大邮件时有问题吗?
新资料又来了:我试了var_dumping库中fread调用的结果。发生错误时,结果为空字符串 ('')。根据我在文档中阅读的内容,失败时 fread returns false,timeout 时为空字符串。这对于 "New information again" 集团来说是有意义的,我们发现大消息是导致问题的原因。
我尝试了 stream_set_timeout() 60 秒,我尝试手动发送心跳,我尝试用库设置它,我尝试用库更改超时,我尝试增加 maxReadBytes。到目前为止没有任何效果。还是一样的行为。
通过将 stomp-php 库恢复到版本 4.3.1 来修复:(
我的代码相当简单。我正在 https://github.com/stomp-php/stomp-php 使用图书馆,并尝试从 Artemis 队列中读取消息。这只是一个简单的 $stomp->read();
.
预期行为:
- 我从队列中收到一条消息,或者被告知队列中没有消息
发生了什么:
- 读取方法抛出异常(见下文)
- 当我们不使用 SSL 进行连接时,使用基本的 TCP 连接,没有证书,一切正常。它仅在我们使用证书连接 ssl 方案、SSL 端口时发生。
异常是:Was not possible to read data from stream.
,抛在[stomp-php目录]/src/Network/Connection.php第473行
这是流连接的上下文:
ssl:
peer_name: '[censored]'
cafile: '[censored certificate path].cer'
证书文件存在并且被正确读取(因为当我更改路径时甚至在尝试发送消息之前就抛出了异常)。对等名称也正确,因为另一个触发另一个错误告诉我对等名称不正确。
我的测试很简单:我有一个发送消息的文件和一个读取消息的文件。当我不订阅队列时,发送总是有效。阅读有点乱
新信息: 当我从发送中删除 5 条特定消息时,阅读似乎有效。这意味着如果我发送这 5 个中的一个,读取会抛出异常。如果只有这 5 条消息中的 none 以外的其他消息,则读取效果很好。我会假设消息是有原因的,但同样,当我不使用 SSL 连接时,一切正常。
又有新消息:为了不出错我不得不发送的每条消息都有大量的行。我试图再次发送其中一个并从其内容中删除除一个节点之外的每个节点(XML):它工作正常。所以我尝试了 ~900 个节点:错误。 ~200 个节点:错误。 ~130 个节点:有时会出错。 ~80 个节点:工作。
SSL 在处理大邮件时有问题吗?
新资料又来了:我试了var_dumping库中fread调用的结果。发生错误时,结果为空字符串 ('')。根据我在文档中阅读的内容,失败时 fread returns false,timeout 时为空字符串。这对于 "New information again" 集团来说是有意义的,我们发现大消息是导致问题的原因。
我尝试了 stream_set_timeout() 60 秒,我尝试手动发送心跳,我尝试用库设置它,我尝试用库更改超时,我尝试增加 maxReadBytes。到目前为止没有任何效果。还是一样的行为。
通过将 stomp-php 库恢复到版本 4.3.1 来修复:(