Я написал образец JMX MBean "PoolMBean" , основанный на моем понимании MBeans.Я написал это, чтобы управлять и контролировать пул соединений.Мой вопрос здесь, это так, как пишут 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?Например, если PoolMBean
имеет getStatistics()
, который возвращает объект totalPool LinkedList
.В этом случае в JConsole
отображается значение Unavailable
, но когда я попытался с HashMap
с String
объектами, это сработало?Так что JConsole
не может прочитать все, что он может прочитать, это мой вопрос здесь
Я прошел через Oracle MXBean 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читать открытые объекты, это еще один сложный вопрос?
Для отслеживания отдельных компонентов в моем приложении у нас должны быть свои собственные MBeans?Если мое понимание верно, я могу использовать простой класс Java для этой цели, дополнительное преимущество, которое я получаю здесь, - это интерфейс JConsole, не так ли?