关于JMX示例的问题

时间:2012-02-14 08:24:22

标签: java jmx

我根据我对MBean的理解编写了示例JMX MBean “PoolMBean”。我写这篇文章来管理和监控连接池。我的问题是,这是Mbeans写的方式吗?此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++;        
        }   


    }

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;   
    }


}

根据以下提供的“yazan jber”答案添加此内容。

1)Mbean方法可以返回什么样的对象?例如,如果PoolMBeangetStatistics(),则返回totalPool LinkedList对象。在JConsole的{​​{1}}中,值显示为Unavailable,但当我尝试使用HashMap String个对象时,它有效吗?所以JConsole无法读取所有内容,它可以读到的是我的问题吗?

我已经浏览了Oracle MXBean annotation API doc,这里的描述有点复杂。我从这个链接得到的是OpenType,ArrayTypeCompositeTypeSimpleTypeTabularType这些只涉及

  • 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.BigInteger
  • java.util.Date
  • javax.management.ObjectName
  • CompositeData.class.getName()
  • TabularData.class.getName()

这些对象。 MBean应该返回OpenType中的任何一个。

如果我们想要返回新类型应该实现CompositeData接口的任何其他类型,我没有太多了解这个实现将如何帮助Jconsole读取打开的对象,这是另一个复杂的问题?

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

3 个答案:

答案 0 :(得分:1)

您的CompositeData将有一种方法可以返回CompositeType。该类型定义了CompositeData的属性名称(键)。 JConsole和其他JMX客户端可以使用这些密钥访问CompositeData中的数据。

答案 1 :(得分:1)

回答这个问题可能已经太晚了 - 但是我想在我正在研究JMX时考虑这个问题。

回答的问题:

  1. 是的,发布的代码在我看来是在应用程序中编写MBean的正确方法。
  2. 建议使用自定义MBean来管理应用程序公开的资源。需要管理的资源通常是设计时决策。但是,从我的理解;我们希望管理会对系统的性能和稳定性产生影响的资源,从而希望进行管理。一个很好的例子是实现Apache Solr管理界面的SoltInfoMBean相关类,以便可以从Solr管理控制台管理这些对象。
  3. 虽然您可以拥有自己的自定义实现来跟踪系统的各个组件,但使用MBean执行跟踪的优势并不仅限于jConsole ** UI支持。通过使用标准JMX接口,您可以使用任何管理应用程序提供开箱即用的管理功能等设施,以确认JMX规范。此外,它还支持对各种通信协议(如RMI,SNMP等)的管理,而无需管理控制台和托管应用程序担心底层协议的细节。 This页面提供了一组很好的理由来使用JMX接口为您的应用程序添加监视功能。
  4. 希望这有帮助。

答案 2 :(得分:0)

我没有运行代码但它看起来很好,如果JMX客户端是Java并且可以访问相同的可序列化类see this link

,则可以返回任何可序列化对象