<executor className="user.jobengine.server.steps.ArchiveListBuilderStep" maxConcurrent="1"/>\r
<executor className="user.jobengine.server.steps.ArchiveMaterialSubmitStep" maxConcurrent="1"/>\r
<executor className="user.jobengine.server.steps.BatchRetrieveForkStep" maxConcurrent="10"/>\r
+ <executor className="user.jobengine.server.steps.CancelableStep" maxConcurrent="10"/>\r
<executor className="user.jobengine.server.steps.CheckLOWRESIntegrity" maxConcurrent="1"/>\r
<executor className="user.jobengine.server.steps.CheckMORPHEUSMissingMaterialsStep" maxConcurrent="1"/>\r
<executor className="user.jobengine.server.steps.CheckTRAFFICMissingMaterialsStep" maxConcurrent="1"/>\r
package user.jobengine.server.steps;\r
\r
import user.jobengine.server.IJobRuntime;\r
-import user.jobengine.server.steps.JobStep;\r
-import user.jobengine.server.steps.StepEntry;\r
\r
public class CancelableStep extends JobStep {\r
int count = 10;\r
- \r
+\r
@StepEntry\r
public Object[] execute(IJobRuntime jobRuntime) {\r
try {\r
for (int i = 0; i < count; i++) {\r
- if (!canContinue())\r
+ if (jobRuntime.isWaitingCancel() || jobRuntime.isWaitingSuspend())\r
break;\r
- Thread.sleep(100);\r
- jobRuntime.incrementProgress((i + 1)*count);\r
+ Thread.sleep(1000);\r
+ jobRuntime.incrementProgress((i + 1) * count);\r
}\r
} catch (Exception e) {\r
e.printStackTrace();\r
<custom-attributes org.zkoss.zul.listbox.initRodSize="50" />\r
<custom-attributes org.zkoss.zul.listbox.preloadSize="50" />\r
\r
- <div id="scdiv" width="100%" height="100%" apply="org.zkoss.bind.BindComposer" viewModel="@id('jlm') @init('user.jobengine.zk.model.JobListModel')">\r
+ <div id="scdiv" width="100%" height="100%" viewModel="@id('jlm') @init('user.jobengine.zk.model.JobListModel')">\r
<timer id="timer" delay="500" repeats="true" onTimer="@command('uiTick')" />\r
\r
<toolbar>\r
<spinner constraint="no empty,min 1 max 50" value="@bind(jlm.newPriority)" width="60px" disabled="@load(jlm.updatePriorityDisabled)" />\r
<toolbarbutton label="Repriorizálás" iconSclass="z-icon-asterisk" onClick="@command('changeJobsPriority')" disabled="@load(jlm.updatePriorityDisabled)" autodisable="self"/>\r
+ <toolbarbutton label="Feladat leállítása" iconSclass="z-icon-times-circle" onClick="@command('cancelJobs')" autodisable="self"/>\r
<separator orient="vertical"/>\r
<toolbarbutton label="Futtatás" iconSclass="z-icon-play" onClick="@command('executeJob')" autodisable="self"/>\r
<toolbarbutton label="Összes letiltása" iconSclass="z-icon-ban" mode="toggle" checked="@bind(jlm.allExecutionDisabled)" autodisable="self"/>\r
\r
boolean isService();\r
\r
- boolean isWaiting();\r
+ boolean isWaitingCancel();\r
+\r
+ boolean isWaitingExecutor();\r
+\r
+ boolean isWaitingSuspend();\r
\r
Object popFromStack();\r
\r
@Override
public IJobRuntime getJobById(long jobId) {
- if (!submittedJobs.containsKey(jobId))
- throw new NullPointerException("job");
+ if (!submittedJobs.containsKey(jobId)) {
+ logger.warn("Job not exists anymore {}. Possible canceled already.", jobId);
+ }
return submittedJobs.get(jobId);
}
public void processJobStepCompletedMessage(IJobMessage message) {
// TODO cancel nem megy, valszeg itt van gubasz
IJobRuntime jobRuntime = getJobById(message.getJobId());
+ if (jobRuntime == null) {
+ //a cancel hamarabb megjott?
+ }
JobStepCompletedMessage m = (JobStepCompletedMessage) message;
putOutputsToStack(jobRuntime, m.getOutputs());
statusMachine.processAction(JobAction.DONE, jobRuntime);
}
@Override
- public boolean isWaiting() {
- return ((getStatus().getValue() & 0x0100) == 0x0100);
+ public boolean isWaitingExecutor() {
+ return getStatus() == JobStatus.WAIT_EXECUTOR;
+ }
+
+ @Override
+ public boolean isWaitingCancel() {
+ return getStatus() == JobStatus.WAIT_CANCEL;
+ }
+
+ @Override
+ public boolean isWaitingSuspend() {
+ return getStatus() == JobStatus.WAIT_SUSPEND;
}
@Override
String name = jobJSON.getString("name");\r
String template = jobJSON.getString("template");\r
sj.setJobId(String.format("%s.%s", template, name));\r
- sj.setJobName(name);\r
+ if (StringUtils.isEmpty(name))\r
+ sj.setJobName(template);\r
+ else\r
+ sj.setJobName(name);\r
+\r
sj.setTemplateName(template);\r
sj.setCronExpressions(NoSQLUtils.asString(jobJSON, "cronexpression"));\r
sj.setExecuteOnStartup(NoSQLUtils.asBool(jobJSON, "executeimmediate"));\r
\r
@Override\r
public boolean canContinue() {\r
- return !jobRuntime.isWaiting();\r
+ return !jobRuntime.isWaitingExecutor();\r
}\r
\r
protected <T> T check(T value, String name) {\r
import user.jobengine.server.IJobRuntime;\r
import user.jobengine.server.JobChangedEvent;\r
import user.jobengine.server.JobEngine;\r
+import user.jobengine.server.messages.CancelRequest;\r
import user.jobengine.zk.util.SessionUtil;\r
\r
public class JobListModel extends AsyncBaseModel implements IJobChangedListener {\r
private boolean scheduledExecutionDisabled;\r
private Collection<BasicDBObject> selectedJobs;\r
\r
+ @Command\r
+ public void cancelJobs() {\r
+ if (this.jobList.getSelection() != null) {\r
+ for (IJobRuntime job : this.jobList.getSelection()) {\r
+ jobEngine.sendMessage(new CancelRequest(job.getId()));\r
+ }\r
+ }\r
+ }\r
+\r
@Command\r
public void changeJobsPriority() {\r
if (this.jobList.getSelection() != null) {\r
// Fixture
sut.setStatus(JobStatus.RUNABLE);
// Exercise, Verify
- assertFalse(sut.isWaiting());
+ assertFalse(sut.isWaitingExecutor());
// Fixture
sut.setStatus(JobStatus.SUSPENDED);
// Exercise, Verify
- assertFalse(sut.isWaiting());
+ assertFalse(sut.isWaitingExecutor());
// Fixture
sut.setStatus(JobStatus.EXECUTING);
// Exercise, Verify
- assertFalse(sut.isWaiting());
+ assertFalse(sut.isWaitingExecutor());
// Fixture
sut.setStatus(JobStatus.FINISHED);
// Exercise, Verify
- assertFalse(sut.isWaiting());
+ assertFalse(sut.isWaitingExecutor());
// Fixture
sut.setStatus(JobStatus.WAIT_EXECUTOR);
// Exercise, Verify
- assertTrue(sut.isWaiting());
+ assertTrue(sut.isWaitingExecutor());
// Fixture
sut.setStatus(JobStatus.WAIT_SUSPEND);
// Exercise, Verify
- assertTrue(sut.isWaiting());
+ assertTrue(sut.isWaitingExecutor());
// Fixture
sut.setStatus(JobStatus.WAIT_USERMESSAGE);
// Exercise, Verify
- assertTrue(sut.isWaiting());
+ assertTrue(sut.isWaitingExecutor());
}
@Test(expected = IllegalStateException.class)