},\r
{\r
"template": "test-fork-cancelable.xml",\r
+ "active": false,\r
+ "executeimmediate": true,\r
+ "cronexpression": "0/5 * * * * ? *",\r
"parameters": [ {"name": "itemID", "value": 1, "type": "java.lang.Long"} ]\r
},\r
{\r
<?xml version="1.0" encoding="UTF-8"?>\r
<executors>\r
\r
- <executor className="HarrisMissingMaterialCheckerStep.java" maxConcurrent="1" isRemote="false" />\r
- <executor className="CancelableStep.java" maxConcurrent="1"/>\r
- <executor className="FakeStep.java" maxConcurrent="20" isRemote="false" />\r
- <executor className="MergeStep.java" maxConcurrent="20" isRemote="false" />\r
+ <executor className="CancelableStep.java" maxConcurrent="20"/>\r
<executor className="TestForkCancelableStep.java" maxConcurrent="10" isRemote="false" />\r
- <executor className="RegisterUserRestoreStep.java" maxConcurrent="3" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.RegisterVODRestoreStep" maxConcurrent="3" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.ArchiveListBuilderStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.ArchiveMaterialSubmitStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.BatchRetrieveForkStep" maxConcurrent="10" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.CancelableStep" maxConcurrent="10" isRemote="true" />\r
- <executor className="user.jobengine.server.steps.CheckLOWRESIntegrity" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.CheckMORPHEUSMissingMaterialsStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.CheckTRAFFICMissingMaterialsStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.CleanupMountedLocationStep" maxConcurrent="10" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.ProjectCleanupMountedLocationStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.CopyForArchiveNEXIOMaterialsStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.CopyForArchiveNEXIORecordingsStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.CreateMissingLowresStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.DeleteNEXIOMaterialsStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.DetectMissingLengthStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.DeleteFileStep" maxConcurrent="100" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.DownloadRecordingFromNexioStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.DuplicateRemoverStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.FakeStep" maxConcurrent="20" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.FileCopyStep" maxConcurrent="10" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.GenerateMorpheusMetadataStep" maxConcurrent="10" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.HSMMigrateStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.ImportMORPHEUSMissingMaterialsStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.ImportStatisticsStep" maxConcurrent="7" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.MetadataTransformStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.MXFCutterStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.OutputPathAndNameSelectorStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.RecordingsArchiveItemBuilderStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.SyncOCTOPUSDataStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.SubmitChildStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.TranscodeFFAStranStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.TranscodeSELENIOStep" maxConcurrent="4" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.TranscodeStep" maxConcurrent="4" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.TSMBackupStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.TSMExtendedRetrieveStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.TSMRestoreStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.TSMSystemRestoreStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.TSMRetrieveMissingMaterialStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.UploadRecordingToNexioStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.MediaToolStep" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.UpdateGhostMediaData" maxConcurrent="1" isRemote="false" />\r
- <executor className="user.jobengine.server.steps.WorkerKeepAliveStep" maxConcurrent="1" isRemote="false" />\r
+ \r
+<!-- <executor className="HarrisMissingMaterialCheckerStep.java" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="FakeStep.java" maxConcurrent="20" isRemote="false" /> -->\r
+<!-- <executor className="MergeStep.java" maxConcurrent="20" isRemote="false" /> -->\r
+<!-- <executor className="RegisterUserRestoreStep.java" maxConcurrent="3" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.RegisterVODRestoreStep" maxConcurrent="3" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.ArchiveListBuilderStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.ArchiveMaterialSubmitStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.BatchRetrieveForkStep" maxConcurrent="10" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.CancelableStep" maxConcurrent="10" isRemote="true" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.CheckLOWRESIntegrity" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.CheckMORPHEUSMissingMaterialsStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.CheckTRAFFICMissingMaterialsStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.CleanupMountedLocationStep" maxConcurrent="10" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.ProjectCleanupMountedLocationStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.CopyForArchiveNEXIOMaterialsStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.CopyForArchiveNEXIORecordingsStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.CreateMissingLowresStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.DeleteNEXIOMaterialsStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.DetectMissingLengthStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.DeleteFileStep" maxConcurrent="100" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.DownloadRecordingFromNexioStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.DuplicateRemoverStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.FakeStep" maxConcurrent="20" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.FileCopyStep" maxConcurrent="10" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.GenerateMorpheusMetadataStep" maxConcurrent="10" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.HSMMigrateStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.ImportMORPHEUSMissingMaterialsStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.ImportStatisticsStep" maxConcurrent="7" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.MetadataTransformStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.MXFCutterStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.OutputPathAndNameSelectorStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.RecordingsArchiveItemBuilderStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.SyncOCTOPUSDataStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.SubmitChildStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.TranscodeFFAStranStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.TranscodeSELENIOStep" maxConcurrent="4" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.TranscodeStep" maxConcurrent="4" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.TSMBackupStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.TSMExtendedRetrieveStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.TSMRestoreStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.TSMSystemRestoreStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.TSMRetrieveMissingMaterialStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.UploadRecordingToNexioStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.MediaToolStep" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.UpdateGhostMediaData" maxConcurrent="1" isRemote="false" /> -->\r
+<!-- <executor className="user.jobengine.server.steps.WorkerKeepAliveStep" maxConcurrent="1" isRemote="false" /> -->\r
</executors>
\ No newline at end of file
@StepEntry\r
public Object[] execute(int param) throws Exception {\r
try {\r
- getJobRuntime().setRelated("TESZT1");\r
+ getJobRuntime().setRelated("TESZT" + param);\r
\r
// ftpTest();\r
\r
// private static final String CHILD_TEMPLATE = "fake-concurrent.xml";\r
private static final String CHILD_TEMPLATE = "cancelable.xml";\r
private static final Logger logger = LogManager.getLogger();\r
- int count = 5;\r
+ int count = 1000;\r
\r
@StepEntry\r
public Object[] execute(IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
- //jobRuntime.forkPrepare();\r
+ jobRuntime.forkPrepare();\r
for (int i = 0; i < count; i++) {\r
+ if (getJobRuntime().isWaitingCancel())\r
+ break;\r
//jobEngine.submit(jobRuntime, null, CHILD_TEMPLATE, CHILD_TITLE, ListUtils.asMap("itemID", i));\r
// IJobRuntime runtime = jobEngine.submit(jobRuntime, null, CHILD_TEMPLATE, "JOB " + i, ListUtils.asMap("param", i));\r
- IJobRuntime runtime = getEngine().submit(null, e -> {\r
+ IJobRuntime runtime = getEngine().submit(getJobRuntime(), e -> {\r
if (e.getStatus().equals(JobStatus.CANCELED) || e.getStatus().equals(JobStatus.SUSPENDED))\r
logger.info("Cleanup occured because status is {} {}", e.getStatus(), ((IJob) e.getSource()).getId());\r
}, CHILD_TEMPLATE, "JOB " + i, 0, IJobEngine.DEFAULT_OWNER, ListUtils.asMap("param", i));\r
runtime.setRelated("TEST" + runtime.getId());\r
}\r
\r
- // jobRuntime.forkWaitComplete();\r
+ jobRuntime.forkWaitComplete();\r
logger.info("Done");\r
return null;\r
}\r
void addJobChangedEventListener(IJobChangedListener listener);
+ void addManagedJobChangedListener(IJobChangedListener listener);
+
void addStepExecutor(IJobStepExecutor executor);
void addToExecutorQueue(IJobRuntime jobRuntime);
void jobCleanup(IJobRuntime jobRuntime);
+ void keepAliveJobChangedListener(IJobChangedListener listener);
+
void keepAliveWorker(String remoteAddr);
void loadExecutors();
void removeFromRunQueue(IJobRuntime jobRuntime);
+ void removeGarbage();
+
void removeJob(long id);
void removeJobChangedEventListener(IJobChangedListener listener);
void removeSpanwChild(IJobRuntime jobRuntime);
- void removeGarbage();
-
ClusteredJob requestJob(String className) throws Exception;
+ void restartGracefully() throws Exception;
+
void sendMessage(IJobMessage jobMessage);
void setAllExecutionDisabled(boolean isDisabled);
/**
* A v�grehajt� elind�t�sa.
*/
- void startup(IJobEngine jobEngine) throws Exception;
+ void startup(IJobEngine jobEngine);
ClusteredJob steelJob() throws InterruptedException;
*/
public class JobEngine implements IJobEngine {
+ private class JobChangedListenerChecker extends Thread {
+ private volatile boolean shutdown = false;
+
+ @Override
+ public void run() {
+ try {
+ barrier.await();
+ } catch (Exception e) {
+ }
+
+ while (!shutdown) {
+ try {
+ Thread.sleep(1000);
+ removeJobChangedListenerGarbage();
+ } catch (InterruptedException e) {
+ shutdown = true;
+ }
+ }
+ }
+
+ void shutDown() {
+ shutdown = true;
+ try {
+ join();
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+
private class MessageDispatcher extends Thread {
private volatile boolean shutdown = false;
private final Map<Long, IJobRuntime> submittedJobs;
private final Map<String, IProgram> programs;
private final Map<String, IJobStepExecutor> executors;
- private VM worker;
+ private VM vm;
private MessageDispatcher dispatcher;
+ private JobChangedListenerChecker jobChangedListenerChecker;
private IUserMessageQueues userMessageQueues;
private final CyclicBarrier barrier;
private Map<String, LocalDate> remoteWorkers;
private String masterServerAddress = System.getProperty("jobengine.master.server", "");
private final JobEngineRemote remoteEngine;
+ private ConcurrentHashMap<IJobChangedListener, Long> keepAliveJobChangedListeners = new ConcurrentHashMap<>();
/**
* A MAM motor pĂ©ldányosĂtása. Ennek során lĂ©trejönnek a várakozási sorok, az ĂĽtemezĹ‘ szál, az ĂĽzenet kezelĹ‘ szál.
executors = new LinkedHashMap<String, IJobStepExecutor>();
submittedJobs = createJobs();
- barrier = new CyclicBarrier(3);
+ barrier = new CyclicBarrier(4);
nextJobId = new AtomicLong(0);
programs = new HashMap<String, IProgram>();
statusMachine = createStatusMachine();
}
}
+ @Override
+ public void addManagedJobChangedListener(IJobChangedListener listener) {
+ if (listener != null) {
+ jobChangedListenerList.add(listener);
+ keepAliveJobChangedListeners.put(listener, System.currentTimeMillis());
+ logger.info("Managed listener added");
+ }
+ }
+
@Override
public void addStepExecutor(IJobStepExecutor executor) {
//Class<IJobStep> stepClass = executor.getStepClass();
statusMachine.processAction(JobAction.FINISH, jobRuntime);
}
+ @Override
+ public void keepAliveJobChangedListener(IJobChangedListener listener) {
+ if (keepAliveJobChangedListeners != null)
+ keepAliveJobChangedListeners.put(listener, System.currentTimeMillis());
+ }
+
@Deprecated
@Override
public void keepAliveWorker(String remoteAddr) {
public void removeJobChangedEventListener(IJobChangedListener listener) {
if (listener != null) {
jobChangedListenerList.remove(listener);
- logger.info("Listeners left {}", jobChangedListenerList.size());
}
}
+ synchronized protected void removeJobChangedListenerGarbage() {
+ List<IJobChangedListener> toBeRemoved = new ArrayList<>();
+
+ for (IJobChangedListener listener : keepAliveJobChangedListeners.keySet()) {
+ long lastMod = keepAliveJobChangedListeners.get(listener);
+ if (System.currentTimeMillis() - lastMod > 5 * 1000)
+ toBeRemoved.add(listener);
+ }
+ toBeRemoved.forEach(r -> {
+ logger.info("Removing listener");
+ removeJobChangedEventListener(r);
+ keepAliveJobChangedListeners.remove(r);
+ });
+ }
+
@Override
public void removeSpanwChild(IJobRuntime jobRuntime) {
IJobRuntime parent = getJobById(jobRuntime.getParentJobId());
return job;
}
+ @Override
+ public void restartGracefully() throws Exception {
+ isRunning = false;
+ if (schedulerService != null)
+ schedulerService.shutdown();
+
+ vm.shutDown();
+ shutdownExecutors();
+
+ logger.info("JobEngine gracefully stopped");
+
+ loadPrograms();
+ loadExecutors();
+
+ vm.start();
+
+ startupExecutors();
+
+ schedulerService = new SchedulerService(this);
+ schedulerService.startup();
+ isRunning = true;
+ }
+
@Override
public void sendMessage(IJobMessage jobMessage) {
messageQueue.add(jobMessage);
if (schedulerService != null)
schedulerService.shutdown();
- worker.shutDown();
+ vm.shutDown();
shutdownExecutors();
dispatcher.shutDown();
+ jobChangedListenerChecker.shutDown();
try {
TSMClient.CleanUpMultithread();
loadPrograms();
loadExecutors();
- worker = new VM();
+ vm = new VM();
dispatcher = new MessageDispatcher();
userMessageQueues = new UserMessageQueues();
+ jobChangedListenerChecker = new JobChangedListenerChecker();
- worker.start();
+ vm.start();
dispatcher.start();
+ jobChangedListenerChecker.start();
- for (IJobStepExecutor executor : executors.values())
- executor.startup(this);
+ startupExecutors();
barrier.await();
schedulerService = new SchedulerService(this);
}
+ private void startupExecutors() {
+ for (IJobStepExecutor executor : executors.values())
+ executor.startup(this);
+ }
+
@Override
public void storeJob(IJobRuntime runtime) {
submittedJobs.put(runtime.getId(), runtime);
}
private void runStepObject(IJobRuntime jobRuntime, Object[] inputs) throws Throwable {
+ jobRuntime.setStatus(JobStatus.EXECUTING);
+ jobRuntime.NotifyUpdate();
+
IJobStep step = createStepObject();
if (step == null)
throw new Exception("Step object is null");
- jobRuntime.setStatus(JobStatus.EXECUTING);
- jobRuntime.NotifyUpdate();
logger.debug("{} executing", jobRuntime);
jobRuntime.incrementPriority();
Object[] outputs = step.run(jobEngine, jobRuntime, inputs);
}
@Override
- public void startup(IJobEngine jobEngine) throws Exception {
- if (jobEngine == null)
- throw new NullPointerException("jobEngine");
+ public void startup(IJobEngine jobEngine) {
this.jobEngine = jobEngine;
if (workers != null) {
for (Worker w : workers)
private IJobEngine jobEngine = null;\r
private BasicDBList scheduleJobs;\r
\r
- public SchedulerService(IJobEngine jobEngine) throws Exception {\r
+ public SchedulerService(IJobEngine jobEngine) {\r
// http://www.quartz-scheduler.org/documentation/quartz-2.2.x/configuration/\r
// https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm\r
this.jobEngine = jobEngine;\r
<!-- masodpercben -->\r
<!-- <session-timeout>900</session-timeout> -->\r
</session-config>\r
-\r
+ \r
+ <desktop-config>\r
+ <desktop-timeout>2</desktop-timeout>\r
+ </desktop-config>\r
+ \r
<system-config>\r
<label-location>/resources/i3-label_hu.properties</label-location>\r
</system-config>\r
<listener>\r
<listener-class>user.jobengine.zk.util.DesktopCleanupListener</listener-class>\r
</listener>\r
-<!-- <listener> -->\r
-<!-- <listener-class>user.jobengine.zk.util.SessionCleanupListener</listener-class> -->\r
-<!-- </listener> -->\r
+ <listener>\r
+ <listener-class>user.jobengine.zk.util.SessionCleanupListener</listener-class>\r
+ </listener>\r
<!-- <listener> -->\r
<!-- <listener-class>user.jobengine.zk.util.WebAppCleanupListener</listener-class> -->\r
<!-- </listener> -->\r
<?xml version="1.0" encoding="UTF-8"?>\r
<?taglib uri="http://www.zkoss.org/dsp/web/core" prefix="c" ?>\r
<?init class="user.jobengine.zk.util.AdminAuthInitiator"?>\r
+<?page id="joblist"?>\r
<zk xmlns:w="http://www.zkoss.org/2005/zk/client" xmlns:ca="client/attribute" xmlns:x="xhtml">\r
<style>\r
.z-progressmeter { height: 16px; border: 1px solid #cfcfcf; background: #fff 0 0 repeat-x; text-align: left; overflow: hidden; // background-image:\r
<toolbarbutton label="NEXIO szinkronizálás" iconSclass="z-icon-renren" onClick="@command('restartNexio')" visible="${not sessionScope.nexioDisable}" autodisable="self"/>\r
</toolbar>\r
\r
- <div width="100%" onAfterSize='chart.setWidth(new Integer(event.getWidth()))'>\r
- <charts id="chart" type="spline" title="Feladatok" marginRight="10"/>\r
- </div>\r
+<!-- <div width="100%" onAfterSize='chart.setWidth(new Integer(event.getWidth()))'> -->\r
+<!-- <charts id="chart" type="spline" title="Feladatok" marginRight="10"/> -->\r
+<!-- </div> -->\r
\r
<div height="100%" width="100%">\r
<groupbox height="94%" closable="false">\r
\r
private List<UITask> uiTasks = new ArrayList<>();\r
\r
+ protected void doKeepAlive() {\r
+\r
+ }\r
+\r
protected void notifyChange(String... names) {\r
List<String> nameList = Arrays.asList(names);\r
nameList.forEach(name -> BindUtils.postNotifyChange(null, null, this, name));\r
\r
@Command\r
public void uiTick() {\r
+ doKeepAlive();\r
synchronized (uiTasks) {\r
for (UITask task : uiTasks) {\r
task.execute();\r
import static java.util.stream.Collectors.toList;\r
\r
import java.util.Arrays;\r
-import java.util.Calendar;\r
import java.util.HashSet;\r
import java.util.List;\r
import java.util.Map;\r
import org.zkoss.bind.annotation.ContextType;\r
import org.zkoss.bind.annotation.Init;\r
import org.zkoss.bind.annotation.NotifyChange;\r
-import org.zkoss.chart.Charts;\r
-import org.zkoss.chart.Options;\r
-import org.zkoss.chart.PlotLine;\r
-import org.zkoss.chart.Point;\r
-import org.zkoss.chart.Series;\r
import org.zkoss.zk.ui.Component;\r
import org.zkoss.zk.ui.Executions;\r
import org.zkoss.zk.ui.event.Event;\r
private String searchText;\r
private JobStatus searchStatus;\r
private List<JobStatus> searchStatuses;\r
- @Wire\r
- Charts chart;\r
+ // @Wire\r
+ // Charts chart;\r
@Wire\r
Listbox jobsListBox;\r
\r
+ //new LinkedBlockingQueue<IJobMessage>()\r
+\r
+ public JobListModel() {\r
+ logger.info("Created");\r
+ }\r
+\r
@AfterCompose\r
public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
Selectors.wireComponents(view, this, false);\r
- configureJobsCountChart();\r
+ //configureJobsCountChart();\r
jobsListBox.getPagingChild().setAutohide(false);\r
}\r
\r
\r
}\r
\r
- private void configureJobsCountChart() {\r
- Options options = new Options();\r
-\r
- options.getGlobal().setUseUTC(false);\r
- //chart.getPlotOptions().\r
-\r
- chart.setHeight(100);\r
- chart.setOptions(options);\r
- chart.setAnimation(false);\r
-\r
- chart.getXAxis().setType("datetime");\r
- chart.getXAxis().setTickPixelInterval(80);\r
- chart.getXAxis().getLabels().setStyle("fontSize: 8px;");\r
- chart.getXAxis().getLabels().setFormat("{value: %H:%M}");\r
- chart.getYAxis().setTitle("Darab");\r
- PlotLine plotLine = new PlotLine();\r
- plotLine.setValue(0);\r
- plotLine.setWidth(1);\r
- plotLine.setColor("#808080");\r
- chart.getYAxis().setMin(0);\r
- chart.getYAxis().addPlotLine(plotLine);\r
-\r
- chart.getTooltip().setHeaderFormat("<b>{series.name}</b><br/>");\r
- chart.getTooltip().setPointFormat("{point.x:%Y-%m-%d %H:%M:%S}<br>{point.y}");\r
-\r
- chart.getLegend().setEnabled(false);\r
- chart.getExporting().setEnabled(false);\r
-\r
- Series series = chart.getSeries();\r
- series.setName("Feladatok");\r
- //updateJobsChart();\r
-\r
- int size = jobList.size();\r
- for (int i = -19; i <= 0; i++) {\r
- Point point = new Point(Calendar.getInstance().getTimeInMillis() + i * 1000, size);\r
- series.addPoint(point);\r
- }\r
- }\r
+ // private void configureJobsCountChart() {\r
+ // Options options = new Options();\r
+ //\r
+ // options.getGlobal().setUseUTC(false);\r
+ // //chart.getPlotOptions().\r
+ //\r
+ // chart.setHeight(100);\r
+ // chart.setOptions(options);\r
+ // chart.setAnimation(false);\r
+ //\r
+ // chart.getXAxis().setType("datetime");\r
+ // chart.getXAxis().setTickPixelInterval(80);\r
+ // chart.getXAxis().getLabels().setStyle("fontSize: 8px;");\r
+ // chart.getXAxis().getLabels().setFormat("{value: %H:%M}");\r
+ // chart.getYAxis().setTitle("Darab");\r
+ // PlotLine plotLine = new PlotLine();\r
+ // plotLine.setValue(0);\r
+ // plotLine.setWidth(1);\r
+ // plotLine.setColor("#808080");\r
+ // chart.getYAxis().setMin(0);\r
+ // chart.getYAxis().addPlotLine(plotLine);\r
+ //\r
+ // chart.getTooltip().setHeaderFormat("<b>{series.name}</b><br/>");\r
+ // chart.getTooltip().setPointFormat("{point.x:%Y-%m-%d %H:%M:%S}<br>{point.y}");\r
+ //\r
+ // chart.getLegend().setEnabled(false);\r
+ // chart.getExporting().setEnabled(false);\r
+ //\r
+ // Series series = chart.getSeries();\r
+ // series.setName("Feladatok");\r
+ // //updateJobsChart();\r
+ //\r
+ // int size = jobList.size();\r
+ // for (int i = -19; i <= 0; i++) {\r
+ // Point point = new Point(Calendar.getInstance().getTimeInMillis() + i * 1000, size);\r
+ // series.addPoint(point);\r
+ // }\r
+ // }\r
\r
@Command\r
public void copyRelated(@BindingParam("related") String related) {\r
}\r
\r
+ @Override\r
+ protected void doKeepAlive() {\r
+ jobEngine.keepAliveJobChangedListener(this);\r
+ //logger.info("Listener refreshed");\r
+ }\r
+\r
@Command\r
public void executeJob() {\r
String template = "/pages/jobselector.zul";\r
private void onJobCreated(IJobRuntime job) {\r
jobList.add(job);\r
notifyChange("jobList");\r
- updateJobsChart();\r
+ //updateJobsChart();\r
}\r
\r
private void onJobDeleted(IJobRuntime job) {\r
onSelect();\r
\r
notifyChange("jobList");\r
- updateJobsChart();\r
- }\r
-\r
- private void onJobUpdated(IJobRuntime job) {\r
- //List<IJobRuntime> savedSelectedJobs = new ArrayList<>(selectedJobs);\r
- jobList.notifyChange(job);\r
+ //updateJobsChart();\r
}\r
\r
// @Command\r
// initializeList();\r
// }\r
\r
+ private void onJobUpdated(IJobRuntime job) {\r
+ //List<IJobRuntime> savedSelectedJobs = new ArrayList<>(selectedJobs);\r
+ jobList.notifyChange(job);\r
+ }\r
+\r
@Command\r
public void onSelect() {\r
notifyChange("updatePriorityDisabled");\r
initializeList();\r
}\r
\r
- private void updateJobsChart() {\r
- chart.getSeries().addPoint(new Point(Calendar.getInstance().getTimeInMillis(), jobList.size()), true, true, true);\r
- }\r
+ // private void updateJobsChart() {\r
+ // chart.getSeries().addPoint(new Point(Calendar.getInstance().getTimeInMillis(), jobList.size()), true, true, true);\r
+ // }\r
+\r
}\r
\r
@Override\r
public void afterComponentDetached(Component component, Page page) {\r
- // logger.info("afterComponentDetached {} {}", component.getClass(), page);\r
+ //logger.info("afterComponentDetached {} {}", component.getClass(), page);\r
}\r
\r
@Override\r
\r
@Override\r
public void afterPageDetached(Page page, Desktop desktop) {\r
- // logger.info("afterPageAttached {} {}", page, desktop);\r
+ logger.info("afterPageDetached {}", page.getId());\r
}\r
\r
@Override\r
\r
import user.commons.config.JSONConfig;\r
import user.commons.nosql.NoSQLUtils;\r
+import user.jobengine.gui.ComponentBinder;\r
import user.jobengine.server.IJobChangedListener;\r
-import user.jobengine.server.JobEngine;\r
+import user.jobengine.server.IJobEngine;\r
import user.jobengine.zk.model.IndexModel;\r
import user.jobengine.zk.model.MaestroConfig;\r
import user.jobengine.zk.model.MediaCubeConfig;\r
}\r
\r
static public void cleanup() {\r
- IJobChangedListener listener = (IJobChangedListener) getAttribute(SessionUtil.JOBLISTENER);\r
- if (listener != null) {\r
- JobEngine.getInstance().removeJobChangedEventListener(listener);\r
- setAttribute(SessionUtil.JOBLISTENER, null);\r
- }\r
+ // IJobChangedListener listener = (IJobChangedListener) getAttribute(SessionUtil.JOBLISTENER);\r
+ // if (listener != null) {\r
+ // JobEngine.getInstance().removeJobChangedEventListener(listener);\r
+ // setAttribute(SessionUtil.JOBLISTENER, null);\r
+ // }\r
+\r
// setAttribute(SessionUtil.MENUMODEL, null);\r
// setAttribute(SessionUtil.USERPRINCIPAL, null);\r
}\r
}\r
\r
static public void registerJobChangedListener(IJobChangedListener listener) {\r
- cleanup();\r
- JobEngine.getInstance().addJobChangedEventListener(listener);\r
- setAttribute(JOBLISTENER, listener);\r
+ // cleanup();\r
+ // JobEngine.getInstance().addJobChangedEventListener(listener);\r
+ // setAttribute(JOBLISTENER, listener);\r
+\r
+ IJobEngine jobEngine = ComponentBinder.getJobEngine();\r
+ if (jobEngine != null) {\r
+ jobEngine.addManagedJobChangedListener(listener);\r
+ }\r
}\r
\r
static public void setAttribute(String name, Object obj) {\r