首页 > 解决方案 > 在 Spring Boot 应用程序中启动 HikariCP 时 JMX 端口上的 SocketTimeoutException

问题描述

使用 HikariCP (v3.4.5) 在 Docker 容器中启动 Spring Boot 应用程序 (Spring Boot v2.35) 时,日志中会出现以下警告:

Picked up JAVA_TOOL_OPTIONS: ... -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=<dockerhostname> -Dcom.sun.management.jmxremote.port=3181 -Dcom.sun.management.jmxremote.rmi.port=3181 -Dcom.sun.management.jmxremote.authenticate=false ....
 
...


2021-06-08 07:22:07.781  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...                                                                                                     
2021-06-08 07:22:08.077  WARN 1 --- [MI TCP Accept-0] sun.rmi.transport.tcp                    : RMI TCP Accept-0: accept loop for ServerSocket[addr=0.0.0.0/0.0.0.0,localport=41775] throws                                    
                                                                                                                                                                                                                                
java.net.SocketTimeoutException: Accept timed out                                                                                                                                                                               
 at java.base/java.net.PlainSocketImpl.socketAccept(Native Method)                                                                                                                                                              
 at java.base/java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:458)                                                                                                                                         
 at java.base/java.net.ServerSocket.implAccept(ServerSocket.java:565)                                                                                                                                                           
 at java.base/java.net.ServerSocket.accept(ServerSocket.java:533)                                                                                                                                                               
 at jdk.management.agent/sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:52)                                                                                                     
 at java.rmi/sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:394)                                                                                                                             
 at java.rmi/sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:366)                                                                                                                                           
 at java.base/java.lang.Thread.run(Thread.java:834)                                                                                                                                                                             
                                                                                                                                                                                                                                
2021-06-08 07:22:08.079  WARN 1 --- [TCP Accept-3181] sun.rmi.transport.tcp                    : RMI TCP Accept-3181: accept loop for ServerSocket[addr=0.0.0.0/0.0.0.0,localport=3181] throws                                  
                                                                                                                                                                                                                                
java.net.SocketTimeoutException: Accept timed out                                                                                                                                                                               
 at java.base/java.net.PlainSocketImpl.socketAccept(Native Method)                                                                                                                                                              
 at java.base/java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:458)                                                                                                                                         
 at java.base/java.net.ServerSocket.implAccept(ServerSocket.java:565)                                                                                                                                                           
 at java.base/java.net.ServerSocket.accept(ServerSocket.java:533)                                                                                                                                                               
 at java.rmi/sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:394)                                                                                                                             
 at java.rmi/sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:366)                                                                                                                                           
 at java.base/java.lang.Thread.run(Thread.java:834)                                                                                                                                                                             
                                                                                                                                                                                                                                
2021-06-08 07:22:08.273  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.                                                                                                

应用程序配置包含

spring:
  datasource:
    hikari:
      register-mbeans: true
  jmx:
    enabled: true

后来通过 VisualVM 进行的 JMX 访问有效,因此警告似乎没有效果。

我猜这可能是一个初始化问题,所以我明确地设置了从 DataSource-Bean 到 Micrometer MeterRegistry-Bean 的依赖关系。但这无济于事。

警告的原因是什么?以及如何摆脱它们?

标签: javaspring-bootjmxhikaricp

解决方案


推荐阅读