【问题标题】:spring boot actuator connect jmx programmatically弹簧启动执行器以编程方式连接 jmx
【发布时间】:2018-05-17 13:23:07
【问题描述】:

我想从命令行使用我的 Spring Boot 2.0.1 应用程序的 shutdown 端点。为此,我只将spring-boot-starter-actuator 添加到我的Gradle 文件中,并在配置中启用了shutdown 端点。

我还创建了一个非常简单的工具,它尝试通过 JMX 连接到正在运行的应用程序。

片段:

String url = "service:jmx:rmi:///jndi/rmi://127.0.01:<which port?>/jmxrmi";
JMXServiceURL serviceUrl = new JMXServiceURL(url);
JMXConnectorFactory.connect(serviceUrl, null); <-- KAPOW!

JMX 工作正常,因为我可以使用jconsole 进行本地连接。我只是不知道如何以编程方式进行。

here 所述,任何其他显式设置端口的尝试均无效。有什么提示吗?

【问题讨论】:

    标签: spring-boot spring-boot-actuator spring-jmx


    【解决方案1】:

    enable jolokia 可能比使用 RMI 更容易;那么你可以简单地

    curl http://localhost:8080/actuator/jolokia/exec/org.springframework.boot:type=Admin,name=SpringApplication/shutdown
    

    编辑

    如果您更喜欢使用 RMI,请参阅Spring Framework JMX Documentation

    服务器应用:

    @SpringBootApplication
    public class So50392589Application {
    
        public static void main(String[] args) {
            SpringApplication.run(So50392589Application.class, args);
        }
    
        @Bean
        public RmiRegistryFactoryBean rmi() {
            RmiRegistryFactoryBean rmi = new RmiRegistryFactoryBean();
            rmi.setPort(1099);
            return rmi;
        }
    
        @Bean
        public ConnectorServerFactoryBean server() throws Exception {
            ConnectorServerFactoryBean fb = new ConnectorServerFactoryBean();
            fb.setObjectName("connector:name=rmi");
            fb.setServiceUrl("service:jmx:rmi://localhost/jndi/rmi://localhost:1099/myconnector");
            return fb;
        }
    
    }
    

    客户端应用:

    @SpringBootApplication
    public class JmxClient {
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(JmxClient.class)
                .web(WebApplicationType.NONE)
                .run(args);
        }
    
        @Bean
        public ApplicationRunner runner(MBeanServerConnection jmxConnector) {
            return args -> {
                jmxConnector.invoke(new ObjectName("org.springframework.boot:type=Admin,name=SpringApplication"),
                        "shutdown", new Object[0], new String[0]);
            };
        }
    
        @Bean
        public MBeanServerConnectionFactoryBean jmxConnector() throws Exception {
            MBeanServerConnectionFactoryBean jmx = new MBeanServerConnectionFactoryBean();
            jmx.setServiceUrl("service:jmx:rmi://localhost/jndi/rmi://localhost:1099/myconnector");
            return jmx;
        }
    
    }
    

    【讨论】:

    • 如果我不必通过 HTTP 提供它,我会更喜欢。如果我正确理解所有内容,它应该只是启用/actuator/shutdown 的配置设置。但是,您的示例看起来很复杂,因此涉足的人不会太容易发现它。
    • 如果您更喜欢使用 RMI,请参阅我的答案的编辑。
    • 是否可以使用属性设置端口而无需编写所有这些样板代码?
    • 如果我的 Spring Boot 应用程序是非 Web 应用程序,我们如何在 jolokia 的 cUrl 示例中设置 8080 端口? @GaryRussell
    • 不要在 cmets 中就 3 岁的答案提出新问题。 Actuator 只需要 web starter。这并不意味着您需要在应用中添加控制器。
    【解决方案2】:

    如果您不需要使用 Java SE 7 中引入的 jcmd 工具和 Java SE 6 中引入的 Attach API 远程连接到应用程序,则有一个更简单的方法。

    我写了一篇博文详细解释了这一点。太大了,这里直接复制粘贴,下面是相关部分的链接。

    https://blog.asarkar.com/technical/grpc-kubernetes-spring/#jmx

    这不是重复的答案,因为在提出问题时,此答案不存在。该答案已针对此问题量身定制;让我们不要触发快乐的模组。

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 2014-08-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      相关资源
      最近更新 更多