论坛首页 编程语言技术论坛

服务器状态监控-状态模式

浏览 3255 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-10-29  

 某日,终于开始开发MOS引擎了,说起这个名称还真是有点NB,光是名称而已。哈哈!

MOS(Mini Operation System),微型操作系统,简称MOS,此引擎相当于一个操作系统,说白一点其实也就是一个服务器框架,可以加载N个服务,开发人员只需要继承服务接口,就可以开发相对应的功能,就像window系统里面的服务那样!

框架开发好之后,以后就只需要不断开发服务就行了,框架依然正常运行!

 

既然是一个服务容器,那应该就是一个不断运行的东西,然后里面可以装一些东西,打个比喻就是像tomcat,我们可以讲war包直接扔进webapp目录下,它就能够运行这个项目。如果说MOS相对于Tomcat,那war包就相对于开发人员开发的服务。

 

Tomcat也有启动,关闭之类的,还有启动之后就会自动解压war包,没看过Tomcat的源码,但是估计也就是启动的时候有相关的事件通知,说到事件通知前段时间刚学了一招,观察者模式,呵呵...有兴趣的可以去看看我的博客,欢迎欢迎@

 

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来是改变了其类。书本上的描述状态模式就这样的,不过我感觉就是晦涩难懂,定义都不明所以。我先提两个问题:

1,服务器启动的时候该干什么?

2,服务器停止的时候该干什么?

解答:

@1:服务器启动的时候就加载服务

@2:服务器停止的时候通知服务停止,最后才关闭服务器

 

再问:服务器启动的时候谁知道呢?告诉谁呢?

@3:启动的时候应该有事件通知,通知服务器启动,可以干点什么了(加载服务)

 

于是:那应该得用个什么变量来保存保存服务器的状态,让别人(服务)知道服务器已经启动了,可以加载。

为什么要这样呢?

打个比喻,在学校的时候,你是喜欢饭堂阿姨煮好饭之后去宿舍叫一下你来吃饭,还是你喜欢隔一段时间就去饭堂看看饭煮好了没?

 

状态模式的口号就是:见风使舵

 

好了,于是就来了一个类,

1,服务器状态

 

package cn.std.mos.core.state;

abstract public class State {

	public static final String STARTING = "STARTING";
	public static final String STOPPING = "STOPPING";
	public static final String PAUSING = "PAUSING";
	public static final String RUNNING = "RUNNING";
	public static final String PAUSE = "PAUSE";
	public static final String STOP = "STOP";
	/** 服务器状态 */
	private String status;
	
	/** 状态对应描述 */
	private String desc;
	
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	public String getDesc() {
		return desc;
	}
	public void setDesc(String desc) {
		this.desc = desc;
	}
	
}

 

 

2,各种状态,都继承State这个状态类,例如StartServerState,启动状态

 

package cn.std.mos.core.state;

public class StartServerState extends State {

	static class SingletonHolder{
		static StartServerState instance = new StartServerState();
	}
	
	public static synchronized StartServerState getInstance(){
		return SingletonHolder.instance;
	}
	
	private StartServerState() {
		// TODO Auto-generated constructor stub
		this.setStatus(STARTING);
		this.setDesc("服务器正在启动");
		
		//此处启动开机启动加载的服务
	}
}

 

 3,运行状态

 

package cn.std.mos.core.state;

public class RunServerState extends State {

	static class SingletonHolder{
		static RunServerState instance = new RunServerState();
		
	}
	
	public static RunServerState getInstance(){
		return SingletonHolder.instance;
	}
	
	private RunServerState() {
		// TODO Auto-generated constructor stub
		this.setStatus(RUNNING);
		this.setDesc("服务器正在运行");
	}
}

 

 4,停止状态

package cn.std.mos.core.state;

public class StopServiceState extends State {

	static class SingletonHolder{
		static StopServiceState instance = new StopServiceState();
		
	}
	
	public static StopServiceState getInstance(){
		return SingletonHolder.instance;
	}
	
	private StopServiceState() {
		// TODO Auto-generated constructor stub
		this.setStatus(STOP);
		this.setDesc("服务器已停止");
	}
}

 还有其他状态,我不写了!

这里说明,状态类中使用内部静态类,实际就是单例模式,共享状态资源!

 

