You are viewing an old version of this page. View the current version.
Compare with Current
View Page History
« Previous
Version 11
Next »
Introduction
JS7 offers a number of JS7 - Job Classes including JS7 - Shell Jobs, JS7 - JavaScript Jobs and Java Jobs.
- Java Jobs are operated in the Java Virtual Machine of the JS7 Agent
- Java Jobs are loaded on start-up of the JS7 Agent, this means there is zero latency when starting Java Jobs.
JS7 offers the JS7 - Job API to Java Jobs that serves the purpose of
- accessing arguments available to the job from various sources such as JS7 - Order Variables, job and node arguments, JS7 - Job Resources,
- allowing to specify the outcome of a job including return values that are passed to subsequent jobs from order variables.
Java jobs are available starting from the following releases:
FEATURE AVAILABILITY STARTING FROM RELEASE 2.5.4
FEATURE AVAILABILITY STARTING FROM RELEASE 2.6.1
Implementation
Implementing a basic Job
A Java Job extends the class com.sos.js7.job.Job
like this:
import com.sos.js7.job.Job;
import com.sos.js7.job.JobArguments;
import com.sos.js7.job.OrderProcessStep;
public class HelloWorld extends Job<JobArguments> {
@Override
public void processOrder(OrderProcessStep<JobArguments> step) throws Exception {
step.getLogger().info("Hello World!");
}
}
Explanation:
- The extension of the class
com.sos.js7.job.Job
is required. - The
processOrder()
method is required to be implemented by the job.
Accessing Arguments
A Java Job can access arguments from a number of sources, see JS7 - Job API.
Example: Reading specific Arguments
import java.util.List;
import com.sos.js7.job.Job;
import com.sos.js7.job.JobArgument;
import com.sos.js7.job.OrderProcessStep;
import com.sos.js7.job.OrderProcessStepOutcome;
public class JobWithParams extends Job<MyJobArguments> {
@Override
public void processOrder(OrderProcessStep<MyJobArguments> step) throws Exception {
// reading all arguments with "getAllArgumentsAsNameValueMap"
step.getAllArgumentsAsNameValueMap().forEach((name, value) -> {
step.getLogger().info("argument: " + name + "=" + value.toString());
});
// reading all arguments with "getAllArguments"
step.getAllArguments().forEach((name, jobArgument) -> {
step.getLogger().info("argument: " + name + "=" + jobArgument.getValue().toString());
});
MyJobArguments myArgs = step.getDeclaredArguments();
// reading job-specific argument: myString
JobArgument<String> myString = myArgs.getMyString();
step.getLogger().info(myString.getName() + "=" + myString.getValue());
// reading job-specific argument: myBool
JobArgument<Boolean> myBool = myArgs.getMyBool();
step.getLogger().info(myBool.getName() + "=" + myBool.getValue());
// reading job-specific argument: myList
JobArgument<List<String>> myList = myArgs.getMyList();
step.getLogger().info(myList.getName() + "=" + myList.getValue().toString());
// return values
OrderProcessStepOutcome outcome = step.getOutcome();
outcome.putVariable(myString.getName(), "hello world");
outcome.putVariable("myInteger", 42);
}
}
Explanation:
- The
getAllArgumentsAsNameValueMap()
method provides a map of all argument values. - The
getAllArguments()
method provides a map of argument objects. - The OrderProcessStep object is here typed by
MyJobArguments
that is a class with job-specific declared arguments. - For further methods to access arguments see JS7 - Job API.
Creating a Maven project in the development environment
The classes com.sos.js7.job.Job, com.sos.js7.job.JobArguments etc. are not available in a public Maven repository, so a local repository must be created in the Maven project.
- The directory
sos
has to be created
- The following .jar files have to be copied from a JS7 Agent installation
./lib/sos
directory to the sos
directory of the Maven project. The example makes use of release 2.6.1, users should check for a current release.
com.sos-berlin.js7.engine.js7-base-2.6.1.jar
com.sos-berlin.js7.engine.js7-data-for-java-2.6.1.jar
com.sos-berlin.js7.engine.js7-launcher-for-java-2.6.1.jar
sos-commons-exception-2.6.1.jar
sos-commons-util-2.6.1.jar
sos-js7-job-2.6.1.jar
The following pom.xml
file can be used as a base in the Maven project.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sos-berlin</groupId>
<artifactId>my-js7-jobs</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<!-- release version of js7 jars -->
<sos.js7.version>2.6.1</sos.js7.version>
<!-- 3rd party versions -->
<scala.library.version>2.13.11</scala.library.version>
<slf4j.version>1.7.36</slf4j.version>
<io.vavr.version>0.10.4</io.vavr.version>
<!-- groupId and artifactIds of js7 jars -->
<sos.js7.groupId>com.sos-berlin</sos.js7.groupId>
<sos.js7.job.artifactId>sos-js7-job</sos.js7.job.artifactId>
<sos.js7.commons.util.artifactId>sos-commons-util</sos.js7.commons.util.artifactId>
<sos.js7.commons.exception.artifactId>sos-commons-exception</sos.js7.commons.exception.artifactId>
<sos.js7.engine.groupId>com.sos-berlin.js7.engine</sos.js7.engine.groupId>
<sos.js7.launcher.artifactId>js7-launcher-for-java</sos.js7.launcher.artifactId>
<sos.js7.data.artifactId>js7-data-for-java</sos.js7.data.artifactId>
<sos.js7.base.artifactId>js7-base</sos.js7.base.artifactId>
<!-- directories with js7 jars to install the local project repository -->
<sos.js7.external.srcdir>${project.basedir}/sos</sos.js7.external.srcdir>
<!-- directory of local project repository -->
</properties>
<repositories>
<!-- public repository for 3rd party jars -->
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo1.maven.org/maven2</url>
<snapshots>
<enabled>false</enabled>
<updatePolicy>never</updatePolicy>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>${sos.js7.engine.groupId}</groupId>
<artifactId>${sos.js7.launcher.artifactId}</artifactId>
<version>${sos.js7.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>${sos.js7.engine.groupId}</groupId>
<artifactId>${sos.js7.data.artifactId}</artifactId>
<version>${sos.js7.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>${sos.js7.engine.groupId}</groupId>
<artifactId>${sos.js7.base.artifactId}</artifactId>
<version>${sos.js7.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>${sos.js7.groupId}</groupId>
<artifactId>${sos.js7.job.artifactId}</artifactId>
<version>${sos.js7.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>${sos.js7.groupId}</groupId>
<artifactId>${sos.js7.commons.util.artifactId}</artifactId>
<version>${sos.js7.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>${sos.js7.groupId}</groupId>
<artifactId>${sos.js7.commons.exception.artifactId}</artifactId>
<version>${sos.js7.version}</version>
<scope>provided</scope>
</dependency>
<!-- 3rd Party -->
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.library.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr</artifactId>
<version>${io.vavr.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>create-local-repo</id>
<build>
<plugins>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
<executions>
<execution>
<id>install-${sos.js7.launcher.artifactId}</id>
<goals>
<goal>install-file</goal>
</goals>
<phase>initialize</phase>
<configuration>
<file>${sos.js7.external.srcdir}/${sos.js7.engine.groupId}.${sos.js7.launcher.artifactId}-${sos.js7.version}.jar</file>
<groupId>${sos.js7.engine.groupId}</groupId>
<artifactId>${sos.js7.launcher.artifactId}</artifactId>
<version>${sos.js7.version}</version>
<packaging>jar</packaging>
<createChecksum>true</createChecksum>
</configuration>
</execution>
<execution>
<id>install-${sos.js7.data.artifactId}</id>
<goals>
<goal>install-file</goal>
</goals>
<phase>initialize</phase>
<configuration>
<file>${sos.js7.external.srcdir}/${sos.js7.engine.groupId}.${sos.js7.data.artifactId}-${sos.js7.version}.jar</file>
<groupId>${sos.js7.engine.groupId}</groupId>
<artifactId>${sos.js7.data.artifactId}</artifactId>
<version>${sos.js7.version}</version>
<packaging>jar</packaging>
<createChecksum>true</createChecksum>
</configuration>
</execution>
<execution>
<id>install-${sos.js7.base.artifactId}</id>
<goals>
<goal>install-file</goal>
</goals>
<phase>initialize</phase>
<configuration>
<file>${sos.js7.external.srcdir}/${sos.js7.engine.groupId}.${sos.js7.base.artifactId}-${sos.js7.version}.jar</file>
<groupId>${sos.js7.engine.groupId}</groupId>
<artifactId>${sos.js7.base.artifactId}</artifactId>
<version>${sos.js7.version}</version>
<packaging>jar</packaging>
<createChecksum>true</createChecksum>
</configuration>
</execution>
<execution>
<id>install-${sos.js7.job.artifactId}</id>
<goals>
<goal>install-file</goal>
</goals>
<phase>initialize</phase>
<configuration>
<file>${sos.js7.external.srcdir}/${sos.js7.job.artifactId}-${sos.js7.version}.jar</file>
<groupId>${sos.js7.groupId}</groupId>
<artifactId>${sos.js7.job.artifactId}</artifactId>
<version>${sos.js7.version}</version>
<packaging>jar</packaging>
<createChecksum>true</createChecksum>
</configuration>
</execution>
<execution>
<id>install-${sos.js7.commons.util.artifactId}</id>
<goals>
<goal>install-file</goal>
</goals>
<phase>initialize</phase>
<configuration>
<file>${sos.js7.external.srcdir}/${sos.js7.commons.util.artifactId}-${sos.js7.version}.jar</file>
<groupId>${sos.js7.groupId}</groupId>
<artifactId>${sos.js7.commons.util.artifactId}</artifactId>
<version>${sos.js7.version}</version>
<packaging>jar</packaging>
<createChecksum>true</createChecksum>
</configuration>
</execution>
<execution>
<id>install-${sos.js7.commons.exception.artifactId}</id>
<goals>
<goal>install-file</goal>
</goals>
<phase>initialize</phase>
<configuration>
<file>${sos.js7.external.srcdir}/${sos.js7.commons.exception.artifactId}-${sos.js7.version}.jar</file>
<groupId>${sos.js7.groupId}</groupId>
<artifactId>${sos.js7.commons.exception.artifactId}</artifactId>
<version>${sos.js7.version}</version>
<packaging>jar</packaging>
<createChecksum>true</createChecksum>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<optimize>true</optimize>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
groupId
, artifactId
and version
should be adjusted.The pom.xml
file contains a profile create-local-repo
that must be executed once after copying the jar files. It updates the users local ./.m2
repository with the jars from the sos folder.
> mvn initialize -Pcreate-local-repo -U
Further Resources
Features
Articles