2

我想shutdown从命令行使用我的 Spring Boot 2.0.1 应用程序的端点。为此,我只将其添加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本地连接。我只是不知道如何以编程方式进行。

此处提到的任何其他显式设置端口的尝试均无效。有什么提示吗?

4

2 回答 2

1

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

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

编辑

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

服务器应用程序:

@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;
    }

}
于 2018-05-17T15:23:39.380 回答
-1

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

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

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

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

于 2020-09-28T05:46:15.917 回答