java - Spring Boot @ManagedResource 组件在 Docker 中启动时在 VisualVM 中不可见,但可以在本地运行

标签 java docker jmx spring-jmx

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

@Component
@ManagedResource
public class EncryptionUtil {

   ...

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

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

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

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

enter image description here

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


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

关于java - Spring Boot @ManagedResource 组件在 Docker 中启动时在 VisualVM 中不可见,但可以在本地运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61958642/

相关文章:

java - 由于 freeMemory() 仅报告长期存在的对象,如何跟踪 Java 中的任何对象创建?

java - java 按位或错误

java - 如何获取两层组件中的文本

java - 在 jTextField 中设置突出显示颜色

docker - 使用 docker-compose 在容器中安装 docker-machine VM 文件夹

jvm - 从非 Java 客户端通过 JMX 调用/监控 JVM

java - Vaadin数据模型接口(interface)关系解释

docker - 通过示例将容器发布到 docker

security - 安全地运行 docker

java - 无法使 MXBean 通过 JConsole 连接到数据库