git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorvasary.daniel <TFS\vasary.daniel>
Fri, 11 Dec 2020 15:28:26 +0000 (15:28 +0000)
committervasary.daniel <TFS\vasary.daniel>
Fri, 11 Dec 2020 15:28:26 +0000 (15:28 +0000)
15 files changed:
server/-configuration/scheduledjobs.json
server/user.jobengine.executors/config/config.xml
server/user.jobengine.executors/src/user/jobengine/server/steps/CancelableStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/TestForkCancelableStep.java
server/user.jobengine.osgi.server/src/user/jobengine/server/IJobEngine.java
server/user.jobengine.osgi.server/src/user/jobengine/server/IJobStepExecutor.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobEngine.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobStepExecutor.java
server/user.jobengine.osgi.server/src/user/jobengine/server/scheduler/SchedulerService.java
server/user.mediacube.gui/WEB-INF/zk.xml
server/user.mediacube.gui/pages/joblist.zul
server/user.mediacube.gui/src/user/jobengine/zk/model/AsyncBaseModel.java
server/user.mediacube.gui/src/user/jobengine/zk/model/JobListModel.java
server/user.mediacube.gui/src/user/jobengine/zk/util/LifeCycleListener.java
server/user.mediacube.gui/src/user/jobengine/zk/util/SessionUtil.java

index d429ad3442b7695be059985d01a5580438498adf..ce5b7c170c1a2a3756c6a2a400900d2f3aed2575 100644 (file)
@@ -10,6 +10,9 @@
        },\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
index 2b3595c0132e349d530dbae792b7eed8bbc0ba10..9744a772408b9a6e25e2487ffac92e6bc4fe6540 100644 (file)
@@ -1,52 +1,53 @@
 <?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
