HttpURLConnectionの上のTomcatのメモリリークの警告

user7294900:

私は必ず私が無視できないよTomcatの8.5で、次の警告を持っています

WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [AppName] appears to have started a thread named [pool-20-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
java.net.SocketInputStream.read(SocketInputStream.java:171)
java.net.SocketInputStream.read(SocketInputStream.java:141)
sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
sun.security.ssl.InputRecord.read(InputRecord.java:503)
sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)

それは上が起こるconnect次のコードで:

URL url = new URL(MY_URL);
URLConnection con = url.openConnection();
HttpURLConnection http = (HttpURLConnection) con;
http.setRequestMethod("POST");
http.setDoOutput(true);
http.setFixedLengthStreamingMode(out.length);
http.setRequestProperty("Content-Type", "application/json");
http.connect();
try (OutputStream os = http.getOutputStream()) {
    os.write(out);
}

私は終了して最終的に追加する必要がありますInputStream

http.getInputStream().close();

あるいは、このコードは/アップグレードを使用するように変換する必要があるURIBuilderHttpHost

EDITコードはSpringのを使用してX秒ごとに実行@Scheduled

チャールズDowbecki:

あなたは、使用している@Scheduledスレッドを生成するためにTomcatの中に。あなたはときに、これらのスレッドが終了しますことを確認する必要がありますServletContextアンデプロイされている例えばWAR破壊され、Tomcatはこれについて警告します。HTTPリクエストコードとして無関係であるURLConnection要求を実行するために、新しいスレッドを開始しません。

で説明したようにTomcatの幸せを作るための一つの方法は、デーモンスレッドを使用することで、この答えこれは、カスタムで行うことができますtaskScheduler豆:

@Configuration
@EnableScheduling
public class TaskConfiguration {

  @Bean(destroyMethod = "shutdown")
  public Executor taskScheduler() {
    return Executors.Executors.newFixedThreadPool(4,
        new ThreadFactory() {
          public Thread newThread(Runnable r) {
            Thread t = Executors.defaultThreadFactory().newThread(r);
            t.setDaemon(true);
            return t;
          }
        });
  }

}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=218982&siteId=1