私たちの単純なオブジェクトはインターフェイスのライフサイクルに関連するものを定義するためのコードのライフサイクルの側面の模倣でTomcatの
**
* @author :weiguangyue
*
* 具有生命周期start和stop方法的服务对象-->启停服务
*/
interface Lifecycle {
/**
* @description : 启动服务
*/
void start();
/**
* @description : 是否已经启动
*/
boolean isRunning();
/**
* @description : 停止服务
*/
void stop();
/**
* @description : 是否已经停止
*/
boolean isStoped();
}
そして、抽象クラスを実装
/**
* @author :weiguangyue
*
* 基础生命周期
*/
abstract class BaseLifecycle implements Lifecycle{
private enum Status{
UNSTARTED,
RUNNING,
STOPED
}
private Status currentStatus = Status.UNSTARTED;
protected synchronized void checkRunning() {
if(this.currentStatus != Status.RUNNING) {
throw new IllegalStateException("status is not running!!!");
}
}
@Override
public final synchronized boolean isRunning() {
return this.currentStatus == Status.RUNNING;
}
@Override
public final synchronized boolean isStoped() {
return this.currentStatus == Status.STOPED;
}
@Override
public final synchronized void start() {
if(this.currentStatus != Status.UNSTARTED){
return;
}
this.doStart();
this.currentStatus = Status.RUNNING;
}
@Override
public final synchronized void stop() {
if(this.currentStatus != Status.RUNNING) {
return;
}
this.doStop();
this.currentStatus = Status.STOPED;
}
protected abstract void doStart();
protected abstract void doStop();
}
サブクラスが実装するためにあなたがあなた自身のユニークな初期化コードを定義することができるように、我々は、DOSTARTとdoStop方法を予約します
次に、我々は彼の生涯のMBeanを行ってJMXを組み合わせてい
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author :weiguangyue-1571
*
* 基础生命周期MBean对象,继承此类可快速实现MBean注册
*/
public class BaseLifecycleMBean extends BaseLifecycle{
private static final Logger log = LoggerFactory.getLogger(BaseLifecycleMBean.class);
@Override
protected void doStart() {
this.registerMBean();
}
@Override
protected void doStop() {
this.unregisterMBean();
}
private ObjectName getObjectName() {
String packageName = this.getClass().getPackage().getName();
String name = String.format("%s:type=%s_%s",packageName,this.getClass().getName(),this.hashCode());
try {
ObjectName objectName = new ObjectName(name);
return objectName;
} catch (Exception e) {
//ignore
}
return null;
}
private void unregisterMBean() {
try {
ObjectName objectName = this.getObjectName();
if(objectName != null) {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
server.unregisterMBean(objectName);
}
}catch (Exception e) {
log.error("",e);
}
}
private void registerMBean() {
try {
ObjectName objectName = this.getObjectName();
if(objectName != null) {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
if(server.isRegistered(objectName)) {
server.unregisterMBean(objectName);
}
server.registerMBean(this,objectName);
}
}catch (Exception e) {
log.error("",e);
}
}
}
このように、豆のいくつかの中でJMXに登録したい方に、直接の後継BaseLifecycleMBeanができ、super.doStart()とsuper.doStopを追加することも、彼らの初期化ロジックロジックはDOSTART方法とdoStop方法を達成するために続けることができますが、有料の注意を破壊します()そうするためには、ライフサイクルとJMXと組み合わせて、それは比較的単純で簡単です。
しかし、バグがあり、この記事のコードは、私はあなたがそれを発見していないものを私に知らせるかわからない、ハハ、あなたは鋭い目尖ったアウトと間違っているものを私に知らせる歓迎している:)