Feature #107 Folyamat futtatás és monitorozás kiajánlása WS-en
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Mon, 26 Nov 2018 15:34:25 +0000 (15:34 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Mon, 26 Nov 2018 15:34:25 +0000 (15:34 +0000)
git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube;C31350

server/-configuration/run-mediacube-server-bsh.launch
server/user.jobengine.executors/jobtemplates/fake.xml
server/user.jobengine.executors/src/user/jobengine/server/steps/FakeStep.java
server/user.jobengine.osgi.commons/src/user/commons/nexio/api/MediaListener.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobEngine.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/JobListModel.java
server/user.jobengine.osgi.services/META-INF/MANIFEST.MF
server/user.jobengine.osgi.services/WEB-INF/web.xml
server/user.jobengine.osgi.services/src/user/jobengine/osgi/ws/mediacube/MediaCubeAPIWSServlet.java [new file with mode: 0644]
server/user.jobengine.osgi.services/src/user/jobengine/osgi/ws/mediacube/MediaCubeAPIWSSocket.java [new file with mode: 0644]
server/user.jobengine.osgi.services/src/user/jobengine/osgi/ws/nexio/NexioWSSocket.java

index c423329166bbf0a46eb72253dddd6f698ced17f0..bdc1613d8753ab8235ba952df8013c2e0b5c6ef0 100644 (file)
@@ -19,7 +19,7 @@
 <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>\r
 <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/>\r
 <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>\r
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Djobengine.jobsteps.root=&quot;${workspace_loc}/user.jobengine.executors/config&quot;&#13;&#10;-Djobengine.jobtemplates.root=&quot;${workspace_loc}/user.jobengine.executors/jobtemplates&quot;&#13;&#10;-Djobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.db.user=db2admin&#13;&#10;-Djobengine.db.password=password&#13;&#10;-Djobengine.loglevel=INFO&#13;&#10;-Dlog4j.configurationFile=&quot;${workspace_loc}/-configuration/log4j2.xml&quot;&#13;&#10;-Djobengine.jobsteps.alternate.root=&quot;${workspace_loc}/user.jobengine.executors/bin/&quot;&#13;&#10;-Djetty.home=&quot;${workspace_loc:}/-configuration/jetty&quot;&#13;&#10;-Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml&#13;&#10;-Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty&#13;&#10;-Djava.io.tmpdir=c:\temp\jetty&#13;&#10;-Djobengine.octopus.api.address=http://10.10.1.11/api/v1&#13;&#10;-Djobengine.octopus.api.user=mam&#13;&#10;-Djobengine.octopus.api.password=napocska&#13;&#10;-Djobengine.nosql.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.nosql.db.user=db2admin&#13;&#10;-Djobengine.nosql.db.password=password&#13;&#10;-Djobengine.nosql.db.schema=test&#13;&#10;-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl&#13;&#10;-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium&#13;&#10;-Djobengine.jobscheduling.config=&quot;${workspace_loc}/-configuration/scheduledjobs.json&quot;&#13;&#10;-Dnexio.host=10.10.1.55&#13;&#10;-Dnexio.disable=true&#13;&#10;-Djobengine.octopus.rundowns.name=rundowns&#13;&#10;-Djobengine.octopus.storyfolders.name=storyfolders&#13;&#10;-Djobengine.octopus.stories.name=stories&#13;&#10;-Dmediacube.auth.location=&quot;${workspace_loc}/-configuration/mediacube-auth.properties&quot;"/>\r
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Djobengine.jobsteps.root=&quot;${workspace_loc}/user.jobengine.executors/config&quot;&#13;&#10;-Djobengine.jobtemplates.root=&quot;${workspace_loc}/user.jobengine.executors/jobtemplates&quot;&#13;&#10;-Djobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.db.user=db2admin&#13;&#10;-Djobengine.db.password=password&#13;&#10;-Djobengine.loglevel=INFO&#13;&#10;-Dlog4j.configurationFile=&quot;${workspace_loc}/-configuration/log4j2.xml&quot;&#13;&#10;-Djobengine.jobsteps.alternate.root=&quot;${workspace_loc}/user.jobengine.executors/bin/&quot;&#13;&#10;-Djetty.home=&quot;${workspace_loc:}/-configuration/jetty&quot;&#13;&#10;-Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml&#13;&#10;-Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty&#13;&#10;-Djava.io.tmpdir=c:\temp\jetty&#13;&#10;-Djobengine.octopus.api.address=http://10.10.1.11/api/v1&#13;&#10;-Djobengine.octopus.api.user=mam&#13;&#10;-Djobengine.octopus.api.password=napocska&#13;&#10;-Djobengine.nosql.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.nosql.db.user=db2admin&#13;&#10;-Djobengine.nosql.db.password=password&#13;&#10;-Djobengine.nosql.db.schema=test&#13;&#10;-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl&#13;&#10;-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium&#13;&#10;-Djobengine.jobscheduling.config=&quot;${workspace_loc}/-configuration/scheduledjobs.json&quot;&#13;&#10;-Dnexio.host=192.168.10.101&#13;&#10;-Djobengine.nexio.name=testnexioclips&#13;&#10;-Dnexio.disable=false&#13;&#10;-Djobengine.octopus.rundowns.name=rundowns&#13;&#10;-Djobengine.octopus.storyfolders.name=storyfolders&#13;&#10;-Djobengine.octopus.stories.name=stories&#13;&#10;-Dmediacube.auth.location=&quot;${workspace_loc}/-configuration/mediacube-auth.properties&quot;"/>\r
 <stringAttribute key="pde.version" value="3.3"/>\r
 <booleanAttribute key="show_selected_only" value="false"/>\r
 <stringAttribute key="target_bundles" value="cglib@default:default,com.auth0.java-jwt@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default,com.google.guava@default:default,com.ibm.db2jcc4@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,com.sun.el.javax.el@default:default,commons-logging@default:default,humble.video.noarch@default:default,humble.video.windows@default:default,javax.annotation-api@default:default,javax.inject@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.servlet.jsp-api@default:default,javax.validation.api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.codec@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang3@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.jasper.glassfish@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jetty.client@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jsp@default:default,org.eclipse.jetty.osgi.boot.jsp@default:false,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
index 6f0dc280ce8d80c424cb6f0cdacb09df1717933c..c1e885194db18ce5f375924c69976c1c8d32792b 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
-<jobtemplate multiInstance="true">\r
+<jobtemplate multiInstance="true" name="Fake">\r
 <declarations>\r
        <parameters>\r
                <parameter name="itemID" type="java.lang.Long"/>\r
index f93d3afca9f5af577597dead90421f160cf3d760..fb3c72d1724ef5ea020cb179af9559baecbf3f12 100644 (file)
@@ -3,7 +3,6 @@ package user.jobengine.server.steps;
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
 \r
-import user.commons.MediaCubeMarker;\r
 import user.jobengine.server.IJobEngine;\r
 import user.jobengine.server.IJobRuntime;\r
 \r
@@ -16,7 +15,7 @@ public class FakeStep extends JobStep {
        public Object[] execute(long itemID, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
                Object[] result = { itemID + 1 };\r
 \r
-               ((MediaCubeMarker) jobRuntime.getMarker()).setTo("vasary@elgekko.net");\r
+               //((MediaCubeMarker) jobRuntime.getMarker()).setTo("vasary@elgekko.net");\r
 \r
                //logger.info(jobRuntime.getMarker(), "<a href='UNC://\\10.10.1.100\\BRAAVOS\\ARCHIVE' target='blank'>usefullink</a>");\r
                logger.info(jobRuntime.getMarker(), "Starting with {} #{}", itemID, jobRuntime.getId());\r
@@ -32,7 +31,7 @@ public class FakeStep extends JobStep {
 \r
                                //                              if (i == 2)\r
                                //                                      throw new Exception("TESZT");\r
-                               //logger.info("Progress {}", jobRuntime.getProgress());\r
+                               logger.info("Progress {}", jobRuntime.getProgress());\r
                        }\r
                } catch (Exception e) {\r
                        logger.error(jobRuntime.getMarker(), e.getMessage());\r
index 34326026fa52c8873445fe4be67c1b363fa31b60..52cfbca3c75223649c4b81b12c9aa519acbd2a07 100644 (file)
@@ -215,7 +215,8 @@ public class MediaListener {
                                }\r
                        }\r
                } catch (Exception e) {\r
-                       logger.catching(e);\r
+                       //logger.catching(e);\r
+                       logger.error(e.getMessage());\r
                        forceRestart();\r
                }\r
        }\r
