标签: spring-jmx

关闭Spring Boot应用程序时无法注销DataSource JMX MBean

我有一个简单的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?

java spring jmx spring-jmx spring-boot

19
推荐指数
1
解决办法
1万
查看次数

JMX导出框架类似于Spring JMX导出器

有什么类似于Spring JMX导出器没有使用Spring框架吗?

SimpleJMX似乎是合理的,但似乎也是一个非常年轻的框架,只有一个人推动.

我需要公开一大堆属性,方法和类作为JMX,但不想摆弄JMX API并编写大量的JMX接口.

并且没有办法在项目中引入Spring(以防你问).非常感谢任何提示或想法:-)

jmx spring-jmx simplejmx

5
推荐指数
1
解决办法
502
查看次数

使用注释声明 bean 时,JMX MBean 未显示在 JConsole 上

我正在尝试编写一个示例 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)

java spring jmx mbeans spring-jmx

5
推荐指数
1
解决办法
8405
查看次数

如何配置JMX导出器来监控Prometheus中的Spring Boot应用程序

使用 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)

jmx spring-jmx prometheus

5
推荐指数
1
解决办法
5202
查看次数

BeanCreationException:创建名为“springApplicationAdminRegistrar”的 bean 时出错。实例已经存在异常

我有 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)

java spring spring-jmx spring-boot

5
推荐指数
1
解决办法
2万
查看次数

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!
Run Code Online (Sandbox Code Playgroud)

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

任何其他显式设置此处提到的端口的尝试都不起作用。有什么提示吗?

spring-jmx spring-boot spring-boot-actuator

5
推荐指数
1
解决办法
4684
查看次数

以编程方式启用远程jmx监视

我试图通过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)

java jmx spring-jmx

4
推荐指数
1
解决办法
2183
查看次数

Java Spring Framework jmx托管注释@ManagedAttribute未在MBeanServerConnection/Jconsole/Visual vm/bean列表中显示方法

我已经将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)

知道为什么会这样吗?

java spring spring-annotations spring-jmx

4
推荐指数
1
解决办法
3145
查看次数

如何在 Spring Boot 应用程序中将千分尺与 jmx 一起使用?

我对千分尺相当陌生,并且在我的 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,但找不到它。我相信我在这里缺少一些基本的东西,但不确定真正的原因。我也尝试遵循千分尺文档,但它似乎解释了千分尺的不同功能,而没有太多示例。我非常感谢对此的任何帮助。

java spring spring-jmx spring-boot micrometer

4
推荐指数
1
解决办法
9096
查看次数

Spring JMX中@ManagedOperation的名称

我曾经org.springframework.jmx.export.annotation.@ManagedOperation把一个方法公开为MBean.

我希望操作名称与方法名称不同,但托管操作没有任何属性.

例如:

@ManagedOperation
public synchronized void clearCache() 
{
   // do something
}
Run Code Online (Sandbox Code Playgroud)

我希望使用name ="ResetCache"公开此操作.

java spring jmx mbeans spring-jmx

3
推荐指数
2
解决办法
4785
查看次数

使用jmx的Spring数据源连接管理器来公开实时连接数

使用java/Spring/Ibatis sqlserver的数据库,并datasourceorg.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)

connection-pooling spring-jdbc spring-jmx

2
推荐指数
1
解决办法
4651
查看次数

Spring框架监视ThreadPoolTask​​Executor队列大小

我检查http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/concurrent/ThreadPoolTask​​Executor.html

队列大小没有getter,只有队列容量.

如果我使用jmx来监视ThreadPoolTask​​Executor,我如何监视队列大小级别以确保它是健康的?

spring jmx spring-jmx jmxtrans

2
推荐指数
1
解决办法
3589
查看次数