上一篇文章记录了下如何在OpenTCS框架下拓展数据库(点此查看上一篇),本篇来继续深入的探讨下如何拓展Kernel。OpenTCS框架主要的作用是提供一个交通管制的框架,但是通常来说,一个完整的调度系统(这里指的是广义的调度系统),是不仅仅只有交通管制的,通常还会有业务层、逻辑层等相关模块一起和OpenTCS构成一个实际可用的系统。一般来说实际项目的架构至少应该是下面的样子:
那么很显然,要想系统更紧凑,OpenTCS-Kernel需要拓展,其实OpenTCS在设计之初就预留了拓展的接口(为OpenTCS的设计者点个赞)。这个接口的定义如下:
//以下代码片段摘取来自OpenTCS.
public interface KernelExtension
extends Lifecycle {
/**
* Returns a name/brief human-readable description for this extension.
*
* @return The name/brief description.
* @deprecated Unused. Will be removed.
*/
@Deprecated
@ScheduledApiChange(when = "5.0", details = "Will be removed.")
default String getName() {
return getClass().getName();
};
}
很显然,这个接口又是拓展的Lifecycle接口,Liftcycle接口定义的接口如下:
//以下代码片段摘取来自OpenTCS.
public interface Lifecycle {
/**
* (Re-)Initializes this component before it is being used.
*/
void initialize();
/**
* Checks whether this component is initialized.
*
* @return <code>true</code> if, and only if, this component is initialized.
*/
boolean isInitialized();
/**
* Terminates the instance and frees resources.
*/
void terminate();
}
因此,我们要使用拓展接口,那就应该提供一个实现体,实现KernelExtention接口,如下:
//以下代码来自白色冰激凌的博客https://blog.csdn.net/xlh145
public class UserKernelExtension implements KernelExtension {
private volatile boolean enabled;
@Override
public boolean isInitialized() {
return enabled;
}
@Override
public void initialize() {
if (enabled) {
return;
}
//TODO 此处做你想做的任何事情,OpenTCS会自动加载你的代码
}
@Override
public void terminate() {
if (!enabled) {
return;
}
enabled = false;
//TODO 此处应该做善后工作
}
}
实际上,OpenTCS的TCP接口,HTTP接口全部是基于本文所述的拓展接口实现的,搞清楚了这些,实现自己的拓展也就清楚明了了。