Skip to content

Release v6.4.0

Choose a tag to compare

@github-actions github-actions released this 30 Jun 07:55
· 85 commits to main since this release
94f7e72

Release Notes — Cumulocity Dynamic Mapper v6.4.0

This release introduces mapping versioning, automatic GraalVM JS engine rotation,
and a comprehensive end-to-end test suite. Snooping has been removed.
Several long-standing bug fixes ship alongside internal architectural improvements.


⚠️ Breaking Changes

Snooping removed #523

The snooping feature — which sampled live broker traffic to discover message payload
schemas — has been fully removed from the backend and UI after some deprecation
period; the feature is gone in this release. It is replaced by the already introduced Message Explorer,
which provides live message inspection with session-scoped filtering and a configurable TTL.


✨ New Features

Mapping versioning #524

Mappings now maintain a full version history. Each saved mapping creates an immutable
version following the SemVer schema; a configurable maximum version count controls how many are retained. A draft
workflow lets you stage changes before committing them. Previous versions can be browsed,
and restored directly from the mapping editor.

GraalVM JS engine rotation

The GraalVM polyglot engine used to execute Smart Functions is now automatically rotated
to prevent unbounded memory growth. Two strategies run in parallel:

  • Count-based rotation — after engineRotationThreshold context creations (default: 100)
  • Time-based rotation — after engineMaxAgeMinutes (default: off)

Both thresholds are configurable in the service configuration page. A manual
Rotate engines action is also available from the service configuration UI for
on-demand reclamation.

Message Explorer — Session TTL #521

The WebSocket session time-to-live (in minutes) is now configurable directly from the
Message Explorer UI. Previously this required a backend service configuration change
and a restart.

Comprehensive end-to-end test suite

A new bash-based integration test suite ships under resources/script/test/. It covers
40+ inbound and outbound scenarios: JSON, JSONata, Smart Functions, extensions (SparkPlugB,
FlatFile, Hex), multi-device, multi-connector, multi-tenant, reconnect, static subscriptions,
group subscriptions, and more.

A shared test harness (test-harness.sh) lets the same scripts run against the public
MQTT broker or the Cumulocity MQTT Service (X.509 certificate auth) with no per-file
changes.

# Run all tests
bash run-tests.sh

# Run inbound suite against the Cumulocity MQTT Service
bash run-tests.sh inbound m

# Run everything against the public broker
bash run-tests.sh all g

🔧 Improvements

Smart Function pipeline timeout & cancellation

Smart Function execution now supports a configurable pipeline timeout via
pipelineTimeoutMS. When the timeout is exceeded, a cancellation signal is sent to the
C8Y agent, stopping in-flight processing and releasing resources cleanly.

Outbound soft-skip for missing external ID

When an outbound mapping targets a device that has no registered external ID, the
pipeline now performs a soft skip — logging a warning and continuing — rather than a
hard abort that could affect unrelated mappings in the same pipeline.

Spring AI upgraded to 2.0.0

The AI agent integration used for auto-generating mappings has been upgraded to
Spring AI 2.0.0. MCP server issues from prior releases are resolved in this upgrade.


🐛 Bug Fixes

Smart Functions: missing atob / btoa

The standard base64 functions atob and btoa were unavailable inside the GraalVM
Smart Function sandbox, causing runtime errors for mappings that performed base64
encoding or decoding. Both functions are now present in the sandbox environment.

Duplicate message processing

Fixed a bug where the same inbound message could be processed and forwarded to
Cumulocity more than once, resulting in duplicate measurements, events, or alarms.

Smart Function warm-up IIFE isolation

warmupMappingCodes now wraps each mapping's JavaScript in the same
immediately-invoked function expression (IIFE) that the runtime uses during normal
execution. Previously, bare code evaluated at warm-up could leak variables across
mappings and cause non-deterministic failures at engine startup.

Target template not updating on mapping edit

Fixed a bug where changes to the targetTemplate field were silently discarded when
saving an existing mapping, leaving the old template active.

Mapping version display in editor

Resolved several related UI issues: the editor showed the wrong version number after a
draft was deleted; the version dialog displayed stale data after a save; and the version
label showed an incorrect value in the unified editor when switching between mappings.

Draft save guard

The mapping editor save button is now disabled when required fields are missing or
invalid, preventing incomplete drafts from being persisted to the backend.

Stale MQTT push connections cleaned up on timeout #525

When a device's MQTT push connection timed out, the dead client entry was left in the
internal connection map. This blocked future reconnection attempts for the same device
and produced repeated WARN log messages. The entry is now evicted atomically on timeout,
and the log level for expected timeouts (e.g. test devices cleaned up at test end) has
been lowered from WARN to DEBUG.


🏗 Internal & Technical

C8YAgent decomposed into focused service classes

The monolithic C8YAgent class has been split into purpose-specific services
(inventory, identity, events, measurements, alarms, operations). This makes unit
testing easier and removes hidden cross-concern dependencies.

Constructor injection throughout the service

Spring @Autowired field injection has been replaced with constructor injection across
the service layer. This resolves several circular dependency issues and makes the
dependency graph explicit and verifiable at compile time.

Typed Apache Camel header constants

Raw string keys for Apache Camel message headers have been replaced with typed
constants, eliminating a class of silent routing bugs caused by header name typos.

Deprecated MQTTServiceClient removed

The deprecated MQTTServiceClient class has been removed. All MQTT Service
interactions now go through the unified connector path (CUMULOCITY_MQTT_SERVICE_PULSAR).


Cumulocity Dynamic Mapper · v6.4.0 · June 2026
All releases on GitHub
Full Changelog: v6.3.4...v6.4.0