private void SetupGraph() {\r
graph = new PlayerGraph(MediaDescription.FileName, playerWindow.Handle);\r
\r
- //TODO hogy lesz igy framrate?\r
- //if (graph.SampleGrabber == null)\r
- // return;\r
-\r
- if (graph.SampleGrabber == null)\r
- throw new Exception("Audio only file is not supported.");\r
-\r
AMMediaType media = new AMMediaType();\r
graph.SampleGrabber.GetConnectedMediaType(media);\r
logger.Debug("SaveSizeInfo");\r
Thread.Sleep(10);\r
\r
if (SeekTo > -1) {\r
+ logger.Info("Seek request");\r
+\r
RealSeek(SeekTo);\r
Thread.Sleep(100);\r
SeekTo = -1;\r
long requestedPosition = (long)Math.Ceiling(value * frameLength);\r
int hr = graph.MediaSeeking.SetPositions(requestedPosition, AMSeekingSeekingFlags.AbsolutePositioning, null, AMSeekingSeekingFlags.NoPositioning);\r
DsError.ThrowExceptionForHR(hr);\r
+ //logger.Debug("Done graph.MediaSeeking.SetPositions");\r
+ Thread.Sleep(10);\r
\r
long currentPosition;\r
+ //logger.Info("Getting graph.MediaSeeking.GetCurrentPosition");\r
+\r
hr = graph.MediaSeeking.GetCurrentPosition(out currentPosition);\r
DsError.ThrowExceptionForHR(hr);\r
+ //logger.Debug("Done graph.MediaSeeking.GetCurrentPosition");\r
+\r
bool corrected = false;\r
+\r
+ //logger.Debug("Chexking reached frames");\r
int reachedFrames = (int)Math.Abs((double)currentPosition / avgTimePerFrame);\r
if (reachedFrames != value) {\r
+ //logger.Debug("Reached frames not matching");\r
//NTSC-n nem megy a seek a kerekítési hibák miatt, mindíg ua. a frame jön ki \r
requestedPosition += (int)frameLength / 2;\r
+ //logger.Debug("Iterating graph.MediaSeeking.SetPositions");\r
hr = graph.MediaSeeking.SetPositions(requestedPosition, AMSeekingSeekingFlags.AbsolutePositioning, null, AMSeekingSeekingFlags.NoPositioning);\r
DsError.ThrowExceptionForHR(hr);\r
corrected = true;\r
playerControls.EndTC.Text = m_mediaDescription.Duration.ToString();\r
}\r
} catch (Exception ce) {\r
- MessageBox.Show("Az állomány nem tölthetõ be: " + ce.Message, "Open Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+ MessageBox.Show("Az állomány nem tölthetõ be. A rendszer üzenete: " + ce.Message, "Open Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
CloseForm();\r
}\r
}\r
\r
} catch (Exception e) {\r
logger.Error(e.Message);\r
+ throw e;\r
}\r
}\r
\r
IBaseFilter videoDecoder = LoadVideoDecoder(graphBuilder);\r
\r
if (videoDecoder == null)\r
- throw new Exception("No video decoder!");\r
+ throw new Exception("Can not load video decoder!");\r
\r
logger.Debug("Connect LAVSplitter -> LAVVideo");\r
FilterGraphTools.ConnectFilters(graphBuilder, splitter, "Video", videoDecoder, "Input", true);\r
logger.Debug("Add LAVSplitter to graph");\r
IBaseFilter splitter = LoadSplitter(graphBuilder);\r
if (splitter == null)\r
- throw new Exception("No splitter!");\r
+ throw new Exception("Can not load splitter!");\r
logger.Debug("Connect SourceFilter -> LAVSplitter");\r
FilterGraphTools.ConnectFilters(graphBuilder, sourceFilter, "Output", splitter, "Input", true);\r
return splitter;\r
// You can specify all the values or you can default the Revision and Build Numbers \r
// by using the '*' as shown below:\r
\r
-[assembly: AssemblyVersion("2.0.8.9")]\r
+[assembly: AssemblyVersion("2.0.9.0")]\r
\r
//\r
// In order to sign your assembly you must specify a key to use. Refer to the \r
[assembly: AssemblyDelaySign(false)]\r
[assembly: AssemblyKeyFile("")]\r
[assembly: AssemblyKeyName("")]\r
-[assembly: AssemblyFileVersion("2.0.8.9")]\r
+[assembly: AssemblyFileVersion("2.0.9.0")]\r
\r
}\r
],\r
"authentication": {\r
+ "defaultUser": "root",\r
+ "defaultPassword": "password", \r
"authEnabled": true,\r
"adHost": "intra.mediavivantis.hu",\r
"adNonSecurePort": 3268,\r
<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 -Dorg.eclipse.epp.logging.aeri.skipReports=true -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Djobengine.jobsteps.root="${workspace_loc}/user.jobengine.executors/config" -Djobengine.jobtemplates.root="${workspace_loc}/user.jobengine.executors/jobtemplates" -Djobengine.db.url=jdbc:db2://10.228.198.1:50000/mediaarc:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.db.user=db2admin -Djobengine.db.password=password -Djobengine.loglevel=INFO -Dlog4j.configurationFile="${workspace_loc}/-configuration/log4j2.xml" -Djobengine.jobsteps.alternate.root="${workspace_loc}/user.jobengine.executors/bin/" -Djetty.home="${workspace_loc:}/-configuration/jetty" -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 -Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty -Djava.io.tmpdir=c:\temp\jetty -Djobengine.octopus.api.address=http://10.10.1.11/api/v1 -Djobengine.octopus.api.user=mam -Djobengine.octopus.api.password=napocska -Djobengine.nosql.db.url=jdbc:db2://10.228.198.1:50000/mccache:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.nosql.db.user=db2admin -Djobengine.nosql.db.password=password -Djobengine.nosql.db.schema=test -Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl -Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium -Djobengine.transcoder.address=http://10.11.1.111:65445/api/json/v1/ -Djobengine.transcoder.template=MP4 -Djobengine.transcoder.version=1 -Djobengine.jobscheduling.config="${workspace_loc}/-configuration/scheduledjobs.json" -Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB; -Djobengine.nexio.db.user=sa -Djobengine.nexio.db.password=resolve -Djobengine.planair.db.url=jdbc:sqlserver://10.11.254.86;databaseName=PA_Vivantis; -Djobengine.planair.db.user=MAM -Djobengine.planair.db.password=VDani -Dnexio.host=192.168.0.12 -Djobengine.nexio.name=testnexioclips -Dnexio.useMOSGateway=false -Dnexio.disable=true -Djobengine.octopus.rundowns.name=rundowns181026 -Djobengine.octopus.storyfolders.name=storyfolders181026 -Djobengine.octopus.stories.name=stories181026 -Djobengine.maestro.config="${workspace_loc}/-configuration/maestro.json" -Djobengine.mediacube.config="${workspace_loc}/-configuration/mediacube.json" -Dgui.statistics.disable=true -Dgui.help.disable=true -Dgui.editor.disable=true -Djobengine.mediafinder.external=false -Djobengine.mediacube.service.proxyroot="/opt" -Djobengine.scheduledexecution.disabled=true -Djobengine.randomize.archives=false"/>\r
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory -Dorg.eclipse.epp.logging.aeri.skipReports=true -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Djobengine.jobsteps.root="${workspace_loc}/user.jobengine.executors/config" -Djobengine.jobtemplates.root="${workspace_loc}/user.jobengine.executors/jobtemplates" -Djobengine.db.url=jdbc:db2://10.228.198.1:50000/mediaarc:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.db.user=db2admin -Djobengine.db.password=password -Djobengine.loglevel=INFO -Dlog4j.configurationFile="${workspace_loc}/-configuration/log4j2.xml" -Djobengine.jobsteps.alternate.root="${workspace_loc}/user.jobengine.executors/bin/" -Djetty.home="${workspace_loc:}/-configuration/jetty" -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 -Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty -Djava.io.tmpdir=c:\temp\jetty -Djobengine.octopus.api.address=http://10.10.1.11/api/v1 -Djobengine.octopus.api.user=mam -Djobengine.octopus.api.password=napocska -Djobengine.nosql.db.url=jdbc:db2://10.228.198.1:50000/mccache:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.nosql.db.user=db2admin -Djobengine.nosql.db.password=password -Djobengine.nosql.db.schema=test -Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl -Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium -Djobengine.transcoder.address=http://10.11.1.111:65445/api/json/v1/ -Djobengine.transcoder.template=MP4 -Djobengine.transcoder.version=1 -Djobengine.jobscheduling.config="${workspace_loc}/-configuration/scheduledjobs.json" -Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB; -Djobengine.nexio.db.user=sa -Djobengine.nexio.db.password=resolve -Djobengine.planair.db.url=jdbc:sqlserver://10.11.254.86;databaseName=PA_Vivantis; -Djobengine.planair.db.user=MAM -Djobengine.planair.db.password=VDani -Dnexio.host=192.168.0.12 -Djobengine.nexio.name=testnexioclips -Dnexio.useMOSGateway=false -Dnexio.disable=true -Djobengine.octopus.rundowns.name=rundowns181026 -Djobengine.octopus.storyfolders.name=storyfolders181026 -Djobengine.octopus.stories.name=stories181026 -Djobengine.maestro.config="${workspace_loc}/-configuration/maestro.json" -Djobengine.mediacube.config="${workspace_loc}/-configuration/mediacube.json" -Dgui.statistics.disable=true -Dgui.help.disable=true -Dgui.editor.disable=true -Djobengine.mediafinder.external=false -Djobengine.mediacube.service.proxyroot="/opt" -Djobengine.scheduledexecution.disabled=false -Djobengine.randomize.archives=false"/>\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.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.ibm.db2jcc4@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,humble.video.noarch@default:default,humble.video.windows@default:default,javax.annotation-api@default:default,javax.mail@default:default,javax.servlet-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.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@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.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.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,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.mybatis.mybatis@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,org.omnifaces@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
{"joblist":[\r
{\r
+ "active": true,\r
+ "executeimmediate": false,\r
+ "cronexpression": "0/10 * * * * ? *",\r
+ "template": "worker-keepalive.xml",\r
+ "parameters": [ \r
+ {"name": "masterAddress", "value": "localhost", "type": "java.lang.String"}\r
+ ]\r
+ }, \r
+ {\r
"template": "cancelable.xml"\r
}, \r
{\r
<executor className="user.jobengine.server.steps.DuplicateRemoverStep" maxConcurrent="1"/>\r
<executor className="user.jobengine.server.steps.FakeNoParamsStep" maxConcurrent="20"/>\r
<executor className="user.jobengine.server.steps.FakeStep" maxConcurrent="20"/>\r
+ <executor className="user.jobengine.server.steps.FileCopyStep" maxConcurrent="10"/>\r
<executor className="user.jobengine.server.steps.GenerateMorpheusMetadataStep" maxConcurrent="10"/>\r
<executor className="user.jobengine.server.steps.HSMMigrateStep" maxConcurrent="1"/>\r
<executor className="user.jobengine.server.steps.ImportMORPHEUSMissingMaterialsStep" maxConcurrent="1"/>\r
<executor className="user.jobengine.server.steps.UploadRecordingToNexioStep" maxConcurrent="1"/>\r
<executor className="user.jobengine.server.steps.MediaToolStep" maxConcurrent="1"/>\r
<executor className="user.jobengine.server.steps.UpdateGhostMediaData" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.FileCopyStep" maxConcurrent="10"/>\r
+ <executor className="user.jobengine.server.steps.WorkerKeepAliveStep" maxConcurrent="1"/>\r
</executors>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>\r
<jobtemplate multiInstance="true">\r
<commands>\r
- <calljobstep id="step1" type="user.jobengine.server.steps.CancelableStep" weight="1" />\r
+ <calljobstep remote="true" id="step1" type="user.jobengine.server.steps.CancelableStep" weight="1">\r
+ </calljobstep>\r
</commands>\r
</jobtemplate>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate>\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="masterAddress" type="java.lang.String"/>\r
+ </parameters>\r
+ </declarations>\r
+\r
+ <commands>\r
+ <calljobstep remote="true" id="step1" type="user.jobengine.server.steps.WorkerKeepAliveStep" weight="1" >\r
+ <inputs>\r
+ <input>\r
+ <parameter name="masterAddress" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
import org.apache.logging.log4j.Logger;\r
import org.apache.logging.log4j.Marker;\r
\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
import user.jobengine.db.IItemManager;\r
import user.jobengine.db.Media;\r
import user.jobengine.db.MediaFile;\r
//Refresh from db\r
List<MediaFile> mediaFiles = manager.getMedia(mediaCubeMedia.getId()).getMediaFiles();\r
if (mediaFiles != null && mediaFiles.size() == 2) {\r
- Store highresStore = manager.getSystemStore(false);\r
+ MediaFile lowres = null;\r
+ MediaFile highres = null;\r
+\r
+ for (MediaFile mf : mediaFiles) {\r
+ if (mf.getStore().getSourceStoreUri(RemoteStoreProtocol.HTTP) != null)\r
+ lowres = mf;\r
+ else\r
+ highres = mf;\r
+ }\r
\r
- //TODO atvezetni a lowres store lekerdezest az alternate-re\r
- Store lowresStore = manager.getSystemStore(true);\r
- MediaFile lowres = get(lowresStore, mediaFiles);\r
- MediaFile highres = get(highresStore, mediaFiles);\r
if (highres == null) {\r
logger.info(marker, "Nincs highres mediaId: {}", mediaCubeMedia.getId());\r
return null;\r
logger.info(marker, "Nincs lowres mediaId: {}", mediaCubeMedia.getId());\r
return null;\r
}\r
+\r
String id = MetadataTypeDetector.truncateExtension(highres.getRelativePath());\r
id = MetadataTypeDetector.truncateVersion(id);\r
boolean detect = MetadataTypeDetector.GuessMetadataType(id) == MetadataType.OctopusPlaceholder\r
return null;\r
}\r
\r
+ Store highresStore = manager.getSystemStore(false);\r
+ final long sourceMediaId = lowres.getId();\r
+ final long highresMediaFileId = highres.getId();\r
+ final String highresRealtivePath = highres.getRelativePath();\r
+\r
manager.executeQuery("SELECT mediaid FROM mediafile WHERE relativepath=? and storeid=? and id!=?", rs -> {\r
long mediaId = rs.getLong(1);\r
Media media = manager.getMedia(mediaId);\r
if (media.getMediaFilesCount() == 1) {\r
- logger.info(marker, "Hiányzó szellem lowres hozzáadása mediaId: {}", media.getId());\r
+ logger.info(marker, "Hiányzó szellem lowres hozzáadása {} alapján", media.getId());\r
\r
- MediaFile mf = (MediaFile) manager.get(MediaFile.class, lowres.getId());\r
+ MediaFile mf = (MediaFile) manager.get(MediaFile.class, sourceMediaId);\r
mf.setMedia(media);\r
mf.setId(0);\r
manager.add(mf);\r
}\r
return true;\r
}, st -> {\r
- st.setString(1, highres.getRelativePath());\r
+ st.setString(1, highresRealtivePath);\r
st.setLong(2, highresStore.getId());\r
- st.setLong(3, highres.getId());\r
+ st.setLong(3, highresMediaFileId);\r
});\r
\r
}\r
return null;\r
}\r
\r
- private MediaFile get(Store store, List<MediaFile> mediaFiles) {\r
- for (MediaFile mf : mediaFiles) {\r
- if (mf.getStoreId() == store.getId())\r
- return mf;\r
- }\r
- return null;\r
- }\r
-\r
}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import javax.ws.rs.core.Response;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.jboss.resteasy.client.jaxrs.ResteasyClient;\r
+import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;\r
+import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;\r
+\r
+public class WorkerKeepAliveStep extends JobStep {\r
+\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @StepEntry\r
+ public Object[] execute(String masterAddress) throws Exception {\r
+ logger.info("Keep alive response: {}", ping(masterAddress));\r
+ return null;\r
+ }\r
+\r
+ private int ping(String masterAddress) {\r
+ int result = 404;\r
+ ResteasyClient client = new ResteasyClientBuilder().build();\r
+ ResteasyWebTarget target = client.target("http://" + masterAddress + ":8888").path("/services/rest/cluster/keepalive").queryParam("responseRoot",\r
+ "teszt");\r
+ Response response = null;\r
+ try {\r
+ response = target.request().get();\r
+ result = response.getStatus();\r
+ } catch (Exception e) {\r
+ logger.error(e.getMessage());\r
+ } finally {\r
+ logger.info("Keep alive response: {}", response.getStatus());\r
+ if (response != null)\r
+ response.close();\r
+ }\r
+ return result;\r
+ }\r
+\r
+}\r
<implementation class="user.jobengine.osgi.server.ComponentBinder"/>\r
<reference cardinality="1..1" interface="user.commons.nexio.INexioAPI" name="INexioAPI" policy="static" bind="bindNexioService" unbind="unbindNexioService"/>\r
<reference bind="bindMetadataProviderFactory" cardinality="0..1" interface="user.mediacube.metadata.interfaces.IMetadataProviderFactory" policy="static"/>\r
-\r
</scr:component>\r
<welcome-file>index.zhtml</welcome-file>\r
</welcome-file-list>\r
<!-- Enable http to https redirect \r
---> \r
<security-constraint>\r
<web-resource-collection>\r
<web-resource-name>Everything on the app</web-resource-name>\r
<transport-guarantee>CONFIDENTIAL</transport-guarantee>\r
</user-data-constraint>\r
</security-constraint>\r
+--> \r
</web-app>\r
-version=2.5.1\r
+version=2.5.2\r
footer=2016-2020 © Copyright User Rendszerház Kft.\r
\r
login_info=Információ\r
boolean isScheduledExecutionDisabled();
+ void keepAliveWorker(String remoteAddr);
+
void loadExecutors();
void loadProgram(String fileName) throws Exception;
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;
private SchedulerService schedulerService = null;
private List<IJobChangedListener> jobChangedListenerList = new CopyOnWriteArrayList<>();
+ private Map<String, LocalDate> 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.
if (instance != null)
throw new RuntimeException("Multiple JobEngine instances are not supported!");
instance = this;
+
+ remoteWorkers = new ConcurrentHashMap<>();
//logger.info("JobEngine created");
}
logger.catching(e);
suspendWaitExecutorJob(e, jobRuntime);
}
- // logger.info("addToExecutorQueue: " + typeName);
- // if (typeName != null && String.class.equals(typeName.getClass())) {
- // for (IJobStepExecutor executor : executors.values()) {
- // Class<? extends IJobStep> 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
statusMachine.processAction(JobAction.FINISH, jobRuntime);
}
+ @Override
+ public void keepAliveWorker(String remoteAddr) {
+ remoteWorkers.put(remoteAddr, LocalDate.now());
+ }
+
@Override
public void loadExecutors() {
// TODO
private ParameterSequence outputParameterSequence = null;\r
private CommandSequence commandSequence = null;\r
private String type = null;\r
+ private boolean isRemote;\r
\r
public CallJobStepCommand() {\r
}\r
return weight;\r
}\r
\r
+ public boolean isRemote() {\r
+ return isRemote;\r
+ }\r
+\r
public void setCommandSequence(CommandSequence commandSequence) {\r
this.commandSequence = commandSequence;\r
}\r
this.outputParameterSequence = outputParameterSequence;\r
}\r
\r
+ public void setRemote(boolean isRemote) {\r
+ this.isRemote = isRemote;\r
+ }\r
+\r
public void setType(String type) {\r
this.type = type;\r
}\r
}\r
\r
p.addInstruction(new PushToStackInstruction(command.getType()));\r
- p.addInstruction(new CallJobStepInstruction(command.getWeight()));\r
+ p.addInstruction(new CallJobStepInstruction(command.getWeight(), command.isRemote()));\r
\r
if (outputs != null) {\r
for (@SuppressWarnings("unused")\r
this.service = service;\r
}\r
\r
+ //TODO foreach ellenorzes\r
public List<String> validate() throws Exception {\r
Map<String, String> parameters = new HashMap<>();\r
Map<String, String> variables = new HashMap<>();\r
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);
}
super.execute(jobEngine, jobRuntime);
jobEngine.executeCallJobStepInstruction(jobRuntime);
}
+
+ public boolean isRemote() {
+ return isRemote;
+ }
+
+ public void setRemote(boolean isRemote) {
+ this.isRemote = isRemote;
+ }
}
\r
public boolean isMaestroAvailable() {\r
return ComponentBinder.getMetadataProviderFactory() != null\r
- && ComponentBinder.getMetadataProviderFactory().getProvider(MetadataProviderType.PLANAIR) != null;\r
+ && ComponentBinder.getMetadataProviderFactory().getProvider(MetadataProviderType.PLANAIR) != null\r
+ && System.getProperty("jobengine.maestro.config", "").length() > 0;\r
\r
}\r
\r
</servlet-mapping>\r
\r
<!-- \r
- -->\r
<security-constraint>\r
<web-resource-collection>\r
<web-resource-name>Everything on the app</web-resource-name>\r
<transport-guarantee>CONFIDENTIAL</transport-guarantee>\r
</user-data-constraint>\r
</security-constraint>\r
+ -->\r
\r
</web-app>\r
--- /dev/null
+package user.jobengine.osgi.mediacube;\r
+\r
+import javax.servlet.http.HttpServletRequest;\r
+import javax.ws.rs.GET;\r
+import javax.ws.rs.Path;\r
+import javax.ws.rs.QueryParam;\r
+import javax.ws.rs.core.Context;\r
+import javax.ws.rs.core.Response;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.osgi.rest.ComponentBinder;\r
+import user.jobengine.server.IJobEngine;\r
+\r
+@Path("/cluster")\r
+public class ClusterService {\r
+\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private IItemManager itemManager = ComponentBinder.getItemManager();\r
+ private IJobEngine jobEngine = ComponentBinder.getJobengine();\r
+\r
+ public ClusterService() {\r
+ logger.info("Created");\r
+ }\r
+\r
+ @GET\r
+ @Path("/keepalive")\r
+ public Response keepAlive(@Context HttpServletRequest request, @QueryParam("responseRoot") String responseRoot) {\r
+ Response result = null;\r
+ try {\r
+ logger.info("Keepalive {}, {}, {}", request.getRemoteAddr(), request.getRemoteHost(), request.getRemotePort());\r
+\r
+ jobEngine.keepAliveWorker(request.getRemoteAddr());\r
+ result = Response.ok().build();\r
+ } catch (Exception e) {\r
+ result = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();\r
+ }\r
+ return result;\r
+ }\r
+}\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
\r
+import user.jobengine.osgi.mediacube.ClusterService;\r
import user.jobengine.osgi.mediacube.MediaCubeService;\r
import user.jobengine.osgi.rest.octopus.OctopusRESTService;\r
\r
\r
@Override\r
public Set<Class<?>> getClasses() {\r
- return new HashSet<>(Arrays.asList(OctopusRESTService.class, MediaCubeService.class, JacksonJsonProvider.class, TextMessageBodyReaderWriter.class));\r
+ return new HashSet<>(Arrays.asList(OctopusRESTService.class, MediaCubeService.class, ClusterService.class, JacksonJsonProvider.class,\r
+ TextMessageBodyReaderWriter.class));\r
}\r
}\r