Spring Boot @ManagedResource 组件在 Docker 中启动时在 VisualVM 中不可见,但在本地工作

Spring Boot @ManagedResource component is not visible in VisualVM when launched in Docker but works locally

问题很容易重现。我有一个 Spring 组件:

@Component
@ManagedResource
public class EncryptionUtil {

   ...

    @ManagedOperation
    public String encrypt(String plain) {
       ...
    }

    @ManagedOperation
    public String decrypt(String encrypted) {
       ...
    }
}

当我在本地启动应用程序(使用 IDE)并使用 VisualVM 通过 JMX 连接时,我可以查看和管理 bean:

但是,当我在容器中(也在本地)启动应用程序时,我没有看到 bean。此外,我也没有看到任何 Spring 相关的管理设施:

这是我的 JMX 选择,我在启动 JAR 文件时将其传递到 Dockerfile 入口点:


JMX_OPTS="-Dcom.sun.management.jmxremote=true\
          -Dcom.sun.management.jmxremote.local.only=false\
          -Dcom.sun.management.jmxremote.authenticate=false\
          -Dcom.sun.management.jmxremote.ssl=false\
          -Djava.rmi.server.hostname=$DOCKER_HOST_IP\
          -Dserver.port=$PORT\
          -Dcom.sun.management.jmxremote.port=9090\
          -Dcom.sun.management.jmxremote.rmi.port=9090"

DOCKER_HOST_IP=127.0.0.1 在本地启动时很明显。

问题是,容器中根本无法识别 MBean。

伙计们有什么想法吗? 谢谢

发现解决方案非常简单:将以下内容添加到您的 JMX_OPT 属性:

-Dspring.jmx.enabled=true

详情here