附加调试器时,程序永远不会抛出异常

时间:2013-07-31 19:43:38

标签: java ssl

我有一个基于Java的服务,当我运行它时,会抛出意外的SSL异常“Socket is closed”...或者有时“数据在非数据状态下被收到”。  当我通过添加jvmArgs配置远程调试器时:-Xdebug -Xrunjdwp:transport = dt_socket,server = y,suspend = n,address = 5050,然后运行它,它永远不会抛出此异常。是否有关于此选项的内容可以修改服务的行为?

例外:

javax.net.ssl.SSLProtocolException: Data received in non-data state: 6
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1061)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884)
    at sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:149)
    at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:110)
    at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:191)
    at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:164)
    at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:138)
    at java.security.DigestInputStream.read(DigestInputStream.java:161)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at com.amazonaws.services.s3.internal.ChecksumValidatingInputStream.read(ChecksumValidatingInputStream.java:97)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)
    at javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:103)
    at javax.crypto.CipherInputStream.read(CipherInputStream.java:224)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)
    at <mypackagenameremovedforanonymity>.GetObjectActivity.enact(GetObjectActivity.java:118)

上下文:我正在从包装SSL套接字的InputStream中读取

3 个答案:

答案 0 :(得分:4)

这可能是其他人在AWS SDK和垃圾收集中看到的问题。我遇到了同样的问题。从S3输入流读取会因各种套接字/ SSL错误而失败,当我尝试隔离或调试它时,问题就会消失。事实证明,S3客户端连接正在收集垃圾,因为输入流没有保留它。我找到了以下链接,它解决了我的问题。

https://forums.aws.amazon.com/thread.jspa?messageID=438171

瑞克

P.S。需要说明的是,上述链接适用于在Android上运行,但问题和解决方案在所有平台上都是通用的(我在Windows上运行的JDK 7上遇到过它)。

答案 1 :(得分:0)

如果您在linux中运行应用程序,请尝试以下操作:

  • 运行您的应用程序,然后使用'ps -aux |检查程序调用grep java'
  • 在调试模式下运行,并在使用'ps -aux |检查程序调用后grep java'
  • 这将使您确定jvm路径

另一个非常重要的事情是通过将以下代码添加到您的应用来检查您的系统属性:

System.getProperties().list(System.out);
  • 之后,比较正常运行应用程序的输出和调试模式。

答案 2 :(得分:0)

当出现错误,在非数据状态下收到的数据时,检查套接字的输出流是否已关闭但输入流是否未关闭并继续发送/接收数据和套接字也是没有关闭。在最后关闭套接字流和套接字有助于解决问题。