我有一个简单的Spring Boot应用程序,使用org.apache.commons.dbcp2.BasicDataSource作为dataSource bean.
Spring引导自动将数据源公开为MBean.
bean声明:
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl(dbUrl);
dataSource.setDriverClassName(jdbcDriver);
dataSource.setUsername(dbUserName);
dataSource.setPassword(dbPassword);
return dataSource;
}
Run Code Online (Sandbox Code Playgroud)
一切正常.但是,我在关闭应用程序时看到错误.只有在运行可执行jar时才会出现此错误.使用Gradle Spring插件(gradle bootRun)时,不会显示.
javax.management.InstanceNotFoundException: org.apache.commons.dbcp2:name=dataSource,type=BasicDataSource
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1095)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.exclusiveUnregisterMBean(DefaultMBeanServerInterceptor.java:427)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.unregisterMBean(DefaultMBeanServerInterceptor.java:415)
at com.sun.jmx.mbeanserver.JmxMBeanServer.unregisterMBean(JmxMBeanServer.java:546)
at org.apache.commons.dbcp2.BasicDataSource.close(BasicDataSource.java:1822)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.beans.factory.support.DisposableBeanAdapter.invokeCustomDestroyMethod(DisposableBeanAdapter.java:350)
at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:273)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:540)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:516)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:827)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:485)
at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:921)
at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:895)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.doClose(EmbeddedWebApplicationContext.java:152)
at org.springframework.context.support.AbstractApplicationContext$1.run(AbstractApplicationContext.java:809)
Run Code Online (Sandbox Code Playgroud)
我想知道,1.这个bean如何作为JMX MBean公开?2.如何正确注销这个MBean?
有什么类似于Spring JMX导出器没有使用Spring框架吗?
SimpleJMX似乎是合理的,但似乎也是一个非常年轻的框架,只有一个人推动.
我需要公开一大堆属性,方法和类作为JMX,但不想摆弄JMX API并编写大量的JMX接口.
并且没有办法在项目中引入Spring(以防你问).非常感谢任何提示或想法:-)
我正在尝试编写一个示例 JMX 应用程序。这是我的 MBean 类:
package com.pramati.jmx;
@Component
@ManagedResource(objectName="modelMBean:type=simple-calculator",
description="Calculator performing basic arithmetic on integers")
public class SimpleCalculator {
private int operand1;
private int operand2;
public SimpleCalculator() {
System.out.println("SimpleCalculator - MBean created!!");
}
@ManagedOperation(description="Addition operation")
public int add() {
return operand1 + operand2;
}
@ManagedOperation(description="Multiplication operation")
public int multiply() {
return operand1 * operand2;
}
@ManagedOperation(description="Division operation")
@ManagedOperationParameters({
@ManagedOperationParameter(name="operand1", description="Dividend"),
@ManagedOperationParameter(name="operand2", description="Divisor")
})
public int divide(int operand1, int operand2) {
if(operand2 == 0) {
throw new IllegalArgumentException("Can not divide by …
Run Code Online (Sandbox Code Playgroud) 使用 JMX 导出器和 Prometheus 监控 Spring boot 应用程序(TestMonitoring)。Prometheus 和 Spring Boot 应用程序 Pod 已在 kubernetes 集群中启动并运行。现在的难题是让 JMX 导出器运行,并且应用程序应该通过 JMX 公开指标。
在 TestMonitoring 应用程序中,application.properties 文件具有以下设置:
endpoints.jmx.enabled=true
spring.jmx.enabled=true
Run Code Online (Sandbox Code Playgroud)
现在如何安装 JMX 导出器作为代理:我已经下载了 jar 并执行:
java -javaagent:./jmx_prometheus_javaagent-0.9.jar=1234:config.yml
Run Code Online (Sandbox Code Playgroud)
在config.yml中->以下hostPort:xx.xxx:30001(作为服务提供的myspring boot应用程序的目标端口)
抛出以下异常:
Sep 22, 2017 4:12:31 PM
io.prometheus.jmx.shaded.io.prometheus.jmx.JmxCollector collect
SEVERE: JMX scrape failed: java.io.IOException: Failed to retrieve RMIServer stub: javax.naming.CommunicationException [R oot exception is java.rmi.ConnectIOException: non-JRMP server at remote endpoint]
at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:370)
at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:268)
at io.prometheus.jmx.shaded.io.prometheus.jmx.JmxScraper.doScrape(JmxScraper.java:106)
at io.prometheus.jmx.shaded.io.prometheus.jmx.JmxCollector.collect(JmxCollector.java:401)
at io.prometheus.jmx.shaded.io.prometheus.client.CollectorRegistry.collectorNames(CollectorRegistry.java:99)
at io.prometheus.jmx.shaded.io.prometheus.client.CollectorRegistry.register(CollectorRegistry.java:50)
at io.prometheus.jmx.shaded.io.prometheus.client.Collector.register(Collector.java:128)
at io.prometheus.jmx.shaded.io.prometheus.client.Collector.register(Collector.java:121) …
Run Code Online (Sandbox Code Playgroud) 我有 2 个 Spring Boot 应用程序。
application_A 依赖于 application_B
实际上每个应用程序都有主类标记为@SpringBootApplication
application_B
启动成功但application_A
无法启动:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springApplicationAdminRegistrar' defined in class path resource [org/springframework/boot/autoconfigure/admin/SpringApplicationAdminJmxAutoConfiguration.class]: Invocation of init method failed; nested exception is javax.management.InstanceAlreadyExistsException: org.springframework.boot:type=Admin,name=SpringApplication # JMX name of the application admin MBean.
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
at pack.Application.main(Application.java:36)
Caused by: …
Run Code Online (Sandbox Code Playgroud) 我想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!
Run Code Online (Sandbox Code Playgroud)
JMX 正在工作,因为我可以使用它jconsole
进行本地连接。我只是不知道如何以编程方式完成它。
任何其他显式设置此处提到的端口的尝试都不起作用。有什么提示吗?
我试图通过JMX启用我的核心Java应用程序以实现远程访问.但是,有两个限制使它变得比它应该更难.
a)我无权更改在linux机器上启动应用程序的脚本.因此,我无法将任何"jmxremote"参数传递给jvm.
b)com.sun.management.jmxremote.port = xxxx
我指定的远程端口()很可能没有打开,我无法修改脚本来尝试另一个开放端口.我必须自动完成.
我试图通过编写一个类来解决这些限制,设置所有必需的jmxremote参数以及找到"免费"端口.
public class JmxRemoteConnectionHelper{
@Override
public void init( ) throws Exception{
InetAddress address = InetAddress.getLocalHost();
String ipAddress = address.getHostAddress();
String hostname = address.getHostName();
String port = String.valueOf( getFreePort( ) );
System.setProperty("java.rmi.server.hostname", ipAddress );
System.setProperty("com.sun.management.jmxremote", "true" );
System.setProperty("com.sun.management.jmxremote.authenticate", "false" );
System.setProperty("com.sun.management.jmxremote.ssl", "false" );
System.setProperty("com.sun.management.jmxremote.port", port );
}
private final int getFreePort( ){
**//seedPort is passed in the constructor**
int freePort = seedPort;
ServerSocket sSocket = null;
for( int i=ZERO; i<PORT_SCAN_COUNTER; i++ ){
try{
freePort …
Run Code Online (Sandbox Code Playgroud) 我已经将Spring注释添加到我的代码中但是当通过visual vm连接时,方法"myExample()"没有显示在JMX bean列表中
我的代码:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.stereotype.Component;
@Component
@ManagedResource
public class MyClass {
@Autowired
private Example exampleService;
@ManagedAttribute
public String myExample() {
return exampleService.getSomething().toString();
}
}
Run Code Online (Sandbox Code Playgroud)
知道为什么会这样吗?
我对千分尺相当陌生,并且在我的 Spring Boot 应用程序中的基本设置方面遇到了一些问题。
代码:
MeterRegistry registry = new SimpleMeterRegistry();
Timer timer = registry.timer("app.event", "type","ping");
timer.record(System.currentTimeMillis() - date.getTime(),TimeUnit.MILLISECONDS);
Run Code Online (Sandbox Code Playgroud)
我尝试使用 jconsole 在 jmx 中查找名称为 ping 的 bean,但找不到它。我相信我在这里缺少一些基本的东西,但不确定真正的原因。我也尝试遵循千分尺文档,但它似乎解释了千分尺的不同功能,而没有太多示例。我非常感谢对此的任何帮助。
我曾经org.springframework.jmx.export.annotation.@ManagedOperation
把一个方法公开为MBean.
我希望操作名称与方法名称不同,但托管操作没有任何属性.
例如:
@ManagedOperation
public synchronized void clearCache()
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
我希望使用name ="ResetCache"公开此操作.
使用java/Spring/Ibatis sqlserver
的数据库,并datasource
在org.apache.commons.dbcp.BasicDataSource
下面的数据源对象我要揭露实时连接池指望像现在有多少人在使用,有多少闲置的,我想使用监视jmx
任何快速的想法如何实现
<bean id="wssModelDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="net.sourceforge.jtds.jdbcx.JtdsDataSource"/>
<property name="url" value="com.wss.jdbc.ConnectionUrl=jdbc:jtds:sqlserver://x-x2/x_control_QA;appName=wss;sendStringParametersAsUnicode=false;loginTimeout=20;socketTimeout=180"/>
<property name="username" value="xxx"/>
<property name="password" value="xxx"/>
<property name="maxActive" value="10"/>
<property name="maxWait" value="10000"/>
</bean>
Run Code Online (Sandbox Code Playgroud) 队列大小没有getter,只有队列容量.
如果我使用jmx来监视ThreadPoolTaskExecutor,我如何监视队列大小级别以确保它是健康的?
spring-jmx ×12
java ×7
jmx ×7
spring ×7
spring-boot ×4
mbeans ×2
jmxtrans ×1
micrometer ×1
prometheus ×1
simplejmx ×1
spring-jdbc ×1