有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

附加调试器时,java程序从不引发异常

我有一个基于Java的服务,它抛出了一个意外的SSL异常“socket已关闭”。。。有时,当我运行数据时,“在非数据状态下接收数据”。 当我通过添加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)

上下文:我正在从封装SSLsocket的InputStream读取数据


共 (3) 个答案

  1. # 1 楼答案

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

    • 运行应用程序,然后使用“ps-aux | grep java”检查程序调用
    • 在调试模式下运行,然后使用“ps-aux | grep java”检查程序调用
    • 这将确保您了解jvm路径

    另一件非常重要的事情是通过向应用程序添加以下代码来检查系统属性:

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

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

  3. # 3 楼答案

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

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

    瑞克

    顺便说一句,上面的链接是用于在Android上运行的,但是问题和解决方案在所有平台上都是通用的(我在Windows上运行的JDK 7上遇到过)