【发布时间】:2015-10-06 15:48:13
【问题描述】:
我将SSLEngines 与 NIO 一起使用,为我的应用程序提供非阻塞 SSL 连接。在握手期间的某个时刻(可能在收到ServerHelloDone 之后)SSLEngine 要求我处理委派的任务。
所以我调用getDelegatedTask 并称之为run 方法。任务本身调用X509ExtendedKeyManager.getCertificateChain,而后者又抛出NullPointerException。该异常被Handshaker 捕获并存储以供以后报告。
但是,报告通过调用私有 checkTaskThrown 方法起作用,该方法仅在收到消息或要发送消息时调用。
但是如果没有getCertificateChain 正确完成,就没有东西可以发送,对方也没有发送任何东西,所以也没有东西可以接收。因此异常保持隐藏。
由于没有一方继续进行,我们有一个活锁。 我发现没有办法阻止或检测到这种情况,除了
- 使用反射调用
checkTaskThrown - 使用一些任务/定时器来超时
哪一条都不是我想去的路……
【问题讨论】:
-
任务完成后,您应该重试返回 NEED_TASK 的操作。但是为什么会抛出 NullPointerException 呢?
-
您实际上是对的。我的代码实际上确实调用了
getHandshakeStatus并得到了NEED_UNWRAP,但由于sourceByteBuffer中没有任何内容,因此内部优化位我和unwrap没有被调用。请重新发表您的评论作为答案。
标签: java exception jsse sslengine