Scope
This document explains how to download the JobScheduler engine binaries from Maven Central, the structure of the binaries as well as how to setup a minimal JobScheduler with those binaries.
Prerequisites
In order to be able to download the binaries and integrate them in your application, you need to have Maven installed.
Maven
- You can find the Maven documentation here.
- SOS uses Maven 3.2.1. You can download the latest Release from here.
- Maven's
/bin
folder has to be added to the global variable "PATH
" in order to take effect. - No further configuration is required for Maven in order to compile. If further configuration is wanted, for example to receive certain 3rd Party libraries from an official Maven2 repository, e.g. http://repo1.maven.org/maven2, then you have to configure the settings.xml file.
The binaries file
The structure of the Binaries
The jobscheduler.engine-1.9.6.jar
is a bundle jar with all binaries as well as the JobScheduler engine java library.
To integrate it in your own maven project or to download it via maven, add the following configuration to the pom.xml of your project.
<dependency>
<groupId>com.sos-berlin</groupId>
<artifactId>jobscheduler.engine</artifactId>
<version>1.9.6</version>
</dependency>
The structure of the jobscheduler.engine-1.9.6.jar
looks like this:
|-linux-x64
| |-bin
| | |---.version-engine
| | |---scheduler
| |-lib
| | |---libjobscheduler-engine.so
|-linux-x86
| |-bin
| | |---.version-engine
| | |---scheduler
| |-lib
| | |---libjobscheduler-engine.so
|-windows-x64
| |-bin
| | |---.version-engine
| | |---jobscheduler-engine.dll
| | |---scheduler.exe
|-windows-x86
| |-bin
| | |---.version-engine
| | |---scheduler.exe
|---com.sos-berlin.jobscheduler.engine-1.9.6.jar
Setting up a JobScheduler with the binaries
Required configuration files
- sos.ini
- factory.ini
- scheduler.xml
Configuration
Step 1
To get a minimal JobScheduler up and running, create a folder, e.g. "myJobScheduler" and copy the binaries according to your operating system as well as the java library to this folder.
Step 2
Add the 3rd Party libraries which are configured in the jobscheduler.engine-1.9.6.pom to a folder as well as the database driver you use. You can copy the 3rd party libraries to a different folder as well, as long as you make sure to configure the path in the factory.ini.
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.186</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>javax.persistence</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.scalactic</groupId>
<artifactId>scalactic_2.11</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.11.6</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-reflect</artifactId>
<version>2.11.6</version>
</dependency>
<dependency>
<groupId>org.scala-lang.modules</groupId>
<artifactId>scala-xml_2.11</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
<version>1.4.01</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.joda</groupId>
<artifactId>joda-convert</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>8.1.16.v20140903</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>8.1.16.v20140903</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlets</artifactId>
<version>8.1.16.v20140903</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-xml</artifactId>
<version>8.1.16.v20140903</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-client</artifactId>
<version>8.1.16.v20140903</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>8.1.16.v20140903</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-websocket</artifactId>
<version>8.1.16.v20140903</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-guice</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.10</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.10</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.7.10</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-guava</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-scala_2.11</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>io.spray</groupId>
<artifactId>spray-json_2.11</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>io.spray</groupId>
<artifactId>spray-http_2.11</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>io.spray</groupId>
<artifactId>spray-client_2.11</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.typesafe</groupId>
<artifactId>config</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-actor_2.11</artifactId>
<version>2.3.9</version>
</dependency>
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-slf4j_2.11</artifactId>
<version>2.3.9</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.jvnet.mimepull</groupId>
<artifactId>mimepull</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
Step 3
Create a sos.ini file and copy your licence key to the file. The file should look like this:
[licence]
key1 = PUT_YOUR_KEY_HERE
Create a factory.ini file with the following configuration:
[spooler]
; enable job history, if set to True the scheduler keeps a job history in database tables
history = yes
; store job protocol for task history (yes|no|gzip, default: no)
history_with_log = gzip
; store job protocol for order history (yes|no|gzip, default: no)
order_history_with_log = gzip
; store protocol for scheduler history (yes|no|gzip, default: no)
history_archive = gzip
; database configuration examples for job history
; active configuration
db = jdbc -class=org.mariadb.jdbc.Driver jdbc:mysql://localhost:3306/scheduler -user=DB_USER -password=DB_USER_PASSWD
db_class = SOSMySQLConnection
; sample configuration for MySQL
;db = jdbc -class=com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/scheduler -user=DB_USER -password=DB_USER_PASSWD
;db_class = SOSMySQLConnection
; sample configuration for MySQL via mariaDB
;db = jdbc -class=org.mariadb.jdbc.Driver jdbc:mysql://localhost:3306/scheduler -user=DB_USER -password=DB_USER_PASSWD
;db_class = SOSMySQLConnection
; sample configuration for Oracle
;db = jdbc -class=oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@//localhost:1521/scheduler -user=DB_USER -password=DB_USER_PASSWD
;db_class = SOSOracleConnection
; sample configuration for Microsoft SQL Server
;db = jdbc -class=com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:sqlserver://localhost:1433;sendStringParametersAsUnicode=false;selectMethod=cursor;databaseName=scheduler -user=DB_USER -password=DB_USER_PASSWD
;db_class = SOSMSSQLConnection
; sample configuration for Microsoft SQL Server via jTDS
;db = jdbc -class=net.sourceforge.jtds.jdbc.Driver jdbc:jtds:sqlserver://localhost:1433;sendStringParametersAsUnicode=false;selectMethod=cursor;databaseName=scheduler -user=DB_USER -password=DB_USER_PASSWD
;db_class = SOSMSSQLConnection
; sample configuration for Postgres SQL
;db = jdbc -class=org.postgresql.Driver jdbc:postgresql://localhost:5432/scheduler -user=DB_USER -password=DB_USER_PASSWD
;db_class = SOSPgSQLConnection
; sample configuration for Firebird
;db = jdbc -class=org.firebirdsql.jdbc.FBDriver jdbc:firebirdsql://localhost:3050/scheduler -user=DB_USER -password=DB_USER_PASSWD
;db_class = SOSFbSQLConnection
; sample configuration for DB2
;db = jdbc -class=com.ibm.db2.jcc.DB2Driver jdbc:db2://localhost:50000/scheduler:driverType=2;retrieveMessagesFromServerOnGetMessage=true; -user=DB_USER -password=DB_USER_PASSWD
;db_class = SOSDB2Connection
; sample configuration for Sybase
;db = jdbc -class=com.sybase.jdbc3.jdbc.SybDriver jdbc:sybase:Tds:localhost:5000/scheduler -user=DB_USER -password=DB_USER_PASSWD
;db_class = SOSSybaseConnection
; sample configuration for Sybase via jTDS
;db = jdbc -class=net.sourceforge.jtds.jdbc.Driver jdbc:jtds:sybase://localhost:5000/scheduler -user=DB_USER -password=DB_USER_PASSWD
;db_class = SOSSybaseConnection
; log level (info|debug1|...|debug9, default: info)
log_level = info
; log directory
log_dir = logs
; log filename and log categories (see http://www.sos-berlin.com/doc/en/scheduler.doc/factory_ini_spooler.xml#entry_log)
log = PATH/TO/YOUR/logs/scheduler.log
[java]
class_path = PATH/TO/YOUR/3rdPartyLibraries/*.jar;
; put your Java VM parameters here
options = -Dlog4j.configuration="file:///PATH/TO/YOUR/log4j.properties"
; enable detailed Java debug messages
debug = no
Create a scheduler.xml and configure the port your scheduler should run with:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<spooler>
<config port="4444">
<params>
<param name="scheduler.order.keep_order_content_on_reschedule" value="false"/>
</params>
<security ignore_unknown_hosts="yes">
<allowed_host host="localhost" level="all"/>
</security>
<plugins>
<plugin java_class="com.sos.scheduler.engine.plugins.webservice.WebServicePlugin"/>
<plugin java_class="com.sos.scheduler.engine.plugins.nodeorder.NodeOrderPlugin"/>
</plugins>
</config>
</spooler>
At last, create a start script like this:
@echo
set exepath=%~dp0
scheduler.exe -sos.ini="%exepath%sos.ini" -config="%exepath%scheduler.xml" -ini="%exepath%factory.ini"
Additional configuration
log4j.rootCategory=info, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.logger.org.hibernate=fatal
log4j.logger.JobScheduler=fatal
log4j.logger.com.sos.scheduler.engine=info
# see http://www.sos-berlin.com/doc/en/scheduler.doc/api/Log-javax.script.xml
log4j.logger.com.sos.scheduler.engine.jobapi.scripting=debug, scheduler
log4j.appender.scheduler=org.apache.log4j.ConsoleAppender
log4j.appender.scheduler.layout=org.apache.log4j.PatternLayout
log4j.appender.scheduler.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
Now your folder should contain at least these files (windows-x64-example, other platforms differ):
- factory.ini
- jobscheduler-engine.dll
- log4j.properties(optional)
- scheduler.exe
- scheduler.xml
- sos.ini
- start.cmd
Testing the scheduler
Create a folder named "live" in your working directory (your folder). Create a simple hello-world-job in the live-folder.
<?xml version="1.0" encoding="ISO-8859-1"?>
<job >
<script language="shell">
<![CDATA[echo Hello World!]]>
</script>
<run_time once="yes"/>
</job>
Open a console in your working directory and start the scheduler with the start.cmd start script.
If you have configured logging (log4j.properties and path to the properties file in factory.ini) you should see a job and a task log for the hello-world-job, which should look like this:
2015-10-07 14:58:45.515+0200 [info] SCHEDULER-918 state=starting (at=never)
2015-10-07 14:58:45.516+0200 [info] SCHEDULER-987 Starting process: "C:\Users\YOUR_USERNAME\AppData\Local\Temp\\sos5051B.cmd"
2015-10-07 14:58:45.526+0200 [info]
2015-10-07 14:58:45.526+0200 [info] PATH_TO_YOUR_FOLDER>echo Hello World!
2015-10-07 14:58:45.526+0200 [info] Hello World!
2015-10-07 14:58:45.527+0200 [info] SCHEDULER-915 Process event
2015-10-07 14:58:45.556+0200 [info] SCHEDULER-918 state=closed
2015-10-07 14:58:45.556+0200 [info] SCHEDULER-962 Protocol ends in logs/task.HalloWorldExample.log
2015-10-07 14:58:45.507+0200 [info] SCHEDULER-893 Job is 'active' now
2015-10-07 14:58:45.512+0200 [info] SCHEDULER-930 Task 6114864 started - cause: period_once
2015-10-07 14:59:45.716+0200 [info] SCHEDULER-931 state=stopped
2015-10-07 14:59:45.717+0200 [info] SCHEDULER-962 Protocol ends in logs/job.HalloWorldExample.log