--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
+<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">\r
+<booleanAttribute key="append.args" value="true"/>\r
+<booleanAttribute key="automaticAdd" value="false"/>\r
+<booleanAttribute key="automaticValidate" value="true"/>\r
+<stringAttribute key="bootstrap" value=""/>\r
+<stringAttribute key="checked" value="[NONE]"/>\r
+<booleanAttribute key="clearConfig" value="true"/>\r
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/run-mediacube-server-user-worker"/>\r
+<booleanAttribute key="default" value="true"/>\r
+<booleanAttribute key="default_auto_start" value="false"/>\r
+<intAttribute key="default_start_level" value="4"/>\r
+<booleanAttribute key="includeOptional" value="false"/>\r
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">\r
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>\r
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>\r
+</listAttribute>\r
+<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>\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=false -Djobengine.randomize.archives=false -Djobengine.master.server=http://localhost:8888"/>\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
+<booleanAttribute key="tracing" value="false"/>\r
+<booleanAttribute key="useCustomFeatures" value="false"/>\r
+<booleanAttribute key="useDefaultConfigArea" value="true"/>\r
+<stringAttribute key="workspace_bundles" value="user.commons.log4j2@default:false,user.jobengine.osgi.commons@default:true,user.jobengine.osgi.db@default:default,user.jobengine.osgi.server@default:default,user.jobengine.osgi.services@default:default,user.mediacube.metadata@default:default,user.tsm.client@default:default"/>\r
+</launchConfiguration>\r
{"joblist":[\r
{\r
- "active": true,\r
+ "active": false,\r
"executeimmediate": false,\r
"cronexpression": "0/10 * * * * ? *",\r
"template": "worker-keepalive.xml",\r
<?xml version="1.0" encoding="UTF-8"?>\r
<executors>\r
- <executor className="user.jobengine.server.steps.ArchiveListBuilderStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.ArchiveMaterialSubmitStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.BatchRetrieveForkStep" maxConcurrent="10"/>\r
- <executor className="user.jobengine.server.steps.CancelableStep" maxConcurrent="10"/>\r
- <executor className="user.jobengine.server.steps.CheckLOWRESIntegrity" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.CheckMORPHEUSMissingMaterialsStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.CheckTRAFFICMissingMaterialsStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.CleanupMountedLocationStep" maxConcurrent="10"/>\r
- <executor className="user.jobengine.server.steps.ProjectCleanupMountedLocationStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.CopyForArchiveNEXIOMaterialsStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.CopyForArchiveNEXIORecordingsStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.CreateMissingLowresStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.DeleteNEXIOMaterialsStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.DetectMissingLengthStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.DeleteFileStep" maxConcurrent="100"/>\r
- <executor className="user.jobengine.server.steps.DownloadRecordingFromNexioStep" maxConcurrent="1"/>\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.ImportStatisticsStep" maxConcurrent="7"/>\r
- <executor className="user.jobengine.server.steps.MetadataTransformStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.MXFCutterStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.OutputPathAndNameSelectorStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.RecordingsArchiveItemBuilderStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.SyncOCTOPUSDataStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.SubmitChildStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.TranscodeFFAStranStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.TranscodeSELENIOStep" maxConcurrent="4"/>\r
- <executor className="user.jobengine.server.steps.TranscodeStep" maxConcurrent="4"/>\r
- <executor className="user.jobengine.server.steps.TSMBackupStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.TSMExtendedRetrieveStep" maxConcurrent="1" />\r
- <executor className="user.jobengine.server.steps.TSMRestoreStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.TSMSystemRestoreStep" maxConcurrent="1"/>\r
- <executor className="user.jobengine.server.steps.TSMRetrieveMissingMaterialStep" 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.WorkerKeepAliveStep" maxConcurrent="1"/>\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.FakeNoParamsStep" maxConcurrent="20" 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
\r
@StepEntry\r
public Object[] execute(String masterAddress) throws Exception {\r
- logger.info("Keep alive response: {}", ping(masterAddress));\r
+ int ping = ping(masterAddress);\r
+ if (ping == 404)\r
+ logger.error("Keep alive response: {}", ping);\r
+ else\r
+ logger.debug("Keep alive response: {}", ping);\r
return null;\r
}\r
\r
} catch (Exception e) {\r
logger.error(e.getMessage());\r
} finally {\r
- logger.info("Keep alive response: {}", response.getStatus());\r
+ logger.debug("Keep alive response: {}", response.getStatus());\r
if (response != null)\r
response.close();\r
}\r
Service-Component: OSGI-INF/component.xml, OSGI-INF/componentBinder.xml
Import-Package: javax.servlet;version="3.1.0",
javax.servlet.http;version="3.1.0",
+ javax.ws.rs.client,
+ javax.ws.rs.core,
org.apache.commons.io.output;version="2.2.0",
org.apache.logging.log4j;version="2.8.2",
org.apache.logging.log4j.message;version="2.8.2",
org.eclipse.core.runtime.adaptor,
org.eclipse.osgi.framework.console;version="1.1.0",
+ org.jboss.resteasy.client.jaxrs,
org.osgi.framework;version="1.5.0",
org.osgi.framework.wiring;version="1.2.0",
org.osgi.util.tracker;version="1.4.0",
\r
public class ExecutorConfigParser {\r
private static final Logger logger = LogManager.getLogger();\r
- private final InputStream stream;\r
-\r
private static String EXECUTORS = "executors";\r
+\r
private static String EXECUTOR = "executors/executor";\r
+ private final InputStream stream;\r
\r
public ExecutorConfigParser(InputStream stream) {\r
this.stream = stream;\r
digester.setClassLoader(this.getClass().getClassLoader());\r
digester.addObjectCreate(EXECUTORS, ArrayList.class);\r
digester.addObjectCreate(EXECUTOR, JobStepExecutor.class);\r
- digester.addCallMethod(EXECUTOR, "create", 2, new Class<?>[] { String.class, int.class });\r
+ digester.addCallMethod(EXECUTOR, "create", 3, new Class<?>[] { String.class, int.class, boolean.class });\r
digester.addCallParam(EXECUTOR, 0, "className");\r
digester.addCallParam(EXECUTOR, 1, "maxConcurrent");\r
+ digester.addCallParam(EXECUTOR, 2, "isRemote");\r
digester.addSetNext(EXECUTOR, "add");\r
result = (List<IJobStepExecutor>) (List<?>) digester.parse(stream);\r
} catch (Exception e) {\r
Map<String, IProgram> getPrograms();
+ IJobRuntime getRemoteJob(String className);
+
ScheduledJob getScheduledJob(String template);
SchedulerService getScheduler();
boolean isScheduledExecutionDisabled();
+ boolean isWorker();
+
void keepAliveWorker(String remoteAddr);
void loadExecutors();
* Folyamat l�p�s v�grehajt� interface.
*/
public interface IJobStepExecutor {
+ static final String PROCESSING_LOCALLY = "Processing locally";
+ static final String PROCESSING_REMOTLY = "Processing remotly";
+ static final String WAIT_REMOTE_PROCESSOR = "Waiting for remote processor";
+
void changePriority(IJobRuntime runtime);
boolean containsRuntime(IJobRuntime runtime);
- void create(String name, int maxConcurrent) throws JobEngineException;
+ void create(String name, int maxConcurrent, boolean isRemote) throws JobEngineException;
int getMaxConcurrent();
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
+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;
import com.ibm.nosql.json.api.BasicDBObject;
import user.jobengine.server.scheduler.ScheduledJob;
import user.jobengine.server.scheduler.SchedulerService;
import user.jobengine.server.steps.IJobStep;
-import user.jobengine.zk.util.SessionUtil;
import user.tsm.client.TSMClient;
import user.tsm.client.TSMException;
while (!shutdown) {
try {
- IJobRuntime jobRuntime = runQueue.poll(SessionUtil.getMediaCubeConfig().getJobQueuePollInterval(), TimeUnit.MILLISECONDS);
+ IJobRuntime jobRuntime = runQueue.poll(10, TimeUnit.MILLISECONDS);
if (jobRuntime != null) {
while (jobRuntime.hasNextInstruction() && jobRuntime.isRunable()) {
ir = jobRuntime.getNextInstruction();
private List<IJobChangedListener> jobChangedListenerList = new CopyOnWriteArrayList<>();
private Map<String, LocalDate> remoteWorkers;
+ private String masterServerAddress = System.getProperty("jobengine.master.server", "false");
/**
* 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.
return programs;
}
+ @Override
+ public IJobRuntime getRemoteJob(String className) {
+ IJobRuntime result = null;
+ ResteasyClient client = new ResteasyClientBuilder().build();
+ ResteasyWebTarget target = client.target(masterServerAddress).path("/services/rest/cluster/getjob").queryParam("className", className);
+ Response response = null;
+ try {
+ response = target.request().get();
+ if (response.getEntity() != null) {
+
+ }
+ } catch (Exception e) {
+ logger.error(e.getMessage());
+ } finally {
+ logger.debug("Keep alive response: {}", response.getStatus());
+ if (response != null)
+ response.close();
+ }
+ return result;
+ }
+
@Override
public ScheduledJob getScheduledJob(String template) {
List<BasicDBObject> jobs = NoSQLUtils.asList(schedulerService.getScheduleJobs());
return isScheduledExecutionDisabled;
}
+ @Override
+ public boolean isWorker() {
+ return Boolean.parseBoolean(masterServerAddress);
+ }
+
private void jobCleanup(IJobRuntime jobRuntime) {
statusMachine.processAction(JobAction.FINISH, jobRuntime);
}
store.setFileFilter("*.xml");
String templateRoot = store.toString(true);
logger.info("Template root is: " + templateRoot);
+ File f = new File(templateRoot);
+ System.out.println(f.getAbsolutePath());
List<RemoteFile> files = store.getRemoteFiles();
for (RemoteFile file : files) {
if (submittedJobs.containsKey(id)) {
IJobRuntime jobRuntime = submittedJobs.remove(id);
fireJobChangedEvent(new JobChangedEvent(jobRuntime, SignalType.DELETE));
- logger.info("--- {} removed from VM", jobRuntime);
+ logger.debug("--- {} removed from VM", jobRuntime);
closeSessionLog(jobRuntime);
}
runtime.add();
addToRunQueue(runtime);
submittedJobs.put(runtime.getId(), runtime);
- logger.info("+++ {} added to VM ", runtime);
+ logger.debug("+++ {} added to VM ", runtime);
}
@Override
logger.error("Couldn't shutdown jobEngine", e);
}
}
-
}
IJobStep step = null;
while (true) {
try {
- jobRuntime = queue.poll(SessionUtil.getMediaCubeConfig().getJobQueuePollInterval(), TimeUnit.MILLISECONDS);
- if (jobRuntime == null && shutdown) {
- logger.trace("Shutting down");
- break;
+ if (jobEngine.isWorker()) {
+ jobRuntime = jobEngine.getRemoteJob(className);
+ jobRuntime.setDescription(PROCESSING_REMOTLY);
+ } else {
+ jobRuntime = queue.poll(SessionUtil.getMediaCubeConfig().getJobQueuePollInterval(), TimeUnit.MILLISECONDS);
+ if (jobRuntime == null && shutdown) {
+ logger.trace("Shutting down");
+ break;
+ }
+ if (jobRuntime == null)
+ continue;
+ if (shutdown) {
+ logger.trace("{} skipping by shutdown", jobRuntime);
+ jobEngine.sendMessage(new JobStepSkippedMessage(jobRuntime.getId()));
+ continue;
+ }
+
+ long submitted = jobRuntime.getSubmitted().getTime();
+ long current = System.currentTimeMillis();
+ boolean timeout = current - submitted > 3000;
+ if (isRemote) {
+ if (timeout) {
+ logger.info("Remote JobStep timed out, processing locally.");
+ } else {
+ //logger.info("JobStep is remote, waiting for remote processor");
+ if (!WAIT_REMOTE_PROCESSOR.equals(jobRuntime.getDescription()))
+ jobRuntime.setDescription(WAIT_REMOTE_PROCESSOR);
+ queue.put(jobRuntime);
+ //skip local processor
+ continue;
+ }
+ }
+ jobRuntime.setDescription(PROCESSING_LOCALLY);
}
+
if (jobRuntime == null)
continue;
- if (shutdown) {
- logger.trace("{} skipping by shutdown", jobRuntime);
- jobEngine.sendMessage(new JobStepSkippedMessage(jobRuntime.getId()));
- continue;
- }
+
+ //processing locally
Object[] inputs = jobEngine.getInputsFromStack(jobRuntime);
Object[] outputs = null;
jobRuntime.setStatus(JobStatus.EXECUTING);
step = createStepObject();
if (step == null)
throw new Exception("Step object is null");
- logger.info("{} executing", jobRuntime);
+ logger.debug("{} executing", jobRuntime);
jobRuntime.IncrementPriority();
-
- // logger.info("Executor thread name is {} id is {}", Thread.currentThread().getName(),
- // Thread.currentThread().getId());
-
outputs = step.run(jobEngine, jobRuntime, inputs);
jobEngine.sendMessage(new JobStepCompletedMessage(jobRuntime.getId(), outputs));
} catch (Throwable e) {
private Class<IJobStep> stepClass;
private int maxConcurrent;
private String className;
+ private boolean isRemote;
public JobStepExecutor() {
}
public JobStepExecutor(Class<IJobStep> clazz, int maxConcurrent) throws Exception {
- this(clazz.getName(), maxConcurrent);
+ this(clazz.getName(), maxConcurrent, false);
}
public JobStepExecutor(String className, int maxConcurrent) throws Exception {
- create(className, maxConcurrent);
+ this(className, maxConcurrent, false);
+ }
+
+ public JobStepExecutor(String className, int maxConcurrent, boolean isRemote) throws Exception {
+ create(className, maxConcurrent, false);
}
@Override
@Override
@SuppressWarnings("unchecked")
- public void create(String className, int maxConcurrent) throws JobEngineException {
+ public void create(String className, int maxConcurrent, boolean isRemote) throws JobEngineException {
this.className = className;
+ this.isRemote = isRemote;
logger = LogManager.getLogger(getClass().getSimpleName() + ":" + className);
logger.debug("Creating executor {}, instances {}", className, maxConcurrent);
if (StringUtils.isEmpty(className))
throw new JobEngineException("Step class name can't be null.");
- // throw new
- // JobEngineException("Illegal concurrent instance count. Must be greater then 0.");
- //DynamicClassLoader loader = new DynamicClassLoader(getClass().getClassLoader());
+
try {
- //ClassLoader parentClassLoader = getParentClassLoader();
URLClassLoader loader = URLClassLoader.newInstance(DynamicClassLocator.makeURLs(), getClass().getClassLoader());
stepClass = (Class<IJobStep>) loader.loadClass(className);
} catch (ClassNotFoundException e) {
logger.catching(e);
throw new JobEngineException("System can't load JobStep implementation: " + className);
}
- // priorityQueue = new PriorityBlockingQueue<IJobRuntime>();
- //queue = new LinkedBlockingQueue<IJobRuntime>();
+
queue = new PriorityBlockingQueue<IJobRuntime>();
this.maxConcurrent = maxConcurrent;
if (maxConcurrent > 0) {
StatusMachineAction machineAction = new StatusMachineAction(jobAction, jobRuntime.getStatus());\r
if (actions.containsKey(machineAction)) {\r
IJobStatusAction action = actions.get(machineAction);\r
- logger.info("{} status change {} -> {}", jobRuntime, jobRuntime.getStatus(), jobAction);\r
+ logger.debug("{} status change {} -> {}", jobRuntime, jobRuntime.getStatus(), jobAction);\r
action.processAction(jobEngine, jobRuntime);\r
}\r
\r
*/\r
private void loadStartupJobsFromConfig() throws Exception {\r
String configPath = System.getProperty("jobengine.jobscheduling.config");\r
- if (configPath == null || "".equals(configPath))\r
- throw new Exception("Missing system property: 'jobengine.jobscheduling.config'");\r
+ if (configPath == null || "".equals(configPath)) {\r
+ logger.error("Missing system property: 'jobengine.jobscheduling.config'");\r
+ return;\r
+ }\r
File schedulingConfigFile = new File(configPath);\r
if (schedulingConfigFile.exists()) {\r
String jsonConfig = new String(Files.readAllBytes(Paths.get(schedulingConfigFile.getAbsolutePath())));\r
private Object[] executeMethod(Method method, Object[] extendedInputs) throws Exception {\r
Object[] result;\r
try {\r
- logger.info("Executing {}", method);\r
+ logger.debug("Executing {}", method);\r
result = (Object[]) method.invoke(this, extendedInputs);\r
} catch (Exception e) {\r
if (e instanceof IllegalArgumentException) {\r
\r
/***\r
* A runtime nevevel egyezo rendszerszintu gyerek. A szulo rendszer szintu MEDIACUBE cimkes.\r
- * \r
+ *\r
* @return\r
*/\r
protected Marker getMarker() {\r
\r
/***\r
* JobRuntime session marker\r
- * \r
+ *\r
* @return\r
*/\r
protected MediaCubeMarker getSessionMarker() {\r
//Kornyezeti valtozok betoltese
Properties properties = new Properties();
URL srcLocation = JobengineIT.class.getProtectionDomain().getCodeSource().getLocation();
- URL location = new URL(srcLocation, "../../-configuration/mediacube-dev.properties");
+ URL location = new URL(srcLocation, "../../-configuration/mediacube-dev-user.properties");
properties.load(new FileInputStream(location.toURI().getPath().toString()));
System.getProperties().putAll(properties);
}
/***
- * Teszt folyamat futtatasa
- * @throws Exception
- */
- @Test
- public void fake() throws Exception {
- final ThreadSynchronizer sync = new ThreadSynchronizer();
- final IJobEngine jobEngine = new JobEngine();
- jobEngine.bindItemManagerService(manager);
- Map<String, Object> parameters = new HashMap<>();
- //parameters.put("itemID", 100);
- IJobRuntime runtime = jobEngine.submit("fake.xml", "Fake", parameters);
- runtime.addEventListener(new IJobStatusChangedListener() {
- @Override
- public void statusChanged(JobStatusChangedEvent event) {
- if (JobStatus.FINISHED.equals(event.getStatus()))
- sync.suspend();
-
- }
- });
- sync.waitSuspend();
- sync.resume();
- jobEngine.shutdown();
- }
-
- /***
- * NEXIO adatok szinkronizalo folyamat futtatasa
+ * Archivalo folyamat futtatasa
+ *
* @throws Exception
*/
@Test
- public void sync_nexio() throws Exception {
+ public void archive_media() throws Exception {
final ThreadSynchronizer sync = new ThreadSynchronizer();
IJobEngine jobEngine = new JobEngine();
- jobEngine.bindItemManagerService(manager);
+ jobEngine.setItemManager(manager);
+ jobEngine.loadPrograms();
+ jobEngine.loadExecutors();
+ jobEngine.startup();
Map<String, Object> parameters = new HashMap<>();
- parameters.put("itemID", 100);
- IJobRuntime runtime = jobEngine.submit("sync-nexio.xml", "Synchronize NEXIO", parameters);
+ parameters.put("mediaFolder", "/tmp");
+ IJobRuntime runtime = jobEngine.submit("archivemedia.xml", "Fake", parameters);
runtime.addEventListener(new IJobStatusChangedListener() {
@Override
public void statusChanged(JobStatusChangedEvent event) {
}
/***
- * Ket teszt folyamat futtatasa egyszerre
+ * Teszt folyamat futtatasa
+ *
* @throws Exception
*/
- @Test(expected = JobEngineException.class)
- public void fake_overlap() throws Exception {
+ @Test
+ public void fake() throws Exception {
final ThreadSynchronizer sync = new ThreadSynchronizer();
- IJobEngine jobEngine = new JobEngine();
+ final IJobEngine jobEngine = new JobEngine();
+ jobEngine.startup();
jobEngine.bindItemManagerService(manager);
Map<String, Object> parameters = new HashMap<>();
- parameters.put("itemID", 100);
+ //parameters.put("itemID", 100);
IJobRuntime runtime = jobEngine.submit("fake.xml", "Fake", parameters);
- jobEngine.submit("fake.xml", "Fake", parameters);
runtime.addEventListener(new IJobStatusChangedListener() {
@Override
public void statusChanged(JobStatusChangedEvent event) {
/***
* Ket teszt folyamat futtatasa egymas utan
+ *
* @throws Exception
*/
@Test
}
/***
- * Archivalo folyamat futtatasa
+ * Ket teszt folyamat futtatasa egyszerre
+ *
+ * @throws Exception
+ */
+ @Test(expected = JobEngineException.class)
+ public void fake_overlap() throws Exception {
+ final ThreadSynchronizer sync = new ThreadSynchronizer();
+ IJobEngine jobEngine = new JobEngine();
+ jobEngine.bindItemManagerService(manager);
+ Map<String, Object> parameters = new HashMap<>();
+ parameters.put("itemID", 100);
+ IJobRuntime runtime = jobEngine.submit("fake.xml", "Fake", parameters);
+ jobEngine.submit("fake.xml", "Fake", parameters);
+ runtime.addEventListener(new IJobStatusChangedListener() {
+ @Override
+ public void statusChanged(JobStatusChangedEvent event) {
+ if (JobStatus.FINISHED.equals(event.getStatus()))
+ sync.suspend();
+
+ }
+ });
+ sync.waitSuspend();
+ sync.resume();
+ jobEngine.shutdown();
+ }
+
+ /***
+ * NEXIO adatok szinkronizalo folyamat futtatasa
+ *
* @throws Exception
*/
@Test
- public void archive_media() throws Exception {
+ public void sync_nexio() throws Exception {
final ThreadSynchronizer sync = new ThreadSynchronizer();
IJobEngine jobEngine = new JobEngine();
- jobEngine.setItemManager(manager);
- jobEngine.loadPrograms();
- jobEngine.loadExecutors();
- jobEngine.startup();
+ jobEngine.bindItemManagerService(manager);
Map<String, Object> parameters = new HashMap<>();
- parameters.put("mediaFolder", "/tmp");
- IJobRuntime runtime = jobEngine.submit("archivemedia.xml", "Fake", parameters);
+ parameters.put("itemID", 100);
+ IJobRuntime runtime = jobEngine.submit("sync-nexio.xml", "Synchronize NEXIO", parameters);
runtime.addEventListener(new IJobStatusChangedListener() {
@Override
public void statusChanged(JobStatusChangedEvent event) {
// program.addInstruction(new AssignVariableInstruction());
}
+ public void sendReply(JobStatusChangedEvent event) {
+ if (event.getStatus() == JobStatus.WAIT_USERMESSAGE) {
+ IJobRuntime jobRuntime = (IJobRuntime) event.getSource();
+ UserReplyMessage message = new UserReplyMessage(jobRuntime.getId());
+ message.setReply(userReply);
+ jobEngine.sendMessage(message);
+ }
+ }
+
@Before
public void setup() throws Exception {
jobEngine = new JobEngine() {
synchronizer.resume();
jobEngine.shutdown();
}
-
- public void sendReply(JobStatusChangedEvent event) {
- if (event.getStatus() == JobStatus.WAIT_USERMESSAGE) {
- IJobRuntime jobRuntime = (IJobRuntime) event.getSource();
- UserReplyMessage message = new UserReplyMessage(jobRuntime.getId());
- message.setReply(userReply);
- jobEngine.sendMessage(message);
- }
- }
}
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
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
+ logger.debug("Created");\r
}\r
\r
@GET\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
+ logger.debug("Keepalive {}, {}, {}", request.getRemoteAddr(), request.getRemoteHost(), request.getRemotePort());\r
\r
jobEngine.keepAliveWorker(request.getRemoteAddr());\r
result = Response.ok().build();\r