spring-boot - 弹簧启动执行器以编程方式连接 jmx
问题描述
我想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
本地连接。我只是不知道如何以编程方式进行。
此处提到的任何其他显式设置端口的尝试均无效。有什么提示吗?
解决方案
启用 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;
}
}
推荐阅读
- php - 使用站点根目录中的子目录作为子域
- java - 运行 localhost 集群时出现异常
- javascript - 使用 expo publish 后应用程序崩溃(OTA 更新)
- amazon-web-services - 在 Clojure 中将 zip 文件上传到 S3
- swift - Alamofire publishDecodable 不会向服务器发送请求,但 responseDecodable 会
- java - Java Hadoop 不完整的 HDFS URI,没有主机
- selenium-webdriver - 从 JMeter Log Viewer 捕获特定的 INFO 级别数据并显示在 JMeter Listener 或 CSV 或 HTML 报告中
- r - 如何在 R 中形成基于 LP 的聚类问题?
- python - 如何在 python 中使用相同的实时摄像头同时读取 QR 码和条形码?
- mysql - Mysql查询确定类型如果按值分组大于1则认为是类型2否则为1