Zeus使用 observer设计模式 ,在Zeus中将不同的操作,不同的状态改变都提炼成不同的事件类型。为不同的事件添加不同的事件监听实例,当事件触发之后,会通知到对这个事件的监听的不同的对象;
private void dispatch(AppEvent event) {
try {
MvcEvent e = new MvcEvent(this, event);
e.setAppEvent(event);
if (fireEvent(BeforeDispatch, e)) {
List<Controller> copy = new ArrayList<Controller>(controllers);
for (Controller controller : copy) {
if (controller.canHandle(event)) {
if (!controller.initialized) {
controller.initialized = true;
controller.initialize();
}
controller.handleEvent(event);
}
}
fireEvent(AfterDispatch, e);
}
} catch (Exception e) {
ScheduleInfoLog.error("dispatch error", e);
}
}
Dispatcher 分发每个事件,除了前置和后置拦截处理BeforeDispatch和AfterDispatch,会通知所有的job控制器,当然如果该事件不需要改job控制器处理,则 controller.handleEvent(event); 直接返回。这里的分发需要注意事件分发非异步,事件非串序;