public void handleEvent(MvcEvent e) {
EventType type = e.getType();
if (type == Dispatcher.BeforeDispatch) {
beforeDispatch(e);
} else if (type == Dispatcher.AfterDispatch) {
afterDispatch(e);
}
}
DispatcherListener處理事件的入口是 handleEvent,里面有兩個具體的處理,已在在分發事件之前BeforeDispatch,一個在分發事件之后AfterDispatch;
AddJobListener
如果是新增操作,這里進行處理,添加controller
public void beforeDispatch(MvcEvent mvce) {
if(mvce.getAppEvent() instanceof JobMaintenanceEvent){
JobMaintenanceEvent event=(JobMaintenanceEvent)mvce.getAppEvent();
String jobId=event.getJobId();
boolean exist=false;
for(Controller c:new ArrayList<Controller>(context.getDispatcher().getControllers())){
if(c instanceof JobController){
JobController jc=(JobController)c;
if(jc.getJobId().equals(jobId)){
exist=true;
break;
}
}
}
if(!exist){//新增操作
JobController controller=new JobController(context,master, jobId);
context.getDispatcher().addController(controller);
controller.handleEvent(new AppEvent(Events.Initialize));
mvce.setCancelled(true);
log.error("schedule add job with jobId:"+jobId);
}
}
}
DebugListener
任務失敗的監聽
當任務失敗,需要發送郵件給相關人員
public void beforeDispatch(MvcEvent mvce) {
try {
if(mvce.getAppEvent() instanceof DebugFailEvent){
final DebugFailEvent event=(DebugFailEvent) mvce.getAppEvent();
DebugHistory history=event.getHistory();
FileDescriptor fd=fileManager.getFile(history.getFileId());
String msg="調試任務:"+fd.getName()+" 運行失敗";
//此處可以發送IM消息
}else if(mvce.getAppEvent() instanceof DebugSuccessEvent){
final DebugSuccessEvent event=(DebugSuccessEvent) mvce.getAppEvent();
DebugHistory history=event.getHistory();
FileDescriptor fd=fileManager.getFile(history.getFileId());
String msg="調試任務:"+fd.getName()+" 運行成功"; //此處可以發送IM消息
}
} catch (Exception e) {
//處理異常,防止后續的依賴任務受此影響,無法正常執行
log.error("失敗任務,發送通知出現異常",e);
}
}
JobFailListener
任務失敗的監聽
當任務失敗,需要發送郵件給相關人員
public void beforeDispatch(MvcEvent mvce) {
try {
if(mvce.getAppEvent() instanceof JobFailedEvent){
final JobFailedEvent event=(JobFailedEvent) mvce.getAppEvent();
final String jobId=event.getJobId();
final String causeJobId=event.getJobException().getCauseJobId();
if(chainLocal.get()==null || !chainLocal.get().getCauseJobId().equals(causeJobId)){
GroupBean gb=readOnlyGroupManager.getGlobeGroupBean();
chainLocal.set(new ChainException(causeJobId, gb));
}
final ChainException chain=chainLocal.get();
final JobBean jobBean=chain.gb.getAllSubJobBeans().get(jobId);
final ZeusUser owner=userManager.findByUid(jobBean.getJobDescriptor().getOwner());
//延遲6秒發送郵件,保證日志已經輸出到數據庫
new Thread(){
public void run() {
try {
Thread.sleep(6000);
StringBuffer sb=new StringBuffer();
sb.append("Job任務(").append(jobId).append(")").append(jobBean.getJobDescriptor().getName()).append("運行失敗");
sb.append("<br/>");
String type="";
if(event.getTriggerType()==TriggerType.MANUAL){
type="手動觸發";
}else if(event.getTriggerType()==TriggerType.MANUAL_RECOVER){
type="手動恢復";
}else if(event.getTriggerType()==TriggerType.SCHEDULE){
type="自動調度";
}
sb.append("Job任務的觸發類型為:"+type).append("<br/>");
if(event.getHistory()!=null){
sb.append("失敗原因:"+jobHistoryManager.findJobHistory(event.getHistory().getId()).getLog().getContent().replaceAll("\\n", "<br/>"));
String msg= "Zeus報警 JobId:"+jobId+" 任務運行失敗";
if(!jobBean.getDepender().isEmpty()){
msg+=",影響范圍:"+getDependencyJobs(jobBean);
}
if(!causeJobId.equalsIgnoreCase(event.getJobId())){
msg+="(根本原因:job "+causeJobId+"運行失敗)";
}
mailAlarm.alarm(event.getHistory().getId(), msg, sb.toString());
}
} catch (Exception e) {
log.error("郵件發送出現異常",e);
}
};
}.start();
String msg="Job任務("+jobId+"-"+owner.getName()+"):"+jobBean.getJobDescriptor().getName()+" 運行失敗";
if(!jobBean.getDepender().isEmpty()){
msg+=",影響范圍:"+getDependencyJobs(jobBean);
}
if(!causeJobId.equalsIgnoreCase(event.getJobId())){
msg+="(根本原因:job "+causeJobId+"運行失敗)";
} //手機報警
//只發送自動調度的報警 并且只在下班時間 或者周末發送
if(event.getHistory().getTriggerType()==TriggerType.SCHEDULE){
Calendar now=Calendar.getInstance();
int hour=now.get(Calendar.HOUR_OF_DAY);
int day=now.get(Calendar.DAY_OF_WEEK);
if(day==Calendar.SATURDAY || day==Calendar.SUNDAY || hour<9 || hour>18){
smsAlarm.alarm(event.getHistory().getId(), "宙斯報警", "宙斯"+msg,chain);
}
}
}
} catch (Exception e) {
//處理異常,防止后續的依賴任務受此影響,無法正常執行
log.error("失敗任務,發送通知出現異常",e);
}
}
JobSuccessListener
public void beforeDispatch(MvcEvent mvce) {
try {
if(mvce.getAppEvent() instanceof JobSuccessEvent){
final JobSuccessEvent event=(JobSuccessEvent) mvce.getAppEvent();
if(event.getTriggerType()==TriggerType.SCHEDULE){
return;
}
JobHistory history=jobHistoryManager.findJobHistory(event.getHistoryId());
final JobDescriptor jd=groupManager.getJobDescriptor(history.getJobId()).getX();
if(history.getOperator()!=null){
//此處可以發送IM消息
}
}
} catch (Exception e) {
//處理異常,防止后續的依賴任務受此影響,無法正常執行
log.error("失敗任務,發送通知出現異常",e);
}
}
StopScheduleJobListener
阻止Job任務進行自動調度(包含自動調度和手動恢復)
預發環境下使用
預發環境不允許運行自動調度,手動恢復,只能運行手動調度
public void beforeDispatch(MvcEvent mvce) {
if(mvce.getAppEvent().getType()==Events.Initialize){
//取消初始化事件,放置Job進行出錯任務重試,以及開啟定時器
mvce.setCancelled(true);
}
}