Skip to main content

Business rules scripting

Python 3

MVEL

Groovy

JavaScript

Starting with 5.9.0, JavaScript and Python execute on a native subprocess pool by default. Existing scripts that read from input, write to output, and use language built-ins keep working. output.put(...), output.get(...), and bracket assignment are preserved. To keep the previous GraalVM engine, set APPLICATION_SCRIPTENGINE_PROVIDER=graalvm on process-engine and integration-designer. See Script runtime change in the 5.1 → 5.9 migration guide for the full audit.
In version 4.7.2, we’ve deprecated the DMN (Decision Model and Notation) business rule actions. This change affects how business rules are configured on task/user task nodes in business processes.
Python 2.7 is no longer supported. Migrate Python scripts to Python 3 to take advantage of improved performance and modern language features.

Integration designer scripting


Input and output

Scripts in FlowX receive data through bound variables. The available variables depend on the context.

Available variables

instanceMetadata keys

instanceMetadata contains only instance identifiers:
The process definition name is not available in instanceMetadata or any other script variable. If a business rule needs the process name as data, set it explicitly — for example as a process parameter on the start node or in the start request — since the name is static per process definition.

Writing to output

Assign values to the output variable to persist data. Both assignment and .put() syntax work.

Reading from input

input is a deep copy of the process or workflow data. Changes to input are not persisted. Always write to output.

Accessing configuration parameters

Retrieve project-level configuration parameters through additionalData:
For security details and more examples, see Extracting additional data in business rules.

Common pitfalls

If your script runs without errors but output is {}:
  • Check your variable names. output must be spelled exactly, it’s case-sensitive
  • Check assignment syntax. In Python, use output["key"] = value (bracket notation), not output.key = value
  • Don’t reassign output. output = {"key": "value"} replaces the reference and won’t persist. Use output["key"] = "value" instead
  • Don’t use return. Scripts don’t need a return statement. Write directly to output.
Python scripts run in a sandboxed environment. Common modules like uuid, re, and other standard library imports are not available.
Some Python patterns behave differently in the GraalPy sandbox:
When accessing data returned by Java services (such as AI node output), values may be Java HashMaps rather than native JavaScript objects. Standard JS methods like Object.keys() and spread syntax may not work as expected.

Scripts in Integration Workflows

Script nodes in Integration Workflows use the same input and output variables as process business rules, but the data flow is different:
  • In a process business rule, output writes directly to the process instance data store.
  • In a workflow Script node, output becomes the input for the next node in the workflow. The data stays within the workflow until the workflow completes at an End node.
Only the End node output is mapped back to the calling process (via a Receive Message Task with a “From Workflow” data stream).
If your workflow Script node produces an empty output ({}), subsequent nodes in the workflow receive no data. To pass all input data through to the next node while adding or modifying fields, copy the input to output first:
The output.put("", input) call copies all keys from input into the root of output.
For details on mapping workflow output back to your process, see Workflow data models.

JavaScript

New in v4.7.1: JavaScript support has been upgraded from Nashorn (ECMAScript 5.1) to GraalJS (ECMAScript 15/2024), providing significantly improved performance and modern language features.
JavaScript in FlowX.AI is powered by GraalJS, which supports ECMAScript 15 (2024) standards. This provides modern JavaScript capabilities for your business rules and integrations.

What is GraalJS?

GraalJS is an ECMAScript compliant JavaScript implementation built on GraalVM. It supports the latest ECMAScript features and offers high performance through the GraalVM’s JIT compiler.

Properties

  • Supports ECMAScript 15 (2024) features including modern syntax and APIs
  • Provides consistent scripting across business rules and integration designer
  • Runs in a secure sandboxed environment

Limitations

JavaScript scripts run in a sandboxed environment. Here is a list of JavaScript features not available in the sandbox:
  • import.meta (ES2020)
  • top-level await (ES2022)
  • set operations (ES2024)
  • Array.fromAsync (ES2024)

GraalJS Documentation

ECMAScript 2024 Language Specification


Python 3

Python is a high-level, interpreted programming language known for its simplicity and readability. FlowX.AI uses Python 3.11.7 via GraalPy for executing Python scripts.

What is GraalPy?

GraalPy is an implementation of Python that runs on the GraalVM. It offers high compatibility with standard Python (CPython) while providing the ability to run within the Java ecosystem. GraalPy supports Python 3 and provides access to a large subset of the standard Python library.

Properties

  • Supports Python 3.11.7 with access to most common Python libraries
  • Runs up to 3x faster than Python 2.7 via Jython
  • Runs in a sandboxed environment for better security

Python Library Support

Python 3 support in FlowX comes with a subset of the standard Python library. Python runs in a sandboxed environment and the following modules are not available: “stringprep”, “sqlite3”, “plistlib”, “getpass”, “curses”, “curses.textpad”, “curses.ascii”, “curses.panel”, “xml.parsers.expat”, “xmlrpc.client”, “xmlrpc.server”, “turtle”, “tkinter”, “test.support”, “symtable”, “pyclbr”, “msvcrt”, “winreg”, “winsound”, “grp”, “termios”, “tty”, “pty”, “syslog”, “audioop”, “msilib”, “nis”, “ossaudiodev”, “smtpd”, “spwd”, “crypt”
Available modules might provide limited access to system resources due to the execution in a sandbox environment.

Python 3.11 Documentation

GraalPy Documentation

MVEL

MVEL is an expression language for Java-based applications. It provides a plethora of features and is suited for everything from the smallest property binding and extraction, to full-blown scripts.

MVEL Documentation

Maven repository: Mvel 2.5.2 Final


Groovy

Groovy is a multi-faceted language for the Java platform. The language can be used to combine Java modules, extend existing Java applications and write new applications We use and recommend Groovy 3.0.21 version, using groovy-jsr223 engine.
Groovy has multiple ways of integrating with Java, some of which provide richer options than available with JSR-223 (e.g. greater configurability and more security control). JSR-223 is recommended when you need to keep the choice of language used flexible and you don’t require integration mechanisms not supported by JSR-223.
JSR-223 (spec) is a standard scripting API for Java Virtual Machine (JVM) languages . The JVM languages provide varying levels of support for the JSR-223 API and interoperability with the Java runtime.

Groovy Language Documentation

[Java] Class GroovyScriptEngineImpl

groovy-jsr223


Academy courses

Exclusive Gateways course

Learn to configure conditions in JavaScript and DMN for gateway routing

Debug 101 course

Troubleshoot script execution errors, exceptions, and debugging patterns
Academy playground. Explore the Academy_ExclusiveGateways project for working examples of JavaScript and DMN conditions in gateway routing.
Last modified on July 15, 2026