欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入
主要的代码片段如下(略去命令消息的定义和执行细节):
清单 5. 主要的代码片段
// 升级控制实体关键代码
class UpgradeController extends ActiveObject{
int nready = 0;
int nfinished = 0;
Worker[] workers;
……
// 收到外部升级命令消息时,会触发该方法被调用
public void askForUpgrade() {
for(int i=0; i<workers.length; i++)
workers[i].getTaskQueue().enqueue(new PrepareUpgradeCmd(workers[i]));
}
// 收到工作实体回应的准备就绪命令消息时,会触发该方法被调用
public void readyForUpgrade(String worker_name) {
nready++;
if(nready == workers.length){
for(int i=0; i<workers.length; i++)
workers[i].getControlQueue().enqueue(new
StartUpgradeCmd(workers[i]));
}
}
// 收到工作实体回应的升级完毕命令消息时,会触发该方法被调用
public void finishUpgrade(String worker_name) {
nfinished++;
if(nfinished == workers.length){
for(int i=0; i<workers.length; i++)
workers[i].getControlQueue().enqueue(new
ContineWorkCmd(workers[i]));
}
}
……
}
// 工作实体关键代码
class Worker extends ActiveObject{
UpgradeController ugc;
HotswapCL hscl;
IFoo foo;
String state = “hello world!”;
……
// 收到升级控制实体的准备升级命令消息时,会触发该方法被调用
public void prepareUpgrade() {
switchToControlQueue();
ugc.getMsgQueue().enqueue(new ReadyForUpdateCMD(ugc,this));
}
// 收到升级控制实体的开始升级命令消息时,会触发该方法被调用
public void startUpgrade(String worker_name) {
doUpgrade();
ugc.getMsgQueue().enqueue(new FinishUpgradeCMD(ugc,this));
}
// 收到升级控制实体的继续工作命令消息时,会触发该方法被调用
public void continueWork(String worker_name) {
switchToTaskQueue();
}
// 收到定时命令消息时,会触发该方法被调用
public void doWork() {
foo.sayHello();
}
// 实际升级动作
private void doUpgrade() {
hscl = new HowswapCL(“../swap”, new String[]{“Foo”});
Class cls = hscl.loadClass(“Foo”);
foo = (IFoo)cls.newInstance();
foo.SetState(state);
}
}
//IFoo 接口定义
interface IFoo {
void SetState(String);
void sayHello();
}
在Foo 类第一个版本的实现中,只是把设置进来的字符串直接打印出来。在第二个版本中,会先把设置进来的字符串变为大写,然后打印出来。例子很简单,旨在表达规则或者算法方面的升级变化。另外,我们并没有提及诸如:消息超时、升级失败等方面的异常情况,这在实际产品开发中是必须要考虑的。
在本文中,我们对 Java 在线升级系统中设计的基础技术:类的热替换,进行了详细的讲解。此外,还给出了在线升级系统设计时的一些主要指导原则。为了使读者更好地理解这些技术和原则,我们在最后给出了一个在线升级系统的实例。值得注意的是,构建在线升级系统不仅仅是一个技术问题,还牵扯到很多管理方面的因素,比如:如何管理、部署系统中的可在线升级部分和不可在线升级部分以降低系统的管理、维护成本等。希望本文在读者构建自己的在线升级系统时能够提供一些帮助。
[1][2][3]
打破原先的记录,生活没有预赛,要想登上它的领奖台,