模仿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方法用于子类实现,从而可以定义自己的独特初始化代码
接下来,我们结合jmx来搞一个具有生命周期的mbean
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当中的一些bean,直接继承BaseLifecycleMBean即可,自己的初始化逻辑和销毁逻辑可以继续实现doStart方法和doStop方法,不过,要注意也要加super.doStart()和super.doStop(),这样做,结合了生命周期和jmx,比较简单和容易了吧。
不过,本文的代码当中有一个bug,不知道各位看官有没有发现呢,哈哈,欢迎各位眼尖的看官指出错在哪里了 :)