private static void setExecuteTimeIfNeed(LongJobVO job) { if (job.getExecuteTime() == null) { long time = (System.currentTimeMillis() - job.getCreateDate().getTime()) / 1000; job.setExecuteTime(time); logger.info(String.format("longjob [uuid:%s] set execute time:%d.", job.getUuid(), time)); } }
private void doStartJob(LongJob job, LongJobVO vo, AsyncBackup async) { String longJobUuid = vo.getUuid(); job.start(vo, new ReturnValueCompletion<APIEvent>(async) {
@Override public void success() { updateByUuid(uuid, it -> it.setState(LongJobState.Canceled)); logger.info(String.format("longjob [uuid:%s, name:%s] has been canceled", vo.getUuid(), vo.getName())); completion.success(); }
@Override public void fail(ErrorCode errorCode) { updateByUuid(uuid, it -> it.setState(LongJobState.Failed)); logger.error(String.format("failed to cancel longjob [uuid:%s, name:%s]", vo.getUuid(), vo.getName())); completion.fail(errorCode); } });
@Override public void success(APIEvent evt) { reportProgress("100"); updateByUuid(longJobUuid, it -> { it.setState(LongJobState.Succeeded); if (it.getJobResult() == null || it.getJobResult().isEmpty()) { it.setJobResult("Succeeded"); } }); exts.forEach(ext -> { ext.afterJobFinished(job, vo, evt); }); logger.info(String.format("successfully run longjob [uuid:%s, name:%s]", vo.getUuid(), vo.getName())); }
@Override public boolean start() { collectLongJobs(); LongJobGlobalConfig.LONG_JOB_DEFAULT_TIMEOUT.installValidateExtension(new GlobalConfigValidatorExtensionPoint() { @Override public void validateGlobalConfig(String category, String name, String oldValue, String newValue) throws GlobalConfigException { Long v = Long.valueOf(newValue); if (v < 10800) { throw new GlobalConfigException("long job timeout must be larger than 10800s"); } } }); dbf.installEntityLifeCycleCallback(LongJobVO.class, EntityEvent.PRE_UPDATE, (evt, o) -> { LongJobVO job = (LongJobVO) o; if (job.getExecuteTime() == null && jobCompleted(job)) { long time = (System.currentTimeMillis() - job.getCreateDate().getTime()) / 1000; job.setExecuteTime(time); logger.info(String.format("longjob [uuid:%s] set execute time:%d", job.getUuid(), time)); } }); populateExtensions(); return true; }
@Override public void fail(ErrorCode errorCode) { LongJobVO vo = updateByUuid(longJobUuid, it -> { setStateWhenFail(it, errorCode); if (it.getJobResult() == null || it.getJobResult().isEmpty()) { it.setJobResult("Failed : " + errorCode.toString()); } }); APIEvent evt = new APIEvent(ThreadContext.get(Constants.THREAD_CONTEXT_API)); evt.setError(errorCode); exts.forEach(ext -> { ext.afterJobFailed(job, vo, evt); }); logger.info(String.format("failed to run longjob [uuid:%s, name:%s]", vo.getUuid(), vo.getName())); }
private void cancelLongJob(String uuid, Completion completion) { LongJobVO vo = updateByUuid(uuid, it -> it.setState(LongJobState.Canceling)); LongJob job = longJobFactory.getLongJob(vo.getJobName()); logger.info(String.format("longjob [uuid:%s, name:%s] has been marked canceling", vo.getUuid(), vo.getName())); job.cancel(vo, new Completion(completion) { @Override public void success() { updateByUuid(uuid, it -> it.setState(LongJobState.Canceled)); logger.info(String.format("longjob [uuid:%s, name:%s] has been canceled", vo.getUuid(), vo.getName())); completion.success(); } @Override public void fail(ErrorCode errorCode) { updateByUuid(uuid, it -> it.setState(LongJobState.Failed)); logger.error(String.format("failed to cancel longjob [uuid:%s, name:%s]", vo.getUuid(), vo.getName())); completion.fail(errorCode); } }); }
private void doLoadLongJob(LongJobVO vo, LongJobOperation operation) { if (operation == null) { operation = getLoadOperation(vo); } if (operation == LongJobOperation.Start) { // launch the waiting jobs ThreadContext.put(Constants.THREAD_CONTEXT_API, vo.getApiId()); LongJob job = longJobFactory.getLongJob(vo.getJobName()); ThreadContext.put(Constants.THREAD_CONTEXT_TASK_NAME, job.getClass().toString()); doStartJob(job, vo, null); SQL.New(LongJobVO.class).eq(LongJobVO_.uuid, vo.getUuid()).set(LongJobVO_.state, LongJobState.Running).update(); } else if (operation == LongJobOperation.Resume) { ThreadContext.put(Constants.THREAD_CONTEXT_API, vo.getApiId()); LongJob job = longJobFactory.getLongJob(vo.getJobName()); ThreadContext.put(Constants.THREAD_CONTEXT_TASK_NAME, job.getClass().toString()); logger.info(String.format("start to resume longjob [uuid:%s, name:%s]", vo.getUuid(), vo.getName())); job.resume(vo); dbf.update(vo); } }
@Override public void run(SyncTaskChain chain) { final APIDeleteAccountEvent evt = new APIDeleteAccountEvent(msg.getId()); LongJobVO vo = dbf.findByUuid(msg.getUuid(), LongJobVO.class); dbf.remove(vo); logger.info(String.format("longjob [uuid:%s, name:%s] has been deleted", vo.getUuid(), vo.getName())); bus.publish(evt); chain.next(); }
@Override protected List<LongJobVO> scripts() { // check long jobs using same uuid with current node List<LongJobVO> vos = Q.New(LongJobVO.class) .eq(LongJobVO_.managementNodeUuid, Platform.getManagementServerId()) .eq(LongJobVO_.state, LongJobState.Running) .list(); vos.forEach(vo -> { if (destinationMaker.isManagedByUs(vo.getUuid())) { vo.setJobResult("Failed because management node restarted."); vo.setState(LongJobState.Failed); merge(vo); } }); vos = Q.New(LongJobVO.class).isNull(LongJobVO_.managementNodeUuid).list(); vos.removeIf(it -> !destinationMaker.isManagedByUs(it.getUuid())); vos.forEach(it -> { it.setManagementNodeUuid(Platform.getManagementServerId()); merge(it); }); return vos; } }.execute();
@Override public void run(SyncTaskChain chain) { SubmitLongJobReply reply = new SubmitLongJobReply(); LongJobVO vo = updateByUuid(msg.getJobUuid(), it -> it.setState(LongJobState.Running)); // launch the long job right now ThreadContext.put(Constants.THREAD_CONTEXT_API, vo.getApiId()); LongJob job = longJobFactory.getLongJob(vo.getJobName()); ThreadContext.put(Constants.THREAD_CONTEXT_TASK_NAME, job.getClass().toString()); doStartJob(job, vo, msg); reply.setInventory(LongJobInventory.valueOf(vo)); if (job.getAuditType() != null) { reply.setNeedAudit(true); } logger.info(String.format("longjob [uuid:%s, name:%s] has been started", vo.getUuid(), vo.getName())); bus.reply(msg, reply); chain.next(); }
vo.setLastOpDate(now); vo = dbf.updateAndRefresh(vo); logger.info(String.format("longjob [uuid:%s, name:%s] has been re-submitted", vo.getUuid(), vo.getName())); vo.setAccountUuid(msg.getAccountUuid()); vo = dbf.persistAndRefresh(vo); msg.setJobUuid(vo.getUuid()); tagMgr.createTags(msg.getSystemTags(), msg.getUserTags(), vo.getUuid(), LongJobVO.class.getSimpleName()); logger.info(String.format("new longjob [uuid:%s, name:%s] has been created", vo.getUuid(), vo.getName()));
private LongJobVO createSuccessLongJob(APISubmitLongJobMsg msg) { // create LongJobVO LongJobVO vo = new LongJobVO(); if (msg.getResourceUuid() != null) { vo.setUuid(msg.getResourceUuid()); } else { vo.setUuid(Platform.getUuid()); } if (msg.getName() != null) { vo.setName(msg.getName()); } else { vo.setName(msg.getJobName()); } vo.setDescription(msg.getDescription()); vo.setApiId(ThreadContext.getImmutableContext().get(Constants.THREAD_CONTEXT_API)); vo.setJobName(msg.getJobName()); vo.setJobData(msg.getJobData()); vo.setState(LongJobState.Succeeded); vo.setJobResult(LongJobState.Succeeded.toString()); vo.setTargetResourceUuid(msg.getTargetResourceUuid()); vo.setManagementNodeUuid(Platform.getManagementServerId()); vo.setAccountUuid(msg.getSession().getAccountUuid()); vo = dbf.persistAndRefresh(vo); msg.setJobUuid(vo.getUuid()); tagMgr.createTags(msg.getSystemTags(), msg.getUserTags(), vo.getUuid(), LongJobVO.class.getSimpleName()); return vo; }
private void handle(APIRerunLongJobMsg msg) { APIRerunLongJobEvent evt = new APIRerunLongJobEvent(msg.getId()); SubmitLongJobMsg smsg = new SubmitLongJobMsg(); LongJobVO job = dbf.findByUuid(msg.getUuid(), LongJobVO.class); smsg.setJobUuid(job.getUuid()); smsg.setDescription(job.getDescription()); smsg.setJobData(job.getJobData()); smsg.setJobName(job.getJobName()); smsg.setName(job.getName()); smsg.setTargetResourceUuid(job.getTargetResourceUuid()); smsg.setResourceUuid(job.getUuid()); smsg.setSystemTags(msg.getSystemTags()); smsg.setUserTags(msg.getUserTags()); smsg.setAccountUuid(msg.getSession().getAccountUuid()); bus.makeLocalServiceId(smsg, LongJobConstants.SERVICE_ID); bus.send(smsg, new CloudBusCallBack(msg) { @Override public void run(MessageReply rly) { SubmitLongJobReply reply = rly.castReply(); evt.setInventory(reply.getInventory()); bus.publish(evt); } }); }
public LongJobInventory(LongJobVO vo) { this.setUuid(vo.getUuid()); this.setName(vo.getName()); this.setState(vo.getState()); this.setApiId(vo.getApiId()); this.setJobData(vo.getJobData()); this.setJobResult(vo.getJobResult()); this.setJobName(vo.getJobName()); this.setCreateDate(vo.getCreateDate()); this.setLastOpDate(vo.getLastOpDate()); this.setExecuteTime(vo.getExecuteTime()); this.setDescription(vo.getDescription()); this.setTargetResourceUuid(vo.getTargetResourceUuid()); this.setManagementNodeUuid(vo.getManagementNodeUuid()); }