Releases of Scripting Engines
The JobScheduler supports different scripting engines:
- SpiderMonkey (http://www.mozilla.org/js/) which is included in all 32 Bit JobScheduler releases
- Rhino (http://www.mozilla.org/rhino/) which is part of the Java Run Time Environment (JRE) for versions up to JRE 1.7
- Nashorn (https://blogs.oracle.com/nashorn/) which is part of the Java Run Time Environment for versions starting from JRE 1.8
The scripting engines are available as follows:
- The SpiderMonkey engine is only available for 32 bit JobScheduler. It is selected by
<script language="javascript">
and<script language"spidermonkey">
- The Rhino engine is available for 32 bit and 64 bit. It is selected by
<script language="javax.script:rhino">
,<script language="javax.script:JavaScript">
and<script language="javax.script:ECMAscript"/>
for a JRE up to 1.7 - The Nashorn engine is available for 32 bit and 64 bit. It is selected by
<script language="javax.script:JavaScript">
and<script language="javax.script:ECMAscript"/>
for a JRE starting from 1.8 - The "Rhino (with Beans)" / "Nashorn (with Beans)" engine is available for 32 bit and 64 bit. It is selected by
<script language"java:javascript">
Language | Used Engine on 32 Bit JobScheduler | Used Engine on 64 Bit JobScheduler | Available in |
---|---|---|---|
spidermonkey | SpiderMonkey | — | All releases, only 32 bit |
javascript | SpiderMonkey | — | All releases, only 32 bit |
javax.script:rhino | Rhino (up to JRE 1.7 only) | Rhino (up to JRE 1.7 only) | Starting from 1.5 |
javax.script:JavaScript | up to JRE 1.7: Rhino | up to JRE 1.7: Rhino starting from JRE 1.8: Nashorn | Starting from 1.5 |
javax.script:ECMAscript | up to JRE 1.7: Rhino | up to JRE 1.7: Rhino starting from JRE 1.8: Nashorn | Starting from 1.5 |
java:javascript | JRE 1.7: Rhino (with Java beans layer) | JRE 1.7: Rhino (with Java beans layer) | Starting from 1.5 |
If you want to migrate a Javascript for SpiderMonkey to a 64 bit JobScheduler then in most cases you just have to modify the language attribute to <script language="java:javascript">
. This works within limits.
Migration Strategies
Migrating JavaScript from Spidermonkey to Rhino
We recommend to change the JavaScript to the Rhino syntax. Then it works properly with 32 bit and 64 bit JobScheduler.
Rhino doesn't have properties. You have to use "setter" and "getter" methods instead.
Example:
Spidermonkeyorder.state = String // Set the order state using the property String = order.state // Get the order state using the property
Rhinoorder.set_state( String ) // Set the order state using the setter method String = order.state() // Get the order state using the getter method
- Please refer to the API documentation for more details.
Migrating JavaScript from Rhino to Nashorn
- Both JavaScript engines are compatible in many aspects.
- see How to change over to Java 1.8 - the new Nashorn JavaScript engine
Syntax Examples
Examples for syntactic differences
- SpiderMonkey
// log job name and tsk id spooler_log.info( spooler_job.name + " is running with task id " + spooler_task.id );
// add an order var order = spooler.create_order(); order.title = "this is an order"; order.id = "my order id"; spooler.job_chain( "/path/to/job chain/job chain name" ).add_order( order );
// set a job state text spooler_job.state_text = "OK!";
// read and write parameter from the current order var orderParams = spooler_task.order.params; var myParam = orderParams.value("myParam"); orderParams.value("myParam") = "new value";
- Rhino
// log job name and tsk id spooler_log.info(spooler_job.name() + " is running with task id " + spooler_task.id() );
// add an order var order = spooler.create_order(); order.set_title("this is an order"); order.set_id("my order id"); spooler.job_chain( "/path/to/job chain/job chain name" ).add_order( order );
// set a job state text spooler_job.set_state_text("OK!");
// read and write parameter from the current order var orderParams = spooler_task.order().params(); var myParam = orderParams.value("myParam"); orderParams.set_value("myParam", "new value");
Examples for differences when using reserved words
- Using the Rhino engine there are no JavaScript reserved words allowed. Therefore, the following code can't be executed with the "Rhino with Beans" engine:
var file = new java.io.File(files[i]); file.delete();
- Since
delete
is a reserved word in JavaScript the code above results in the following error:
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: missing name after . operator (<Unknown source>#26) in <Unknown source> at line number 26 at com.sun.script.javascript.RhinoScriptEngine.eval(Unknown Source) at com.sun.script.javascript.RhinoScriptEngine.eval(Unknown Source) at javax.script.AbstractScriptEngine.eval(Unknown Source) at com.sos.scheduler.scripting.Module.call(Module.java:76) at com.sos.scheduler.scripting.Module.callBoolean(Module.java:85)
- Compatible Solution:
var file = Packages.java.io.File(files[i]); file["delete"](); // because delete is reserved in javascript
Getting Java Objects
The following ECMA script construction can be used to instantiate Java objects using new Packages.myPacket.myClass();
function myFunction(){ var params; var debugParameter = function(paramName) { try{ spooler_log.debug1(".. mail parameter ["+paramName+"]: "+params.value(paramName)); } catch (e){} //No error handling } try{ var myVariable = spooler_log.mail(); this.myObject = new Packages.myPacket.myClass(); .... } catch(e){ throw "Error initializing myObject: "+e; } .... }
Note that import myPacket.myClass();
will cause an initialization error message when used in ECMA script.
For example, the following error would be typical for import sos.net.SOSMail;
[ERROR] COM-80020009 Ausnahmefehler aufgetreten. [step] [] [Z-JAVA-105 Java exception java.lang.RuntimeException: javax.script.ScriptException: sun.org.mozilla.javascript.internal.JavaScriptException: Error initializing sosMail: TypeError: Cannot find function set_queue_dir in object sos.net.SOSMail@2403f3b1. (<Unknown source>#39) in <Unknown source> at line number 39 - caused by - javax.script.ScriptException: sun.org.mozilla.javascript.internal.JavaScriptException: Error initializing sosMail: TypeError: Cannot find function set_queue_dir in object sos...], method=call
For more information, see:
- https://helpx.adobe.com/experience-manager/kb/JavaFromEsp.html
- Importing Java Classes to ECMAScript with the import Statement
See also
- What Java scripting languages are supported?
- How to change over to Java 1.8 - the new Nashorn JavaScript engine