index bcf29f2c1f38a4d4722e11cd203b8f53b119169b..14cfbd6f2d39c1a77ef6e9b45d8654e9bc7649f3 100644 (file)
@@ -17,7 +17,7 @@ public class CancelableStep extends JobStep {
        @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
index 91d00a8d693cc980a306e8b56add78ead35e5923..94c2ee44053d1599854bb7f010b6110a71ba8d0b 100644 (file)
@@ -14,15 +14,17 @@ public class TestForkCancelableStep extends JobStep {
        //      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
@@ -30,7 +32,7 @@ public class TestForkCancelableStep extends JobStep {
                        runtime.setRelated("TEST" + runtime.getId());\r
                }\r
 \r
-               //              jobRuntime.forkWaitComplete();\r
+               jobRuntime.forkWaitComplete();\r
                logger.info("Done");\r
                return null;\r
        }\r
index eb9e8f6e983b5aa9bb16371f177960932c94af84..3f775fabe6ff2248b56cd94952c747b7719665bc 100644 (file)
@@ -16,6 +16,8 @@ public interface IJobEngine {
 
        void addJobChangedEventListener(IJobChangedListener listener);
 
+       void addManagedJobChangedListener(IJobChangedListener listener);
+
        void addStepExecutor(IJobStepExecutor executor);
 
        void addToExecutorQueue(IJobRuntime jobRuntime);
@@ -84,6 +86,8 @@ public interface IJobEngine {
 
        void jobCleanup(IJobRuntime jobRuntime);
 
+       void keepAliveJobChangedListener(IJobChangedListener listener);
+
        void keepAliveWorker(String remoteAddr);
 
        void loadExecutors();
@@ -112,16 +116,18 @@ public interface IJobEngine {
 
        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);
index 5ee69913bde56537416778c5fabf367010c96616..7ad2abb1771427e63201b0ef2c984b9d37d8bec4 100644 (file)
@@ -44,7 +44,7 @@ public interface IJobStepExecutor {
        /**
         * A vďż˝grehajtďż˝ elindďż˝tďż˝sa.
         */
-       void startup(IJobEngine jobEngine) throws Exception;
+       void startup(IJobEngine jobEngine);
 
        ClusteredJob steelJob() throws InterruptedException;
 
index 14d6d51ab65c996fbf1f182b457dd32292b93022..0a05285e72e46a8a31fddf34176ebf94c0a1e4d4 100644 (file)
@@ -64,6 +64,35 @@ import user.tsm.client.TSMException;
  */
 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;
 
@@ -183,8 +212,9 @@ public class JobEngine implements IJobEngine {
        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;
 
@@ -198,6 +228,7 @@ public class JobEngine implements IJobEngine {
        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.
@@ -214,7 +245,7 @@ public class JobEngine implements IJobEngine {
                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();
@@ -240,6 +271,15 @@ public class JobEngine implements IJobEngine {
                }
        }
 
+       @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();
@@ -611,6 +651,12 @@ public class JobEngine implements IJobEngine {
                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) {
@@ -876,10 +922,24 @@ public class JobEngine implements IJobEngine {
        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());
@@ -903,6 +963,29 @@ public class JobEngine implements IJobEngine {
                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);
@@ -929,9 +1012,10 @@ public class JobEngine implements IJobEngine {
                if (schedulerService != null)
                        schedulerService.shutdown();
 
-               worker.shutDown();
+               vm.shutDown();
                shutdownExecutors();
                dispatcher.shutDown();
+               jobChangedListenerChecker.shutDown();
 
                try {
                        TSMClient.CleanUpMultithread();
@@ -997,15 +1081,16 @@ public class JobEngine implements IJobEngine {
                        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);
@@ -1020,6 +1105,11 @@ public class JobEngine implements IJobEngine {
 
        }
 
+       private void startupExecutors() {
+               for (IJobStepExecutor executor : executors.values())
+                       executor.startup(this);
+       }
+
        @Override
        public void storeJob(IJobRuntime runtime) {
                submittedJobs.put(runtime.getId(), runtime);
index 6f26e22f4531ec1c7d36603d79b2365b239262bc..0ded9362f0c91e2f67cb7fe0647077da0001911d 100644 (file)
@@ -122,11 +122,12 @@ public class JobStepExecutor implements IJobStepExecutor {
                }
 
                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);
@@ -319,9 +320,7 @@ public class JobStepExecutor implements IJobStepExecutor {
        }
 
        @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)
index 1144f4f4279169f1777f0bb6ba6ea487a7ffa14b..859ce080cf401ca47d4e157677635838ca9a3890 100644 (file)
@@ -53,7 +53,7 @@ public class SchedulerService {
        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
index 4594df9d0eef78f83843adb42f739b7a21872f44..f921ea3a49bac9fe089fcbbee71db87f5c30decf 100644 (file)
@@ -19,7 +19,11 @@ https://www.zkoss.org/wiki/ZK_Configuration_Reference/zk.xml
                <!-- 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
@@ -39,9 +43,9 @@ https://www.zkoss.org/wiki/ZK_Configuration_Reference/zk.xml
        <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
index 9d03d956d0cfa750b26ff121de0037f554c282aa..480bbcb418260a6b6ab3dd02064b713bc1be7a2b 100644 (file)
@@ -1,6 +1,7 @@
 <?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
@@ -37,9 +38,9 @@
                        <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
index 366a8d14e35e45594f50643f4c427230341ad71f..8013edcb0506f1c1755d429583980daa0bb44af1 100644 (file)
@@ -11,6 +11,10 @@ public class AsyncBaseModel extends BaseModel {
 \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
@@ -24,6 +28,7 @@ public class AsyncBaseModel extends BaseModel {
 \r
        @Command\r
        public void uiTick() {\r
+               doKeepAlive();\r
                synchronized (uiTasks) {\r
                        for (UITask task : uiTasks) {\r
                                task.execute();\r
index 4c17c25233825c2a3d8e10bee137e3453bd08e0e..d45e5ccf7a8115a3756b7241783cdcce92e50fab 100644 (file)
@@ -3,7 +3,6 @@ package user.jobengine.zk.model;
 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
@@ -19,11 +18,6 @@ import org.zkoss.bind.annotation.ContextParam;
 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
@@ -63,15 +57,21 @@ public class JobListModel extends AsyncBaseModel implements IJobChangedListener
        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
@@ -124,49 +124,55 @@ public class JobListModel extends AsyncBaseModel implements IJobChangedListener
 \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
@@ -276,7 +282,7 @@ public class JobListModel extends AsyncBaseModel implements IJobChangedListener
        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
@@ -289,12 +295,7 @@ public class JobListModel extends AsyncBaseModel implements IJobChangedListener
                        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
@@ -308,6 +309,11 @@ public class JobListModel extends AsyncBaseModel implements IJobChangedListener
        //              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
@@ -508,7 +514,8 @@ public class JobListModel extends AsyncBaseModel implements IJobChangedListener
                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
index 1d8c23418f3a2cbf11982e70fb45c56f6371340f..be09782e53ddd130b5b77ffa7a9aabd43b3aedd5 100644 (file)
@@ -18,7 +18,7 @@ public class LifeCycleListener implements UiLifeCycle {
 \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
@@ -34,7 +34,7 @@ public class LifeCycleListener implements UiLifeCycle {
 \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
index 969387e63fd3309523249dc603858dae97b0ca0d..d965d331caa2b5398dc19b2f99d7ba1e3a0cf455 100644 (file)
@@ -24,8 +24,9 @@ import com.ibm.nosql.json.api.QueryBuilder;
 \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
@@ -102,11 +103,12 @@ public class SessionUtil {
        }\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
@@ -360,9 +362,14 @@ public class SessionUtil {
        }\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