Java 关于JMX示例的问题

Java 关于JMX示例的问题,java,jmx,Java,Jmx,基于我对MBean的理解,我编写了示例JMX MBean“PoolMBean”。我写这篇文章是为了管理和监视连接池。我的问题是,MBean是这样写的吗?此Mbean代码中是否存在与连接池无关的问题 1) Mbean方法可以返回什么类型的对象 package pool; import java.util.Date; public class Connection { public Date createdAt; protected int u

基于我对MBean的理解,我编写了示例JMX MBean“PoolMBean”。我写这篇文章是为了管理和监视连接池。我的问题是,MBean是这样写的吗?此Mbean代码中是否存在与连接池无关的问题

1) Mbean方法可以返回什么类型的对象

 package pool;

    import java.util.Date;

    public class Connection {

        public Date createdAt;
        protected int usedCount;
        protected boolean isAvailable = true;

        public Connection newConnection(){
            Connection con= null;
            /**
             * Code for creating Connection
             */
             return con;
        }

        public void writeDate(){

            /**
             * Code to write data in the stream
             */
            usedCount++;        
        }   


    }



根据下面提供的“yazan jber”答案添加了此选项。 1) Mbean方法可以返回什么类型的对象?例如,如果
PoolMBean
具有返回totalPool
LinkedList
对象的
getStatistics()
。在本例中,在
JConsole
中,值显示为
Unavailable
,但当我尝试使用
HashMap
String
对象时,它是否起作用?所以
JConsole
不能读取所有内容,我的问题是它能读取什么

我已经看过了,这里的描述有点复杂。我从这个链接中得到的是,有
OpenType、ArrayType
CompositeType
SimpleType
tablerType
这些只处理

  • java.lang.Void
  • java.lang.Boolean
  • java.lang.Character
  • java.lang.Byte
  • java.lang.Short
  • java.lang.Integer
  • java.lang.Long
  • java.lang.Float
  • java.lang.Double
  • java.lang.String
  • java.math.BigDecimal
  • java.math.biginger
  • java.util.Date
  • javax.management.ObjectName
  • CompositeData.class.getName()
  • tablerdata.class.getName()
这些东西
MBean
应返回以下任何一个
OpenType

如果我们想返回新类型应该实现的任何其他类型的
CompositeData
接口,我不知道这个实现将如何帮助Jconsole读取打开的对象,这是另一个复杂的问题


要跟踪我的应用程序中的单个组件,我们应该有自己的MBean吗?如果我的理解是正确的,我可以使用简单的java类来实现这个目的,我在这里得到的额外好处是JConsole UI,不是吗?

我没有运行代码,但它看起来很好,如果JMX客户机是java,并且可以访问相同的可序列化类,那么您可以返回任何可序列化对象,您的
复合数据将有一个方法返回其
复合类型。该类型定义了
复合数据的属性名称(键)
JConsole
和其他JMX客户端可能会使用这些键从
CompositeData

中访问数据回答这个问题可能已经太晚了-但是鉴于我目前正在研究JMX,我想尝试一下

回答的问题:

  • 是的,在我看来,发布的代码是在应用程序中编写MBean的正确方法
  • 建议使用自定义的MBean来管理应用程序公开的资源。哪些资源需要管理通常是设计时的决策。但据我了解,;我们希望管理对系统性能和稳定性有影响的资源,因此希望进行管理。一个很好的例子是实现管理接口的相关类,这样就可以从Solr管理控制台管理这些对象
  • 虽然您可以使用自己的自定义实现来跟踪系统的各个组件,但使用MBean执行跟踪的优势并不限于jConsole**UI支持。通过使用标准JMX接口,您可以为符合JMX规范的任何管理应用程序提供开箱即用的管理功能。此外,它还支持对各种通信协议(如RMI)的管理,没有管理控制台和受管应用程序的SNMP etc担心底层协议的本质。页面提供了一系列使用JMX接口向应用程序添加监控功能的理由

  • 希望这有帮助。

    您能重新检查更新后的问题吗?我不能在这里添加我的完整评论,因此作为问题本身的一部分添加。谢谢
    package pool;
    
    import java.lang.management.ManagementFactory;
    import java.util.ArrayList;
    import java.util.LinkedList;
    
    import javax.management.MBeanServer;
    import javax.management.ObjectName;
    
    public class ConnectionPool {
        public static int maxPoolSize = 20;
        public int currentPoolSize = 10;
        public LinkedList<Connection> totalPool = new LinkedList<Connection>();
        public LinkedList<Connection> availablePool = new LinkedList<Connection>();
        public static ConnectionPool cp = new ConnectionPool();
        private ConnectionPool(){
    
        }
    
        public synchronized Connection getConnection(){
            Connection con = null;
            /**
             * 
             */
            availablePool.remove(con);
            con.isAvailable = false;
            return con;
        }
    
        public synchronized void returnConnection(Connection con){
    
            /**
             * 
             */
            availablePool.addFirst(con);
            con.isAvailable = true;     
        }
    
        public static void main(String a[]){
            try{
            MBeanServer server = ManagementFactory.getPlatformMBeanServer();
            Pool mbean = new Pool();
            ObjectName name = new ObjectName("test.conMbean:key1=Pool");
            server.registerMBean(mbean, name);
            System.out.println("Let me see out put");
            System.in.read();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }
    
    package pool;
    
    
    public interface PoolMBean {
    
        public int getCurrentPoolSize();
    
        public int getMaxPoolSize();
    
        public void setMaxPoolSize(int maxSize);    
    
    }
    
    package pool;
    
    
    public class Pool implements PoolMBean {
    
        @Override
        public int getCurrentPoolSize() {
    
            return ConnectionPool.cp.currentPoolSize;
        }
    
        @Override
        public int getMaxPoolSize() {   
            return ConnectionPool.maxPoolSize;
        }
    
        @Override
        public void setMaxPoolSize(int maxSize) {
            ConnectionPool.maxPoolSize = maxSize;   
        }
    
    
    }