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 planItemInstances keyword has been expanded to support filtering based on a predicate using lambda expressions
    • The method stream() can be used to obtain a java.util.stream.Stream from 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 planItemInstances now expose a filter(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.583Z would have been returned as 2020-05-04T09:25:45Z. However, now it would be returned as 2020-05-04T09:25:45.583Z which 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:00 now it is returned as 2025-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 endUserId for historic process/case instances and state for historic process instances

    • Case 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 ObjectMapper instance 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 BeanELResolver and 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-mapper to jackson2. By default, Jackson 3 is being used for variables. When configuring Flowable without Spring Boot then the variableJsonMapper on the process, cmmn, and app engine configurations should be set to be org.flowable.common.engine.impl.json.jackson2.Jackson2VariableJsonMapper and the org.flowable.common.rest.variable.Jackson2JsonObjectRestVariableConverter should be added to the appropriate rest response factories.

    Notable changes when using JSON in expressions / scripts:

    • 📦 Packages have changed from com.fasterxml.jackson.databind and com.fasterxml.jackson.core to tools.jackson.databind and tools.jackson.core
    • elements() no longer returns Iterator<JsonNode> and instead returns Collection<JsonNode>
    • values() no longer returns Iterator<JsonNode> and instead returns Collection<JsonNode>
    • Iterator<String> fieldNames() replaced by Collection<String> propertyNames()
    • Iterator<Map.Entry<String, JsonNode>> fields() replaced by Set<Map.Entry<String, JsonNode>> properties()
    • 👍 JsonNode with(String) replaced by ObjectNode withObject(String), and if not using a pointer then it is better to use ObjectNode withProperty(String)
    • TextNode textNode(String) replaced by StringNode stringNode(String)
    • List<String> findValuesAsText(String) replaced by List<String> findValuesAsString(String)
    • List<String> findValuesAsText(String, List<String>) replaced by List<String> findValuesAsString(String, List<String>)
    • boolean isContainerNode() replaced by boolean isContainer()
    • boolean isEmpty(SerializerProvider) replaced by boolean isEmpty(SerializationContext)
    • JsonNode put(String, JsonNode) replaced by JsonNode replace(String, JsonNode)
    • JsonNode putAll(Map<String, ? extends JsonNode>) replaced by JsonNode setAll(Map<String, ? extends JsonNode>)
    • JsonNode putAll(ObjectNode) replaced by JsonNode setAll(ObjectNode)
    • 🚚 JsonParser traverse() removed without replacement
    • 📜 JsonParser traverse(ObjectCodec) replaced by JsonParser traverse(ObjectReadContext)
    • void serialize(JsonGenerator, SerializerProvider) replaced by void serialize(JsonGenerator, SerializationContext)
    • void serializeWithType(JsonGenerator, SerializerProvider, TypeSerializer) replaced by void serializeWithType(JsonGenerator, SerializationContext, TypeSerializer)

    🗄 Methods deprecated in Jackson 3:

    • String asText() replaced by String asString()
    • String asText(String) replaced by String asString(String)
    • boolean isTextual() replaced by boolean isString()
    • String textValue() replaced by String stringValue()

    There is also a behaviour change in the different xxxValue and asXXX methods. 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 stringValue on a non StringNode or NullNode it would fail, in Jackson 2 it would return null.
    • When using asString on a ObjectNode or ArrayNode it 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 BigInteger and BigDecimal as 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 get and path on JsonNode through 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