那现在看看怎么使用:

package cn.std.mos.core.state;

public class client {

	private State state;
	public State getState() {
		return state;
	}
	public void setState(State state) {
		this.state = state;
		System.out.println("服务器状态:"+getState().getStatus());
	}
	public static void main(String[] args) {
		client c = new client();
		c.setState(StartServerState.getInstance());
	}
}

 

其实状态模式也就是将很复杂的状态切换的逻辑分开来,放到别的类去定义。嗯,好像没怎么描述明白,我回去再看看书!哈哈,另外附上我的MOS引擎,才刚开始写,反正服务框架是有了,继承AbstractService接口,可以进行开发自己的服务,大家提供点意见也行,加入跟我一起开发也行,哈哈,仅限菜鸟,大牛级人物就别来打击我了!哈哈!

还有附上运行图片:


  • MOS.rar (2.4 MB)
  • 下载次数: 76
  • 大小: 16.6 KB
   发表时间:2012-10-29  
听起来貌似相当不错,继续关注···
0 请登录后投票
   发表时间:2012-10-30  
好像不错,希望博主多多说下关于这种系统的设计
0 请登录后投票
   发表时间:2012-10-30  
zhongmin2012 写道
好像不错,希望博主多多说下关于这种系统的设计

呵呵,我也是刚弄,纯属个人想法来的,看来以后写完代码之后得写写说明文档什么的,免得以后忘记,呵呵,多谢围观,哈哈
0 请登录后投票
   发表时间:2012-10-30  
你这跟状态模式没关系啊,状态模式是一种行为模式,简单说就是 某个东西有固定的操作(method),但是在不同状态下有不同的行为反应; 但是你的例子里面,所有的状态只有状态描述,没有影响其他行为,这算不上状态模式。

打个比方来说,你有一个服务注册器:
Register{
register(String name, Object serviceDefinition)
{

}

unregister(String name)
{
}
}

你就可以为这个注册器实现两个状态, StandByState extends Register, StartedState extends Register, 在StandBy里面注册和注销只需要修改一些服务定义信息,Started里面注册注销就要真正的修改服务的实例。

那么这样是不是就状态模式了,还不是; 这只是策略模式,即为不同的状态设置了不同的操作策略;
状态模式还有一个特征:“内在状态”,即这个状态是对象内部的,他的状态并非是外部强制赋予的,而是他自己在操作过程中更改了自己的状态:
还是以Register为例,我们把他改为SericeContext,加上两个方法 Start/Pause, 让这两个方法修改SericeContext自己的运行状态,并且赋予不同的行为。
0 请登录后投票
   发表时间:2012-10-30  
Shen.Yiyang 写道
你这跟状态模式没关系啊,状态模式是一种行为模式,简单说就是 某个东西有固定的操作(method),但是在不同状态下有不同的行为反应; 但是你的例子里面,所有的状态只有状态描述,没有影响其他行为,这算不上状态模式。

打个比方来说,你有一个服务注册器:
Register{
register(String name, Object serviceDefinition)
{

}

unregister(String name)
{
}
}

你就可以为这个注册器实现两个状态, StandByState extends Register, StartedState extends Register, 在StandBy里面注册和注销只需要修改一些服务定义信息,Started里面注册注销就要真正的修改服务的实例。

那么这样是不是就状态模式了,还不是; 这只是策略模式,即为不同的状态设置了不同的操作策略;
状态模式还有一个特征:“内在状态”,即这个状态是对象内部的,他的状态并非是外部强制赋予的,而是他自己在操作过程中更改了自己的状态:
还是以Register为例,我们把他改为SericeContext,加上两个方法 Start/Pause, 让这两个方法修改SericeContext自己的运行状态,并且赋予不同的行为。

多谢指点!
状态模式跟策略模式很像,贼像!
对于我这个例子来说,服务器启动,就有一个状态START,启动之后就变成了RUNNING,停止之后就变成了STOP,那个应该标志为服务器状态ServerState,然后其他什么服务那些都只是根据服务器的状态的改变来进行启动和停止,其实已经跟服务器状态模式没有关系了!呵呵...我是这样理解...您说的也很有道理,我回去再看看书,再研究研究,呵呵...多谢多谢!
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics