|
| 1 | +# **💥 BREAKING CHANGES** |
| 2 | + |
| 3 | +## Nexus Failure Serialization |
| 4 | + |
| 5 | +The Java SDK now uses Temporal `Failure` protos for Nexus operation and handler task |
| 6 | +failures, instead of the legacy `UnsuccessfulOperationError`/`HandlerError` format. |
| 7 | +This allows `OperationException` and `HandlerException` to carry their own message and |
| 8 | +stack trace independently of their cause. |
| 9 | + |
| 10 | +The SDK automatically falls back to the legacy format when the server does not support |
| 11 | +the new format. However, if your code inspects the raw structure of Nexus failures |
| 12 | +(e.g. via custom interceptors or failure converters), you may need to update it to |
| 13 | +handle the new format. (#2773) |
| 14 | + |
| 15 | +# **Highlights** |
| 16 | + |
| 17 | +## Spring Boot 4 and Jackson 3 Support |
| 18 | + |
| 19 | +Spring Boot 4 is now supported. The Spring Boot autoconfigure module was updated for |
| 20 | +Spring Boot 4 API changes (e.g. updated class references in `MetricsScopeAutoConfiguration` |
| 21 | +and `OpenTracingAutoConfiguration`). No code changes are needed in application code. (#2787) |
| 22 | + |
| 23 | +Jackson 3 is now optionally supported via a multi-release JAR. To opt in, call |
| 24 | +`JacksonJsonPayloadConverter.setDefaultAsJackson3(true, jacksonCompatMode)` at startup. |
| 25 | +Jackson 3 and Jackson 2 converters are wire-compatible. Jackson 3 is an optional |
| 26 | +dependency and is not pulled in automatically. (#2783) |
| 27 | + |
| 28 | +Plugin beans (`WorkflowServiceStubsPlugin`, `WorkflowClientPlugin`, `ScheduleClientPlugin`, |
| 29 | +`WorkerPlugin`) defined in the Spring context are now automatically discovered and wired |
| 30 | +into the Temporal client and worker configuration. Plugins support `@Order` and `@Priority` |
| 31 | +annotations for consistent ordering. (#2766) |
| 32 | + |
| 33 | +## Upgrade-on-ContinueAsNew |
| 34 | + |
| 35 | +PINNED workflows can now upgrade to the latest worker deployment version on |
| 36 | +continue-as-new by setting `initialVersioningBehavior` to `AUTO_UPGRADE` in |
| 37 | +`ContinueAsNewOptions`. A new `WorkflowInfo.isTargetWorkerDeploymentVersionChanged()` |
| 38 | +method lets workflows detect when the target worker deployment version has changed, |
| 39 | +enabling explicit upgrade decisions. (#2811) |
| 40 | + |
| 41 | +## Local Timeout for Activity Heartbeats |
| 42 | + |
| 43 | +Activity heartbeat timeouts are now enforced locally by the SDK, matching the behavior |
| 44 | +of the Core-based SDKs. Previously, only the server enforced heartbeat timeouts; the |
| 45 | +local check reduces the time it takes for a stale activity to be detected and retried. |
| 46 | +This feature applies to heartbeat timeouts only, not overall activity timeouts. (#2804) |
| 47 | + |
| 48 | +## Nexus Caller Timeouts |
| 49 | + |
| 50 | +`ScheduleToStartTimeout` and `StartToCloseTimeout` are now supported for Nexus |
| 51 | +operations, in addition to the existing `ScheduleToCloseTimeout`. The test server was |
| 52 | +updated to enforce all three timeout types and compute the `OPERATION_TIMEOUT` header |
| 53 | +correctly. (#2760) |
| 54 | + |
| 55 | +# **Bugfixes** |
| 56 | + |
| 57 | +## ContextClassLoader Propagation for Poll Tasks |
| 58 | + |
| 59 | +When `PollerBehaviorAutoscaling` is enabled, poll tasks run asynchronously on a |
| 60 | +common `ForkJoinPool`, whose threads use the system class loader by default. This |
| 61 | +caused class-loading failures in frameworks like Spring Boot that rely on a custom |
| 62 | +context class loader (e.g. `LaunchedClassLoader`). The SDK now captures and propagates |
| 63 | +the context class loader from the thread that created the `WorkerFactory` to all |
| 64 | +worker threads. (#2808) |
| 65 | + |
| 66 | +## Workflow Slot Not Marked Used for Async Pollers |
| 67 | + |
| 68 | +When `PollerBehaviorAutoscaling` was enabled, `AsyncWorkflowPollTask` was not calling |
| 69 | +`markSlotUsed` on the `SlotSupplier` after receiving a task. This caused the |
| 70 | +`WORKER_TASK_SLOTS_AVAILABLE` metric to report an incorrectly high value. (#2803) |
| 71 | + |
| 72 | +## Validate `WorkerDeploymentOptions` at Build Time |
| 73 | + |
| 74 | +`WorkerDeploymentOptions.build()` now rejects configurations where |
| 75 | +`defaultVersioningBehavior` is set to anything other than `UNSPECIFIED` when |
| 76 | +`useVersioning` is `false`. Previously such configurations were silently accepted but |
| 77 | +then rejected by the server at workflow task completion, causing workflows to get stuck. |
| 78 | +(#2807) |
| 79 | + |
| 80 | +## Fix Exception Swallowing on `Workflow.getVersion()` |
| 81 | + |
| 82 | +A bug where exceptions thrown by a workflow could be swallowed and replaced by a |
| 83 | +worker-shutdown error when `Workflow.getVersion()` was called is now fixed for all |
| 84 | +new workflows. Existing workflows replay correctly without any changes. (#2819) |
| 85 | + |
| 86 | +# What's Changed |
| 87 | + |
| 88 | +2026-02-26 - 9799bd00 - Add missing apostrophe to WorkflowException message (#2776) |
| 89 | +2026-02-27 - ef194239 - Add headers to cancel nexus task (#2798) |
| 90 | +2026-03-10 - 20fb8520 - Nexus caller timeouts (#2760) |
| 91 | +2026-03-10 - dbd648bd - Update Nexus failure conversion (#2773) |
| 92 | +2026-03-11 - 6ba0947f - Fix async poller workflow slot used (#2803) |
| 93 | +2026-03-13 - 53449bb5 - Introduce local timeout for activity heartbeats (#2804) |
| 94 | +2026-03-16 - 9356745c - Replace docker instructions for running a local server with CLI instructions. (#2806) |
| 95 | +2026-03-17 - 95169659 - Cancel timer when Workflow.await condition is satisfied (#2799) |
| 96 | +2026-03-17 - fb2defd9 - Fix time skipping for dotnet SDK (#2805) |
| 97 | +2026-03-19 - 02182b93 - Support plugins in spring-boot-autoconfigure (#2766) |
| 98 | +2026-03-23 - a714cc10 - Allow poller scale-down on timeout when server supports autoscaling (#2812) |
| 99 | +2026-03-24 - b9c186d1 - Add note about Rosetta for old protoc-gen-rpc-java (#2815) |
| 100 | +2026-03-25 - c195cd1d - Add Spring Boot 4 support (#2787) |
| 101 | +2026-03-25 - fcb4e841 - Add opt-in Jackson 3 support via multi-release JAR (#2783) |
| 102 | +2026-03-27 - 0e1a7a25 - Validate deployment options and test worker with versioning off and custom build ID (#2807) |
| 103 | +2026-03-27 - da5e8a17 - Add upgrade-on-CAN support (#2811) |
| 104 | +2026-03-30 - b9b0f6b5 - Fix ContextClassLoader propagation for poll tasks (#2808) |
| 105 | +2026-03-31 - 5d969b87 - `tryUseSdkFlag(SdkFlag.SKIP_YIELD_ON_VERSION)` so that we default to enabling `SKIP_YIELD_ON_VERSION` when calling `getVersion()` (#2819) |
| 106 | +2026-03-31 - fb87ce6c - Update Temporal Cloud-API to v0.12.0 (#2814) |
0 commit comments