Flowable (V6) v8.0.0 Release Notes
Release Date: 2026-02-27 // 3 months ago-
💥 Breaking Changes
- ⬆️ Upgrade to Spring Framework 7 and Spring Boot 4 - Flowable 8 is now based on Spring Framework 7 and Spring Boot 4. There is no support for Spring Boot 3 anymore.
- ⬆️ Upgrade to Jackson 3 - Jackson 3 is now the default JSON library. Jackson 2 is still supported via a compatibility layer
- ✂ Remove JUnit 3 and JUnit 4 support - JUnit 3 and JUnit 4 testing support, deprecated in 7.2.0, has been removed. Use JUnit 5 (Jupiter) exclusively
🆕 New Features
- 👍 Lambda Expression support in expressions - Lambda expressions are now supported in expressions. The
planItemInstanceskeyword has been expanded to support filtering based on a predicate using lambda expressions - The method
stream()can be used to obtain ajava.util.stream.Streamfrom a collection. e.g.${customers.stream().filter(customer -> customer.type eq 'premium').toList()}to get a list of premium customers or${customers.stream().map(customer -> customer.name).toList()to get the names of all the customers. - The
planItemInstancesnow expose afilter(Predicate<DelegatePlanItemInstance> predicate)method that can be used to provide custom filter options. - Date variables with milliseconds - Date variables will now include the milliseconds when they are returned over REST. E.g., up to now a date variable with the value of
2020-05-04T09:25:45.583Zwould have been returned as2020-05-04T09:25:45Z. However, now it would be returned as2020-05-04T09:25:45.583Zwhich is still ISO 8601 compliant. - Date properties in UTC - Date properties e.g., Process Instance start time will be returned as an ISO 8601 in the UTC timezone. E.g., if the start time was returned as
2025-09-24T09:58:12.609+02:00now it is returned as2025-09-24T07:58:12.609Z. - 🚀 Access definition information in expressions during deployment - Expressions can now access some of the definition information in expressions resolved during deployment. e.g. in Start Timer expression
${variableContainer.definitionKey}to access the definition key Case and Process instance migration improvements :
- Support for updating more task properties when doing case and process instance migration
- Case and process instance migration validation is now available in the REST API
- Option to automatically create plan item instances for new plan items during case instance migration
End user tracking - Added
endUserIdfor historic process/case instances andstatefor historic process instancesCase and Process end interceptor - Added case and process end interceptor support
Business status events - Dispatch events when updating the business status of a case or process
Event Registry hookpoints - Added hookpoints to event registry for event payload types
Possibility to disable DMN history persistence - Added option to disable history persistence when executing DMN decisions
👌 Support Java Records in Expressions
🐎 Performance Improvements
- 👌 Improve Expression coercion performance
- Long String variables now store a cached value, avoiding repeated deserialization
- ⬇️ Reduce unnecessary
ObjectMapperinstance creation - reuse the one from engine configuration
🐛 Bug Fixes
- 🛠 Fix issue with multiple case reactivations with a parent case instance
- 🛠 Fix NPE when having two sentries, and one doesn't have an
ifPart - 🛠 Fix case / process instance ended invoked twice when undeploying deeply nested app
- 🛠 Fix issue with moving parallel multi-instance activities to a single activity
- 📜 Ensure that multiple character events for the same element are handled correctly in XML parsing
- 👻 Make sure that
BeanELResolverand DMN Expression resolution propagates the exception cause - 🔊 Avoid 'Invalid reference in diagram interchange definition' warning message in logs when plan items are part of a plan fragment
- 👷 Unlock exclusive jobs when unacquiring all jobs of a worker
- 👷 Unacquiring external worker job should unlock the exclusive scope if the external worker job is exclusive
- ➕ Address security concerns raised via GitHub issue
Jackson 3
Important: If you have scripts or expressions that call methods on a
JsonNode, you need to carefully check if these work with Jackson 3, as many method signatures have changed (see details below). If you are unsure, we recommend starting with Jackson 2 configured first (flowable.variable-json-mapper=jackson2), and then testing for an upgrade to Jackson 3 over time. We do recommend looking into upgrading to Jackson 3, since Jackson 2 will eventually stop receiving updates. See Jackson Releases for the latest support information.🔧 Jackson 3 is used for Flowable internal json manipulation. There is still support for Jackson 2 variables. With Spring Boot this can be enabled by setting
flowable.variable-json-mappertojackson2. By default, Jackson 3 is being used for variables. When configuring Flowable without Spring Boot then thevariableJsonMapperon the process, cmmn, and app engine configurations should be set to beorg.flowable.common.engine.impl.json.jackson2.Jackson2VariableJsonMapperand theorg.flowable.common.rest.variable.Jackson2JsonObjectRestVariableConvertershould be added to the appropriate rest response factories.Notable changes when using JSON in expressions / scripts:
- 📦 Packages have changed from
com.fasterxml.jackson.databindandcom.fasterxml.jackson.coretotools.jackson.databindandtools.jackson.core elements()no longer returnsIterator<JsonNode>and instead returnsCollection<JsonNode>values()no longer returnsIterator<JsonNode>and instead returnsCollection<JsonNode>Iterator<String> fieldNames()replaced byCollection<String> propertyNames()Iterator<Map.Entry<String, JsonNode>> fields()replaced bySet<Map.Entry<String, JsonNode>> properties()- 👍
JsonNode with(String)replaced byObjectNode withObject(String), and if not using a pointer then it is better to useObjectNode withProperty(String) TextNode textNode(String)replaced byStringNode stringNode(String)List<String> findValuesAsText(String)replaced byList<String> findValuesAsString(String)List<String> findValuesAsText(String, List<String>)replaced byList<String> findValuesAsString(String, List<String>)boolean isContainerNode()replaced byboolean isContainer()boolean isEmpty(SerializerProvider)replaced byboolean isEmpty(SerializationContext)JsonNode put(String, JsonNode)replaced byJsonNode replace(String, JsonNode)JsonNode putAll(Map<String, ? extends JsonNode>)replaced byJsonNode setAll(Map<String, ? extends JsonNode>)JsonNode putAll(ObjectNode)replaced byJsonNode setAll(ObjectNode)- 🚚
JsonParser traverse()removed without replacement - 📜
JsonParser traverse(ObjectCodec)replaced byJsonParser traverse(ObjectReadContext) void serialize(JsonGenerator, SerializerProvider)replaced byvoid serialize(JsonGenerator, SerializationContext)void serializeWithType(JsonGenerator, SerializerProvider, TypeSerializer)replaced byvoid serializeWithType(JsonGenerator, SerializationContext, TypeSerializer)
🗄 Methods deprecated in Jackson 3:
String asText()replaced byString asString()String asText(String)replaced byString asString(String)boolean isTextual()replaced byboolean isString()String textValue()replaced byString stringValue()
There is also a behaviour change in the different
xxxValueandasXXXmethods. In Jackson 3 those methods would fail if the node is not of the appropriate type and / or if it cannot coerce the value to the requested type. e.g.- When using
stringValueon a nonStringNodeorNullNodeit would fail, in Jackson 2 it would returnnull. - When using
asStringon aObjectNodeorArrayNodeit would fail, in Jackson 2 it would return an empty string.
⬆️ Dependency Upgrades
- ⬆️ Upgrade to Spring Framework 7 / Spring Boot 4
- ⬆️ Upgrade to Jackson 3 (with Jackson 2 compatibility)
- ⚡️ Various other dependency updates
Previous changes from v7.2.0
-
- 👌 Support for setting Variables asynchronous for BPMN and CMMN
- 👌 Support for Skip Expression for Receive Task and Send Event Task
- 👌 Support for setting local variables when migration case instances
- 👌 Support querying Historic Variables by collection of Case / Process instance ids
- 👌 Support querying Process / Case instances excluding a set of definition keys
- 👌 Support for including only defined variables when querying (Historic) Process / Case instances
- 👌 Support for querying Case instances by parent ID
- 👌 Support Input variables for Script Task
- 👌 Support resolving Case / Plan Item instance in a task listener expression
- 👌 Support DMN rule expressions with logic not at the beginning of the rule
- 👌 Support for using available conditions for Variable Event Listeners
- 👌 Support for secure HTTP Headers in the HTTP Task. When using these headers, then the header values are going to be masked when logging them and / or storing them as variables
- 👌 Support for
BigIntegerandBigDecimalas variables - 👌 Support for configuring the max length for large variables (string, json, serializable, byte array)
- ✂ Remove child deployments when un-deploying an App
- ➕ Add completedBy to Activity Instance
- ➕ Add assignee / completedBy to Plan Item Instance
- 🔄 Change REST API Date responses to use UTC instead of Server Timezone
- 👌 Improve REST API to support querying dates without seconds or milliseconds
- 👌 Improve Swagger Docs by including information for start, size, order, and sort in relevant places
- 👌 Improve performance by avoiding dirty checks for Immutable entities
- 👌 Improve BPMN performance for straight through processes by avoiding unnecessary selects during deletion
- 👌 Improve CMMN performance by using a dedicated list for storing the evaluate criteria operations (which are executed once all other operations are done)
- 👌 Improve Housekeeping performance
- 🛠 Fix issue when invoking
getandpathonJsonNodethrough expressions - 🛠 Fix issue when parsing and validating XML with empty CDATA
- 🛠 Fix issue with matching incoming events when having channel definitions in the default tenant
- 🛠 Fix issue with optimistic locking for stages with async elements
- 🛠 Fix issue when using Apache HttpClient 5, and the response uses a non-compliant HTTP Status code
- 🛠 Fix issue when using a DMN Hit Policy Priority and no results
- 🛠 Fix issue with boundary events when dynamically moving the current state to the parent process instance
- 🗄 Deprecate support for JUnit 3 and JUnit 4
- 🗄 Deprecate support for Joda Time
- ⬆️ Upgrade to Spring Boot 3.5.4
Note: Our current plan is the next Release (Flowable 8) to be based on Spring 7, Spring Boot 4 and use Jackson 3. We will also support Jackson 2, but by default we would use Jackson 3. See Path to Jackson 3.0.0 from the Jackson team