我根据我对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;
}
}
1)Mbean方法可以返回什么样的对象?例如,如果PoolMBean
有getStatistics()
,则返回totalPool LinkedList
对象。在JConsole
的{{1}}中,值显示为Unavailable
,但当我尝试使用HashMap
String
个对象时,它有效吗?所以JConsole
无法读取所有内容,它可以读到的是我的问题吗?
我已经浏览了Oracle MXBean annotation API doc,这里的描述有点复杂。我从这个链接得到的是OpenType,ArrayType
,CompositeType
,SimpleType
和TabularType
这些只涉及
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,不是吗?
答案 0 :(得分:1)
您的CompositeData
将有一种方法可以返回CompositeType
。该类型定义了CompositeData
的属性名称(键)。 JConsole
和其他JMX客户端可以使用这些密钥访问CompositeData
中的数据。
答案 1 :(得分:1)
回答这个问题可能已经太晚了 - 但是我想在我正在研究JMX时考虑这个问题。
回答的问题:
希望这有帮助。
答案 2 :(得分:0)
我没有运行代码但它看起来很好,如果JMX客户端是Java并且可以访问相同的可序列化类see this link
,则可以返回任何可序列化对象