index 1a0e9657ae287683371d929e278b720e61473d1a..fca180545b752ffea717bc335edd6be34c6ee2dc 100644 (file)
@@ -13,6 +13,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CyclicBarrier;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.PriorityBlockingQueue;
@@ -170,7 +171,7 @@ public class JobEngine implements IJobEngine {
 
        private SchedulerService schedulerService = null;
 
-       private ArrayList<IJobChangedListener> jobChangedListenerList = new ArrayList<IJobChangedListener>();
+       private List<IJobChangedListener> jobChangedListenerList = new CopyOnWriteArrayList<>();
 
        /**
         * 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.
@@ -853,7 +854,7 @@ public class JobEngine implements IJobEngine {
                        result = new JobRuntime(this, program);
                        result.setPersister(itemManager);
                        result.setTemplate(template);
-                       result.setName(name);
+                       result.setName(name == null ? program.getTemplate().getName() : name);
                        result.setParameters(parameters);
                        result.setService(program.getTemplate().isService());
                        submit(result);
index 19aaf9b71396edfd3212cc2d10ea6d5a5381105a..e927663f6af02b5e9ac2ef7642e196d74d1a1b6c 100644 (file)
@@ -174,12 +174,17 @@ public class JobListModel extends AsyncBaseModel implements IJobChangedListener
 \r
        @Command\r
        public void restartNexio() {\r
+               INexioAPI nexioAPI = ComponentBinder.getNexioAPI();\r
+               NexioDispatcher dispatcher = nexioAPI.getDispatcher();\r
+               if (dispatcher.isRestartInProgress()) {\r
+                       Messagebox.show("A NEXIO szinkronizálás újraindítása folyamatban van.");\r
+                       return;\r
+               }\r
+\r
                EventListener<Event> confirmedEvent = evt -> {\r
                        if (evt.getName().equals("onCancel"))\r
                                return;\r
                        try {\r
-                               INexioAPI nexioAPI = ComponentBinder.getNexioAPI();\r
-                               NexioDispatcher dispatcher = nexioAPI.getDispatcher();\r
                                dispatcher.restart();\r
                        } catch (Exception e) {\r
                                Messagebox.show(e.getMessage());\r
index 00d93990da4377219ab32ae5f81f03eda0197d33..4ccfcb54ffa3a82f984ec5065d8d3e4e89d71c70 100644 (file)
@@ -38,5 +38,6 @@ Import-Package: com.fasterxml.jackson.annotation;version="2.4.5",
  user.jobengine.server
 Export-Package: user.jobengine.osgi.rest,
  user.jobengine.osgi.rest.octopus,
+ user.jobengine.osgi.ws.mediacube,
  user.jobengine.osgi.ws.nexio
 Require-Bundle: org.jboss.resteasy.jaxrs;bundle-version="3.0.11"
index 8702cb52424eafebea71a148c6cb22611151ec4c..d861e1a9b1b45dd9d0586dec67ab815fa02b187e 100644 (file)
                <url-pattern>/nexio/*</url-pattern>\r
        </servlet-mapping>\r
 \r
+       <servlet>\r
+               <servlet-name>WS-MEDIACUBEAPI</servlet-name>\r
+               <servlet-class>user.jobengine.osgi.ws.mediacube.MediaCubeAPIWSServlet</servlet-class>\r
+               <load-on-startup>1</load-on-startup>\r
+       </servlet>\r
+       <servlet-mapping>\r
+               <servlet-name>WS-MEDIACUBEAPI</servlet-name>\r
+               <url-pattern>/wsapi/*</url-pattern>\r
+       </servlet-mapping>\r
+\r
 <!--   <security-constraint> -->\r
 <!--     <web-resource-collection> -->\r
 <!--      <web-resource-name>Everything</web-resource-name> -->\r
diff --git a/server/user.jobengine.osgi.services/src/user/jobengine/osgi/ws/mediacube/MediaCubeAPIWSServlet.java b/server/user.jobengine.osgi.services/src/user/jobengine/osgi/ws/mediacube/MediaCubeAPIWSServlet.java
new file mode 100644 (file)
index 0000000..4f9394a
--- /dev/null
@@ -0,0 +1,20 @@
+package user.jobengine.osgi.ws.mediacube;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
+import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
+
+@SuppressWarnings("serial")
+public class MediaCubeAPIWSServlet extends WebSocketServlet {
+       private static final Logger logger = LogManager.getLogger();
+
+       public MediaCubeAPIWSServlet() {
+               logger.info("Created");
+       }
+
+       @Override
+       public void configure(WebSocketServletFactory factory) {
+               factory.register(MediaCubeAPIWSSocket.class);
+       }
+}
diff --git a/server/user.jobengine.osgi.services/src/user/jobengine/osgi/ws/mediacube/MediaCubeAPIWSSocket.java b/server/user.jobengine.osgi.services/src/user/jobengine/osgi/ws/mediacube/MediaCubeAPIWSSocket.java
new file mode 100644 (file)
index 0000000..61ce989
--- /dev/null
@@ -0,0 +1,135 @@
+package user.jobengine.osgi.ws.mediacube;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.WebSocketAdapter;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ibm.nosql.json.JSONUtil;
+import com.ibm.nosql.json.api.BasicDBObject;
+
+import user.commons.JobStatus;
+import user.jobengine.db.ItemManagerData.SignalType;
+import user.jobengine.osgi.rest.ComponentBinder;
+import user.jobengine.osgi.rest.ServiceObjectMapper;
+import user.jobengine.server.IJobChangedListener;
+import user.jobengine.server.IJobEngine;
+import user.jobengine.server.IJobRuntime;
+
+public class MediaCubeAPIWSSocket extends WebSocketAdapter {
+       private static final Logger logger = LogManager.getLogger();
+       public static final String DATA = "data";
+       public static final String LIST = "list";
+       public static final String STARTJOB = "startjob";
+       public static final String ACTION = "action";
+       public static final String ERROR = "error";
+       private static final String NO_ACTION_SPECIFIED = "Missing action type.";
+       private static final String TEMPLATE = "template";
+       private static final String PARAMETERS = "parameters";
+       private static final String NO_TEMPLATE_SPECIFIED = "Missing template name.";
+       private static final String NO_PARAMETERS_SPECIFIED = "Missing job parameters.";
+       private static ObjectMapper mapper;
+       private static Map<Long, IJobChangedListener> jobChangedListeners = new ConcurrentHashMap<>();
+
+       public MediaCubeAPIWSSocket() {
+               mapper = ServiceObjectMapper.createMapper();
+               logger.info("EventSocket created");
+       }
+
+       public void asyncSendResponse(Object response) {
+               try {
+                       String data = mapper.writeValueAsString(response);
+                       logger.info("Sending " + data);
+                       Session session = getSession();
+                       if (session != null)
+                               session.getRemote().sendStringByFuture(data);
+               } catch (Exception e) {
+                       logger.catching(e);
+               }
+       }
+
+       @Override
+       public void onWebSocketClose(int statusCode, String reason) {
+               super.onWebSocketClose(statusCode, reason);
+               logger.info("Socket Closed: [{}]", reason);
+       }
+
+       @Override
+       public void onWebSocketConnect(Session sess) {
+               super.onWebSocketConnect(sess);
+               logger.info("Socket Connected: " + sess);
+       }
+
+       @Override
+       public void onWebSocketError(Throwable cause) {
+               super.onWebSocketError(cause);
+               logger.info("Error: [{}]", String.valueOf(cause.getMessage()));
+       }
+
+       @Override
+       public void onWebSocketText(String message) {
+               super.onWebSocketText(message);
+               try {
+
+                       BasicDBObject data = (BasicDBObject) JSONUtil.jsonToDbObject(message);
+                       if (!data.containsKey(ACTION))
+                               throw new Exception(NO_ACTION_SPECIFIED);
+                       String action = data.getString(ACTION);
+                       switch (action) {
+                       case STARTJOB:
+                               startJob(data, getSession());
+                               break;
+                       default:
+                               throw new Exception("Unhandled action : " + action);
+                       }
+               } catch (Exception e) {
+                       logger.catching(e);
+                       asyncSendResponse(new BasicDBObject(ERROR, e.getMessage()));
+               }
+       }
+
+       private void removeJobChangedEventListener(long id) {
+               IJobChangedListener jobChangedListener = jobChangedListeners.remove(id);
+               if (jobChangedListener == null)
+                       return;
+               logger.info("Removing job {}", id);
+               IJobEngine jobengine = ComponentBinder.getJobengine();
+               jobengine.removeJobChangedEventListener(jobChangedListener);
+               Session session = getSession();
+               if (session != null)
+                       session.close();
+       }
+
+       private void startJob(BasicDBObject data, Session session) throws Exception {
+               if (!data.containsKey(TEMPLATE))
+                       throw new Exception(NO_TEMPLATE_SPECIFIED);
+               String template = data.getString(TEMPLATE);
+               if (!data.containsKey(PARAMETERS))
+                       throw new Exception(NO_PARAMETERS_SPECIFIED);
+               BasicDBObject parameters = (BasicDBObject) data.get(PARAMETERS);
+               IJobEngine jobengine = ComponentBinder.getJobengine();
+               IJobRuntime runtime = jobengine.submit(template, null, parameters);
+               IJobChangedListener jobChangedListener = event -> {
+                       try {
+                               IJobRuntime job = event.getJob();
+                               if (job.getId() != runtime.getId())
+                                       return;
+                               BasicDBObject response = new BasicDBObject("jobID", job.getId()).append("status", job.getStatus()).append("signal", event.getSignalType())
+                                               .append("progress", job.getProgress());
+                               asyncSendResponse(response);
+                               if (SignalType.DELETE.equals(event.getSignalType()) || JobStatus.SUSPENDED.equals(job.getStatus())) {
+                                       removeJobChangedEventListener(runtime.getId());
+                               }
+                       } catch (Exception e) {
+                               removeJobChangedEventListener(runtime.getId());
+                               logger.catching(e);
+                       }
+               };
+               jobengine.addJobChangedEventListener(jobChangedListener);
+               jobChangedListeners.put(runtime.getId(), jobChangedListener);
+       }
+}
index 590159f05cb37896c0c39693c8c81f2a67b10657..66894b94adaaa28b24ac0d2f3a38823787cf8e45 100644 (file)
@@ -1,5 +1,6 @@
 package user.jobengine.osgi.ws.nexio;
 
+import java.io.IOException;
 import java.util.List;
 
 import org.apache.logging.log4j.LogManager;
@@ -22,14 +23,35 @@ public class NexioWSSocket extends WebSocketAdapter {
        public static final String DATA = "data";
        public static final String LIST = "list";
        public static final String ACTION = "action";
-       private static final String NO_ACTION_SPECIFIED = "No action specified";
+       public static final String ERROR = "error";
+       private static final String NO_ACTION_SPECIFIED = "Missing action type.";
        private static ObjectMapper mapper;
 
+       public static void asyncSendResponse(Session session, Object response) throws JsonProcessingException {
+               String data = mapper.writeValueAsString(response);
+               session.getRemote().sendStringByFuture(data);
+       }
+
        public NexioWSSocket() {
                mapper = ServiceObjectMapper.createMapper();
                logger.info("EventSocket created");
        }
 
+       private void listNexio(BasicDBObject response) throws Exception {
+               INexioAPI nexioAPI = ComponentBinder.getNexioAPI();
+               if (nexioAPI == null)
+                       throw new Exception("Nexio service is unreachable");
+               List<DBObject> clips = nexioAPI.getItems(null, true);
+               response.append(DATA, clips);
+       }
+
+       @Override
+       public void onWebSocketClose(int statusCode, String reason) {
+               super.onWebSocketClose(statusCode, reason);
+               //NexioAPIServlet.getInstance().removeSession(getSession());
+               logger.info("Socket Closed: [{}]", reason);
+       }
+
        @Override
        public void onWebSocketConnect(Session sess) {
                super.onWebSocketConnect(sess);
@@ -37,52 +59,39 @@ public class NexioWSSocket extends WebSocketAdapter {
                logger.info("Socket Connected: " + sess);
        }
 
+       @Override
+       public void onWebSocketError(Throwable cause) {
+               super.onWebSocketError(cause);
+               logger.info("Error: [{}]", String.valueOf(cause.getMessage()));
+       }
+
        @Override
        public void onWebSocketText(String message) {
                super.onWebSocketText(message);
                //logger.info("Received: " + message);
 
                try {
-                       INexioAPI nexioAPI = ComponentBinder.getNexioAPI();
-                       if (nexioAPI == null)
-                               throw new Exception("Nexio service is unreachable");
 
                        BasicDBObject data = (BasicDBObject) JSONUtil.jsonToDbObject(message);
-                       if (!data.containsKey(ACTION)) {
-                               getSession().getRemote().sendString(new BasicDBObject("error", NO_ACTION_SPECIFIED).toString());
+                       if (!data.containsKey(ACTION))
                                throw new Exception(NO_ACTION_SPECIFIED);
-                       }
-
-                       //TODO check action etc.
                        String action = data.getString(ACTION);
                        BasicDBObject response = new BasicDBObject(ACTION, action);
                        switch (action) {
                        case LIST:
-                               List<DBObject> clips = nexioAPI.getItems(null, true);
-                               response.append(DATA, clips);
-                               asyncSendResponse(getSession(), response);
+                               listNexio(response);
                                break;
+                       default:
+                               throw new Exception("Unhandled action : " + action);
+
                        }
+                       asyncSendResponse(getSession(), response);
                } catch (Exception e) {
-                       logger.error(e);
+                       logger.catching(e);
+                       try {
+                               getSession().getRemote().sendString(new BasicDBObject(ERROR, e.getMessage()).toString());
+                       } catch (IOException e1) {
+                       }
                }
        }
-
-       public static void asyncSendResponse(Session session, Object response) throws JsonProcessingException {
-               String data = mapper.writeValueAsString(response);
-               session.getRemote().sendStringByFuture(data);
-       }
-
-       @Override
-       public void onWebSocketClose(int statusCode, String reason) {
-               super.onWebSocketClose(statusCode, reason);
-               //NexioAPIServlet.getInstance().removeSession(getSession());
-               logger.info("Socket Closed: [{}]", reason);
-       }
-
-       @Override
-       public void onWebSocketError(Throwable cause) {
-               super.onWebSocketError(cause);
-               logger.info("Error: [{}]", String.valueOf(cause.getMessage()));
-       }
 }