spring 引导执行器以编程方式连接 jmx
spring boot actuator connect jmx programmatically
我想从命令行使用 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
进行本地连接。我只是不知道如何以编程方式进行。
如前所述 任何其他明确设置端口的尝试均无效。有什么提示吗?
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;
}
}
如果您不需要使用 Java SE 6 中引入的 jcmd tool introduced in Java SE 7, and the Attach API 远程连接到应用程序,则有一种更简单的方法。
我写了一篇博客 post 对此进行了详细解释。此处简单copy-paste太大了,下面是相关部分的link。
https://blog.asarkar.com/technical/grpc-kubernetes-spring/#jmx
这不是重复的答案,因为在提出问题时,这个答案并不存在。这个答案已经针对这个问题量身定做了;让我们不要触发快乐的模组。
我想从命令行使用 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
进行本地连接。我只是不知道如何以编程方式进行。
如前所述
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;
}
}
如果您不需要使用 Java SE 6 中引入的 jcmd tool introduced in Java SE 7, and the Attach API 远程连接到应用程序,则有一种更简单的方法。
我写了一篇博客 post 对此进行了详细解释。此处简单copy-paste太大了,下面是相关部分的link。
https://blog.asarkar.com/technical/grpc-kubernetes-spring/#jmx
这不是重复的答案,因为在提出问题时,这个答案并不存在。这个答案已经针对这个问题量身定做了;让我们不要触发快乐的模组。