简单生命周期对象

模仿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,不知道各位看官有没有发现呢,哈哈,欢迎各位眼尖的看官指出错在哪里了 :)

猜你喜欢

转载自www.cnblogs.com/weiguangyue/p/12297182.html
今日推荐