From 5be8940d70353368ffb7380c46b0b0a0037e2aa6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1s=C3=A1ry=20D=C3=A1niel?= Date: Wed, 6 May 2020 13:21:31 +0000 Subject: [PATCH] git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube;C31808 --- client/DxPlay/DxPlayer.cs | 19 +++++---- client/DxPlay/PlayerForm.cs | 2 +- client/DxPlay/PlayerGraph.cs | 5 ++- client/DxPlay/Properties/AssemblyInfo.cs | 4 +- server/-configuration/mediacube.json | 2 + .../run-mediacube-server-user.launch | 2 +- server/-configuration/scheduledjobs.json | 9 ++++ .../config/config.xml | 3 +- .../jobtemplates/cancelable.xml | 3 +- .../jobtemplates/worker-keepalive.xml | 18 ++++++++ .../server/steps/UpdateGhostMediaData.java | 37 ++++++++-------- .../server/steps/WorkerKeepAliveStep.java | 40 ++++++++++++++++++ .../OSGI-INF/componentBinder.xml | 1 - .../WEB-INF/web.xml | 2 +- .../resources/i3-label_hu.properties | 2 +- .../src/user/jobengine/server/IJobEngine.java | 2 + .../src/user/jobengine/server/JobEngine.java | 21 ++++------ .../server/ast/CallJobStepCommand.java | 9 ++++ .../user/jobengine/server/ast/Encoder.java | 2 +- .../jobengine/server/ast/JobTemplate.java | 1 + .../instructions/CallJobStepInstruction.java | 12 +++++- .../user/jobengine/zk/model/MenuModel.java | 3 +- .../WEB-INF/web.xml | 2 +- .../osgi/mediacube/ClusterService.java | 42 +++++++++++++++++++ .../jobengine/osgi/rest/RESTApplications.java | 4 +- 25 files changed, 195 insertions(+), 52 deletions(-) create mode 100644 server/user.jobengine.executors/jobtemplates/worker-keepalive.xml create mode 100644 server/user.jobengine.executors/src/user/jobengine/server/steps/WorkerKeepAliveStep.java create mode 100644 server/user.jobengine.osgi.services/src/user/jobengine/osgi/mediacube/ClusterService.java diff --git a/client/DxPlay/DxPlayer.cs b/client/DxPlay/DxPlayer.cs index f447898f..0d949141 100644 --- a/client/DxPlay/DxPlayer.cs +++ b/client/DxPlay/DxPlayer.cs @@ -130,13 +130,6 @@ namespace DxPlay { private void SetupGraph() { graph = new PlayerGraph(MediaDescription.FileName, playerWindow.Handle); - //TODO hogy lesz igy framrate? - //if (graph.SampleGrabber == null) - // return; - - if (graph.SampleGrabber == null) - throw new Exception("Audio only file is not supported."); - AMMediaType media = new AMMediaType(); graph.SampleGrabber.GetConnectedMediaType(media); logger.Debug("SaveSizeInfo"); @@ -166,6 +159,8 @@ namespace DxPlay { Thread.Sleep(10); if (SeekTo > -1) { + logger.Info("Seek request"); + RealSeek(SeekTo); Thread.Sleep(100); SeekTo = -1; @@ -235,15 +230,25 @@ namespace DxPlay { long requestedPosition = (long)Math.Ceiling(value * frameLength); int hr = graph.MediaSeeking.SetPositions(requestedPosition, AMSeekingSeekingFlags.AbsolutePositioning, null, AMSeekingSeekingFlags.NoPositioning); DsError.ThrowExceptionForHR(hr); + //logger.Debug("Done graph.MediaSeeking.SetPositions"); + Thread.Sleep(10); long currentPosition; + //logger.Info("Getting graph.MediaSeeking.GetCurrentPosition"); + hr = graph.MediaSeeking.GetCurrentPosition(out currentPosition); DsError.ThrowExceptionForHR(hr); + //logger.Debug("Done graph.MediaSeeking.GetCurrentPosition"); + bool corrected = false; + + //logger.Debug("Chexking reached frames"); int reachedFrames = (int)Math.Abs((double)currentPosition / avgTimePerFrame); if (reachedFrames != value) { + //logger.Debug("Reached frames not matching"); //NTSC-n nem megy a seek a kerekítési hibák miatt, mindíg ua. a frame jön ki requestedPosition += (int)frameLength / 2; + //logger.Debug("Iterating graph.MediaSeeking.SetPositions"); hr = graph.MediaSeeking.SetPositions(requestedPosition, AMSeekingSeekingFlags.AbsolutePositioning, null, AMSeekingSeekingFlags.NoPositioning); DsError.ThrowExceptionForHR(hr); corrected = true; diff --git a/client/DxPlay/PlayerForm.cs b/client/DxPlay/PlayerForm.cs index 8ef8fd07..fa9be0e0 100644 --- a/client/DxPlay/PlayerForm.cs +++ b/client/DxPlay/PlayerForm.cs @@ -165,7 +165,7 @@ namespace DxPlay { playerControls.EndTC.Text = m_mediaDescription.Duration.ToString(); } } catch (Exception ce) { - MessageBox.Show("Az állomány nem tölthetõ be: " + ce.Message, "Open Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show("Az állomány nem tölthetõ be. A rendszer üzenete: " + ce.Message, "Open Error", MessageBoxButtons.OK, MessageBoxIcon.Error); CloseForm(); } } diff --git a/client/DxPlay/PlayerGraph.cs b/client/DxPlay/PlayerGraph.cs index 3cfa8619..4c2391a2 100644 --- a/client/DxPlay/PlayerGraph.cs +++ b/client/DxPlay/PlayerGraph.cs @@ -65,6 +65,7 @@ namespace DxPlay { } catch (Exception e) { logger.Error(e.Message); + throw e; } } @@ -151,7 +152,7 @@ namespace DxPlay { IBaseFilter videoDecoder = LoadVideoDecoder(graphBuilder); if (videoDecoder == null) - throw new Exception("No video decoder!"); + throw new Exception("Can not load video decoder!"); logger.Debug("Connect LAVSplitter -> LAVVideo"); FilterGraphTools.ConnectFilters(graphBuilder, splitter, "Video", videoDecoder, "Input", true); @@ -162,7 +163,7 @@ namespace DxPlay { logger.Debug("Add LAVSplitter to graph"); IBaseFilter splitter = LoadSplitter(graphBuilder); if (splitter == null) - throw new Exception("No splitter!"); + throw new Exception("Can not load splitter!"); logger.Debug("Connect SourceFilter -> LAVSplitter"); FilterGraphTools.ConnectFilters(graphBuilder, sourceFilter, "Output", splitter, "Input", true); return splitter; diff --git a/client/DxPlay/Properties/AssemblyInfo.cs b/client/DxPlay/Properties/AssemblyInfo.cs index bc238e26..067dc019 100644 --- a/client/DxPlay/Properties/AssemblyInfo.cs +++ b/client/DxPlay/Properties/AssemblyInfo.cs @@ -26,7 +26,7 @@ using System.Runtime.CompilerServices; // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.8.9")] +[assembly: AssemblyVersion("2.0.9.0")] // // In order to sign your assembly you must specify a key to use. Refer to the @@ -56,5 +56,5 @@ using System.Runtime.CompilerServices; [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] [assembly: AssemblyKeyName("")] -[assembly: AssemblyFileVersion("2.0.8.9")] +[assembly: AssemblyFileVersion("2.0.9.0")] diff --git a/server/-configuration/mediacube.json b/server/-configuration/mediacube.json index 5e36e7f5..eecb410e 100644 --- a/server/-configuration/mediacube.json +++ b/server/-configuration/mediacube.json @@ -74,6 +74,8 @@ } ], "authentication": { + "defaultUser": "root", + "defaultPassword": "password", "authEnabled": true, "adHost": "intra.mediavivantis.hu", "adNonSecurePort": 3268, diff --git a/server/-configuration/run-mediacube-server-user.launch b/server/-configuration/run-mediacube-server-user.launch index 670a5937..263f1dc8 100644 --- a/server/-configuration/run-mediacube-server-user.launch +++ b/server/-configuration/run-mediacube-server-user.launch @@ -19,7 +19,7 @@ - + diff --git a/server/-configuration/scheduledjobs.json b/server/-configuration/scheduledjobs.json index 62c016ff..0f881970 100644 --- a/server/-configuration/scheduledjobs.json +++ b/server/-configuration/scheduledjobs.json @@ -1,5 +1,14 @@ {"joblist":[ { + "active": true, + "executeimmediate": false, + "cronexpression": "0/10 * * * * ? *", + "template": "worker-keepalive.xml", + "parameters": [ + {"name": "masterAddress", "value": "localhost", "type": "java.lang.String"} + ] + }, + { "template": "cancelable.xml" }, { diff --git a/server/user.jobengine.executors/config/config.xml b/server/user.jobengine.executors/config/config.xml index 039626a1..9e925cb0 100644 --- a/server/user.jobengine.executors/config/config.xml +++ b/server/user.jobengine.executors/config/config.xml @@ -19,6 +19,7 @@ + @@ -40,5 +41,5 @@ - + \ No newline at end of file diff --git a/server/user.jobengine.executors/jobtemplates/cancelable.xml b/server/user.jobengine.executors/jobtemplates/cancelable.xml index 899a3c10..689be151 100644 --- a/server/user.jobengine.executors/jobtemplates/cancelable.xml +++ b/server/user.jobengine.executors/jobtemplates/cancelable.xml @@ -1,6 +1,7 @@ - + + \ No newline at end of file diff --git a/server/user.jobengine.executors/jobtemplates/worker-keepalive.xml b/server/user.jobengine.executors/jobtemplates/worker-keepalive.xml new file mode 100644 index 00000000..c055aaa0 --- /dev/null +++ b/server/user.jobengine.executors/jobtemplates/worker-keepalive.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/UpdateGhostMediaData.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/UpdateGhostMediaData.java index 1507e4c1..e6bd1414 100644 --- a/server/user.jobengine.executors/src/user/jobengine/server/steps/UpdateGhostMediaData.java +++ b/server/user.jobengine.executors/src/user/jobengine/server/steps/UpdateGhostMediaData.java @@ -6,6 +6,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; +import user.commons.remotestore.RemoteStoreProtocol; import user.jobengine.db.IItemManager; import user.jobengine.db.Media; import user.jobengine.db.MediaFile; @@ -26,12 +27,16 @@ public class UpdateGhostMediaData extends JobStep { //Refresh from db List mediaFiles = manager.getMedia(mediaCubeMedia.getId()).getMediaFiles(); if (mediaFiles != null && mediaFiles.size() == 2) { - Store highresStore = manager.getSystemStore(false); + MediaFile lowres = null; + MediaFile highres = null; + + for (MediaFile mf : mediaFiles) { + if (mf.getStore().getSourceStoreUri(RemoteStoreProtocol.HTTP) != null) + lowres = mf; + else + highres = mf; + } - //TODO atvezetni a lowres store lekerdezest az alternate-re - Store lowresStore = manager.getSystemStore(true); - MediaFile lowres = get(lowresStore, mediaFiles); - MediaFile highres = get(highresStore, mediaFiles); if (highres == null) { logger.info(marker, "Nincs highres mediaId: {}", mediaCubeMedia.getId()); return null; @@ -40,6 +45,7 @@ public class UpdateGhostMediaData extends JobStep { logger.info(marker, "Nincs lowres mediaId: {}", mediaCubeMedia.getId()); return null; } + String id = MetadataTypeDetector.truncateExtension(highres.getRelativePath()); id = MetadataTypeDetector.truncateVersion(id); boolean detect = MetadataTypeDetector.GuessMetadataType(id) == MetadataType.OctopusPlaceholder @@ -49,13 +55,18 @@ public class UpdateGhostMediaData extends JobStep { return null; } + Store highresStore = manager.getSystemStore(false); + final long sourceMediaId = lowres.getId(); + final long highresMediaFileId = highres.getId(); + final String highresRealtivePath = highres.getRelativePath(); + manager.executeQuery("SELECT mediaid FROM mediafile WHERE relativepath=? and storeid=? and id!=?", rs -> { long mediaId = rs.getLong(1); Media media = manager.getMedia(mediaId); if (media.getMediaFilesCount() == 1) { - logger.info(marker, "Hiányzó szellem lowres hozzáadása mediaId: {}", media.getId()); + logger.info(marker, "Hiányzó szellem lowres hozzáadása {} alapján", media.getId()); - MediaFile mf = (MediaFile) manager.get(MediaFile.class, lowres.getId()); + MediaFile mf = (MediaFile) manager.get(MediaFile.class, sourceMediaId); mf.setMedia(media); mf.setId(0); manager.add(mf); @@ -64,9 +75,9 @@ public class UpdateGhostMediaData extends JobStep { } return true; }, st -> { - st.setString(1, highres.getRelativePath()); + st.setString(1, highresRealtivePath); st.setLong(2, highresStore.getId()); - st.setLong(3, highres.getId()); + st.setLong(3, highresMediaFileId); }); } @@ -74,12 +85,4 @@ public class UpdateGhostMediaData extends JobStep { return null; } - private MediaFile get(Store store, List mediaFiles) { - for (MediaFile mf : mediaFiles) { - if (mf.getStoreId() == store.getId()) - return mf; - } - return null; - } - } diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/WorkerKeepAliveStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/WorkerKeepAliveStep.java new file mode 100644 index 00000000..d181ac3e --- /dev/null +++ b/server/user.jobengine.executors/src/user/jobengine/server/steps/WorkerKeepAliveStep.java @@ -0,0 +1,40 @@ +package user.jobengine.server.steps; + +import javax.ws.rs.core.Response; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.jboss.resteasy.client.jaxrs.ResteasyClient; +import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; +import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget; + +public class WorkerKeepAliveStep extends JobStep { + + private static final Logger logger = LogManager.getLogger(); + + @StepEntry + public Object[] execute(String masterAddress) throws Exception { + logger.info("Keep alive response: {}", ping(masterAddress)); + return null; + } + + private int ping(String masterAddress) { + int result = 404; + ResteasyClient client = new ResteasyClientBuilder().build(); + ResteasyWebTarget target = client.target("http://" + masterAddress + ":8888").path("/services/rest/cluster/keepalive").queryParam("responseRoot", + "teszt"); + Response response = null; + try { + response = target.request().get(); + result = response.getStatus(); + } catch (Exception e) { + logger.error(e.getMessage()); + } finally { + logger.info("Keep alive response: {}", response.getStatus()); + if (response != null) + response.close(); + } + return result; + } + +} diff --git a/server/user.jobengine.osgi.server/OSGI-INF/componentBinder.xml b/server/user.jobengine.osgi.server/OSGI-INF/componentBinder.xml index 6c60ba5a..a8f596c9 100644 --- a/server/user.jobengine.osgi.server/OSGI-INF/componentBinder.xml +++ b/server/user.jobengine.osgi.server/OSGI-INF/componentBinder.xml @@ -3,5 +3,4 @@ - diff --git a/server/user.jobengine.osgi.server/WEB-INF/web.xml b/server/user.jobengine.osgi.server/WEB-INF/web.xml index 177b6de9..6caf8c81 100644 --- a/server/user.jobengine.osgi.server/WEB-INF/web.xml +++ b/server/user.jobengine.osgi.server/WEB-INF/web.xml @@ -70,7 +70,6 @@ index.zhtml Everything on the app @@ -80,4 +79,5 @@ CONFIDENTIAL +--> diff --git a/server/user.jobengine.osgi.server/resources/i3-label_hu.properties b/server/user.jobengine.osgi.server/resources/i3-label_hu.properties index 1365bff0..eb54b61d 100644 --- a/server/user.jobengine.osgi.server/resources/i3-label_hu.properties +++ b/server/user.jobengine.osgi.server/resources/i3-label_hu.properties @@ -1,4 +1,4 @@ -version=2.5.1 +version=2.5.2 footer=2016-2020 © Copyright User Rendszerház Kft. login_info=Információ diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/server/IJobEngine.java b/server/user.jobengine.osgi.server/src/user/jobengine/server/IJobEngine.java index 1fd6bea7..b9dd419d 100644 --- a/server/user.jobengine.osgi.server/src/user/jobengine/server/IJobEngine.java +++ b/server/user.jobengine.osgi.server/src/user/jobengine/server/IJobEngine.java @@ -71,6 +71,8 @@ public interface IJobEngine { boolean isScheduledExecutionDisabled(); + void keepAliveWorker(String remoteAddr); + void loadExecutors(); void loadProgram(String fileName) throws Exception; diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/server/JobEngine.java b/server/user.jobengine.osgi.server/src/user/jobengine/server/JobEngine.java index dafd1f8d..412d8342 100644 --- a/server/user.jobengine.osgi.server/src/user/jobengine/server/JobEngine.java +++ b/server/user.jobengine.osgi.server/src/user/jobengine/server/JobEngine.java @@ -5,6 +5,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.sql.Timestamp; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -178,6 +179,7 @@ public class JobEngine implements IJobEngine { private SchedulerService schedulerService = null; private List jobChangedListenerList = new CopyOnWriteArrayList<>(); + private Map remoteWorkers; /** * 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. @@ -201,6 +203,8 @@ public class JobEngine implements IJobEngine { if (instance != null) throw new RuntimeException("Multiple JobEngine instances are not supported!"); instance = this; + + remoteWorkers = new ConcurrentHashMap<>(); //logger.info("JobEngine created"); } @@ -241,18 +245,6 @@ public class JobEngine implements IJobEngine { logger.catching(e); suspendWaitExecutorJob(e, jobRuntime); } - // logger.info("addToExecutorQueue: " + typeName); - // if (typeName != null && String.class.equals(typeName.getClass())) { - // for (IJobStepExecutor executor : executors.values()) { - // Class clazz = executor.getStepClass(); - // if (clazz != null && clazz.getName().equals(typeName)) { - // executor.submit(jobRuntime); - // break; - // } - // } - // } else { - // logger.error("Executor type name is not correcty defined."); - // } } @Override @@ -503,6 +495,11 @@ public class JobEngine implements IJobEngine { statusMachine.processAction(JobAction.FINISH, jobRuntime); } + @Override + public void keepAliveWorker(String remoteAddr) { + remoteWorkers.put(remoteAddr, LocalDate.now()); + } + @Override public void loadExecutors() { // TODO diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/server/ast/CallJobStepCommand.java b/server/user.jobengine.osgi.server/src/user/jobengine/server/ast/CallJobStepCommand.java index ed88ad50..76908a52 100644 --- a/server/user.jobengine.osgi.server/src/user/jobengine/server/ast/CallJobStepCommand.java +++ b/server/user.jobengine.osgi.server/src/user/jobengine/server/ast/CallJobStepCommand.java @@ -6,6 +6,7 @@ public class CallJobStepCommand extends Command { private ParameterSequence outputParameterSequence = null; private CommandSequence commandSequence = null; private String type = null; + private boolean isRemote; public CallJobStepCommand() { } @@ -36,6 +37,10 @@ public class CallJobStepCommand extends Command { return weight; } + public boolean isRemote() { + return isRemote; + } + public void setCommandSequence(CommandSequence commandSequence) { this.commandSequence = commandSequence; } @@ -48,6 +53,10 @@ public class CallJobStepCommand extends Command { this.outputParameterSequence = outputParameterSequence; } + public void setRemote(boolean isRemote) { + this.isRemote = isRemote; + } + public void setType(String type) { this.type = type; } diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/server/ast/Encoder.java b/server/user.jobengine.osgi.server/src/user/jobengine/server/ast/Encoder.java index f09a0bbc..2845bb77 100644 --- a/server/user.jobengine.osgi.server/src/user/jobengine/server/ast/Encoder.java +++ b/server/user.jobengine.osgi.server/src/user/jobengine/server/ast/Encoder.java @@ -46,7 +46,7 @@ public class Encoder implements Visitor { } p.addInstruction(new PushToStackInstruction(command.getType())); - p.addInstruction(new CallJobStepInstruction(command.getWeight())); + p.addInstruction(new CallJobStepInstruction(command.getWeight(), command.isRemote())); if (outputs != null) { for (@SuppressWarnings("unused") diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/server/ast/JobTemplate.java b/server/user.jobengine.osgi.server/src/user/jobengine/server/ast/JobTemplate.java index 885f2f67..d1f85504 100644 --- a/server/user.jobengine.osgi.server/src/user/jobengine/server/ast/JobTemplate.java +++ b/server/user.jobengine.osgi.server/src/user/jobengine/server/ast/JobTemplate.java @@ -82,6 +82,7 @@ public class JobTemplate extends AST { this.service = service; } + //TODO foreach ellenorzes public List validate() throws Exception { Map parameters = new HashMap<>(); Map variables = new HashMap<>(); diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/server/instructions/CallJobStepInstruction.java b/server/user.jobengine.osgi.server/src/user/jobengine/server/instructions/CallJobStepInstruction.java index 1b974a3f..f08b1acc 100644 --- a/server/user.jobengine.osgi.server/src/user/jobengine/server/instructions/CallJobStepInstruction.java +++ b/server/user.jobengine.osgi.server/src/user/jobengine/server/instructions/CallJobStepInstruction.java @@ -4,11 +4,13 @@ import user.jobengine.server.IJobEngine; import user.jobengine.server.IJobRuntime; public class CallJobStepInstruction extends Instruction { + private boolean isRemote; public CallJobStepInstruction() { } - public CallJobStepInstruction(int weight) { + public CallJobStepInstruction(int weight, boolean isRemote) { + this.isRemote = isRemote; setWeight(weight); } @@ -17,4 +19,12 @@ public class CallJobStepInstruction extends Instruction { super.execute(jobEngine, jobRuntime); jobEngine.executeCallJobStepInstruction(jobRuntime); } + + public boolean isRemote() { + return isRemote; + } + + public void setRemote(boolean isRemote) { + this.isRemote = isRemote; + } } diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/MenuModel.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/MenuModel.java index 5f3f2457..38960e87 100644 --- a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/MenuModel.java +++ b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/MenuModel.java @@ -66,7 +66,8 @@ public class MenuModel extends BaseModel { public boolean isMaestroAvailable() { return ComponentBinder.getMetadataProviderFactory() != null - && ComponentBinder.getMetadataProviderFactory().getProvider(MetadataProviderType.PLANAIR) != null; + && ComponentBinder.getMetadataProviderFactory().getProvider(MetadataProviderType.PLANAIR) != null + && System.getProperty("jobengine.maestro.config", "").length() > 0; } diff --git a/server/user.jobengine.osgi.services/WEB-INF/web.xml b/server/user.jobengine.osgi.services/WEB-INF/web.xml index 629b2ac1..fac36c85 100644 --- a/server/user.jobengine.osgi.services/WEB-INF/web.xml +++ b/server/user.jobengine.osgi.services/WEB-INF/web.xml @@ -62,7 +62,6 @@ Everything on the app @@ -72,5 +71,6 @@ CONFIDENTIAL + --> diff --git a/server/user.jobengine.osgi.services/src/user/jobengine/osgi/mediacube/ClusterService.java b/server/user.jobengine.osgi.services/src/user/jobengine/osgi/mediacube/ClusterService.java new file mode 100644 index 00000000..3eb430b6 --- /dev/null +++ b/server/user.jobengine.osgi.services/src/user/jobengine/osgi/mediacube/ClusterService.java @@ -0,0 +1,42 @@ +package user.jobengine.osgi.mediacube; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import user.jobengine.db.IItemManager; +import user.jobengine.osgi.rest.ComponentBinder; +import user.jobengine.server.IJobEngine; + +@Path("/cluster") +public class ClusterService { + + private static final Logger logger = LogManager.getLogger(); + private IItemManager itemManager = ComponentBinder.getItemManager(); + private IJobEngine jobEngine = ComponentBinder.getJobengine(); + + public ClusterService() { + logger.info("Created"); + } + + @GET + @Path("/keepalive") + public Response keepAlive(@Context HttpServletRequest request, @QueryParam("responseRoot") String responseRoot) { + Response result = null; + try { + logger.info("Keepalive {}, {}, {}", request.getRemoteAddr(), request.getRemoteHost(), request.getRemotePort()); + + jobEngine.keepAliveWorker(request.getRemoteAddr()); + result = Response.ok().build(); + } catch (Exception e) { + result = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); + } + return result; + } +} diff --git a/server/user.jobengine.osgi.services/src/user/jobengine/osgi/rest/RESTApplications.java b/server/user.jobengine.osgi.services/src/user/jobengine/osgi/rest/RESTApplications.java index 8ec8060a..dcaf16e6 100644 --- a/server/user.jobengine.osgi.services/src/user/jobengine/osgi/rest/RESTApplications.java +++ b/server/user.jobengine.osgi.services/src/user/jobengine/osgi/rest/RESTApplications.java @@ -9,6 +9,7 @@ import javax.ws.rs.core.Application; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import user.jobengine.osgi.mediacube.ClusterService; import user.jobengine.osgi.mediacube.MediaCubeService; import user.jobengine.osgi.rest.octopus.OctopusRESTService; @@ -24,6 +25,7 @@ public class RESTApplications extends Application { @Override public Set> getClasses() { - return new HashSet<>(Arrays.asList(OctopusRESTService.class, MediaCubeService.class, JacksonJsonProvider.class, TextMessageBodyReaderWriter.class)); + return new HashSet<>(Arrays.asList(OctopusRESTService.class, MediaCubeService.class, ClusterService.class, JacksonJsonProvider.class, + TextMessageBodyReaderWriter.class)); } } -- 2.54.0