Introduction
JS7 offers a number of JS7 - Job Types 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.- The method is parameterized by the
OrderProcessStep
object provided by the Job API. The
OrderProcessStep
object is used with itsgetLogger()
method to write output to the job's log.
- The method is parameterized by the
Accessing Arguments
A Java Job can access arguments from a number of sources, see JS7 - Job API.
The straightforward way how to read arguments is explained from the next chapter.
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.A class with job specific declared arguments extends
com.sos.js7.job.JobArguments
Example of a class of the job-specific declared argumentsimport java.util.List; import com.sos.js7.job.JobArgument; import com.sos.js7.job.JobArguments; public class MyJobArguments extends JobArguments { private JobArgument<String> myString = new JobArgument<String>("myString", false); private JobArgument<List<String>> myList = new JobArgument<>("myList", false); private JobArgument<Boolean> myBool = new JobArgument<>("test", false, true); public JobArgument<String> getMyString() { return myString; } public JobArgument<List<String>> getMyList() { return myList; } public JobArgument<Boolean> getMyBool() { return myBool; } }
- 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 directories
sos
andlib
must be created - The
lib
directory will be the local repository. - The following JAR files must be copied from an agent installation
./lib/sos
into thesos
directory of the Maven project (here at the example release 2.6.1).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
should be used as a base in the Maven project.pom.xml<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 --> <sos.js7.external.repodir>${project.basedir}/lib</sos.js7.external.repodir> </properties> <repositories> <!-- local project repository for js7 jars --> <repository> <id>js7-jars</id> <name>Local Repository with JS7 Jars</name> <url>file://${sos.js7.external.repodir}</url> </repository> <!-- 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> <localRepositoryPath>${sos.js7.external.repodir}</localRepositoryPath> <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> <localRepositoryPath>${sos.js7.external.repodir}</localRepositoryPath> <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> <localRepositoryPath>${sos.js7.external.repodir}</localRepositoryPath> <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> <localRepositoryPath>${sos.js7.external.repodir}</localRepositoryPath> <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> <localRepositoryPath>${sos.js7.external.repodir}</localRepositoryPath> <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> <localRepositoryPath>${sos.js7.external.repodir}</localRepositoryPath> <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
andversion
should be customized.This
pom.xml
contains a profilecreate-local-repo
that must be executed once after copying the jar files. It creates the local repository in thelib
directory> mvn initialize -Pcreate-local-repo -U
Further Resources
Features
Articles
Pages
Navigation