Decisions and supported features#
Configuration#
All remote adapter properties use the prefix dev.bpm-crafters.process-api.adapter.c7remote.
The remote starter expects a Camunda 7 REST client library on the classpath. The official Camunda external task client is optional and only needed when service tasks use subscribed delivery.
Classpath options#
| Use case | Required dependencies |
|---|---|
| Remote adapter in general | process-engine-adapter-camunda-platform-c7-remote-spring-boot-starter plus a Feign-based Camunda 7 REST client starter |
Service tasks with remote_scheduled |
Same as above |
Service tasks with remote_subscribed |
Same as above, plus org.camunda.bpm.springboot:camunda-bpm-spring-boot-starter-external-task-client:7.24.0 |
For Spring Boot 3.x the examples use:
<dependency>
<groupId>io.holunda.c7</groupId>
<artifactId>c7-rest-client-spring-boot-starter-feign</artifactId>
<version>${c7.version}</version>
</dependency>
For Spring Boot 4 use the Boot-4 specific variant:
<dependency>
<groupId>io.holunda.c7</groupId>
<artifactId>c7-rest-client-spring-boot-starter-feign-4</artifactId>
<version>${c7.version}</version>
</dependency>
Jackson compatibility#
The remote adapter starter supports both Jackson 2 and Jackson 3 for adapter-side serialization.
- Spring Boot 3 applications typically resolve to Jackson 2.
- Spring Boot 4 applications typically resolve to Jackson 3.
- The remote adapter does not require embedded Camunda Spin, so the embedded Spin limitation does not apply to the adapter runtime here.
That means Jackson 3 is a supported and expected choice for remote Spring Boot 4 applications. If the remote Camunda 7 engine itself uses Spin for JSON variables, that remains a concern of the remote engine runtime, not of the adapter starter.
Feign client vs official external client for service tasks#
| Topic | Feign client | Official external client |
|---|---|---|
| Delivery strategy | remote_scheduled |
remote_subscribed |
| Classpath | Requires the Feign REST client starter | Requires the Feign REST client starter and the official external task client starter |
| Service-task delivery | Adapter polls /external-task/fetchAndLock on its own schedule |
Camunda client keeps topic subscriptions open and receives tasks through its own worker runtime |
| Service-task completion | Uses ExternalTaskApiClient through the REST client |
Uses ExternalTaskClient / ExternalTaskService from Camunda |
| YAML for engine URL | feign.client.config.default.url |
camunda.bpm.client.base-url in addition to feign.client.config.default.url |
| Scope in this adapter | Used by the remote adapter's REST-based APIs, including scheduled service-task and user-task delivery | Used only by subscribed service-task delivery |
Minimal YAML#
Scheduled delivery with Feign#
dev:
bpm-crafters:
process-api:
adapter:
c7remote:
enabled: true
service-tasks:
delivery-strategy: remote_scheduled
worker-id: remote-worker
user-tasks:
delivery-strategy: remote_scheduled
feign:
client:
config:
default:
url: "http://localhost:9090/engine-rest/"
Subscribed delivery with the official external client#
dev:
bpm-crafters:
process-api:
adapter:
c7remote:
enabled: true
service-tasks:
delivery-strategy: remote_subscribed
worker-id: remote-worker
user-tasks:
delivery-strategy: remote_scheduled
feign:
client:
config:
default:
url: "http://localhost:9090/engine-rest/"
camunda:
bpm:
client:
base-url: "http://localhost:9090/engine-rest/"
Delivery strategies#
User tasks#
| Value | Effect |
|---|---|
remote_scheduled |
Polls user tasks over REST and enables user-task completion/modification beans. |
custom |
Disables the built-in recurring delivery. Provide your own delivery and matching user-task beans if needed. |
disabled |
Disables user-task delivery and configures a no-op user-task completion API. |
Service tasks#
| Value | Effect |
|---|---|
remote_scheduled |
Polls external tasks over REST with the Feign-based client. |
remote_subscribed |
Uses the official Camunda external task client and topic subscriptions. |
custom |
Disables the built-in recurring delivery. Provide your own delivery and matching service-task completion bean if needed. |
disabled |
Disables service-task delivery and configures a no-op service-task completion API. |
Important properties#
enabled#
Turns the remote adapter on or off. Default: false.
service-tasks.*#
| Property | Default | Description |
|---|---|---|
worker-id |
required | Worker id used for external task fetching and completion. |
max-task-count |
100 |
Maximum number of external tasks fetched per pull cycle. |
lock-time-in-seconds |
10 |
Lock duration for fetched external tasks. |
retry-timeout-in-seconds |
10 |
Timeout used by the default failure retry supplier. |
retries |
3 |
Initial retry count used by the default failure retry supplier. |
delivery-strategy |
required | One of remote_scheduled, remote_subscribed, custom, disabled. |
schedule-delivery-fixed-rate-in-seconds |
13 |
Polling interval for remote_scheduled. |
execute-initial-pull-on-startup |
true in property binding |
Enable one startup pull before the recurring scheduler or subscriber takes over. Set it explicitly when you want startup delivery. |
deserialize-on-server |
false |
Requests Camunda REST variable deserialization on the server side for scheduled pulls. |
worker-thread-pool-size |
10 |
Thread pool size for scheduled service-task worker execution. |
worker-thread-pool-queue-capacity |
50 |
Queue capacity for scheduled service-task worker execution. |
user-tasks.*#
| Property | Default | Description |
|---|---|---|
delivery-strategy |
required | One of remote_scheduled, custom, disabled. |
schedule-delivery-fixed-rate-in-seconds |
5 |
Polling interval for remote_scheduled. |
execute-initial-pull-on-startup |
true in property binding |
Enable one startup pull before the recurring scheduler takes over. Set it explicitly when you want startup delivery. |
deserialize-on-server |
false |
Requests Camunda REST variable deserialization on the server side for user-task polling. |
Example with explicit scheduling settings#
dev:
bpm-crafters:
process-api:
adapter:
c7remote:
enabled: true
service-tasks:
delivery-strategy: remote_scheduled
schedule-delivery-fixed-rate-in-seconds: 5
worker-id: remote-worker
lock-time-in-seconds: 10
deserialize-on-server: false
worker-thread-pool-queue-capacity: 5
worker-thread-pool-size: 2
max-task-count: 2
execute-initial-pull-on-startup: true
user-tasks:
delivery-strategy: remote_scheduled
schedule-delivery-fixed-rate-in-seconds: 5
execute-initial-pull-on-startup: false
deserialize-on-server: false
feign:
client:
config:
default:
url: "http://localhost:9090/engine-rest/"
Message Correlation#
Correlation API implementation support the following restrictions:
| Key | Value | Description |
|---|---|---|
tenantId |
The id of the tenant | Correlates messages for process instances with given tenant id. |
withoutTenantId |
none | If restriction is present, correlate only with process instances without tenant id. |
useGlobalCorrelationKey |
true or false |
If set to false (default if not set), correlate using local variables, use global process variable otherwise. |
Task Information#
Currently, the Process Engine Adapter C7 Remote supports the following values in task information meta block, mapped from the Camunda C7 engine:
The TaskInformation.getMeta() provides meta information about the task in form of a Map<String, String> for maximum compatibility. The Original Type column denotes
the real type, you want to access if reading the field. For this purpose, TaskInformation offers special access methods getMetaValueAsOffsetDate and getMetaValueAsStringSet.
User Tasks#
| Key | Original Type | Description | Example |
|---|---|---|---|
| activityId | String | Id of the element in BPMN (Task definition key) | approve_user_task |
| processDefinitionId | String | Id of process definition (given at deployment time) | approval_process:912834729348 |
| processDefinitionKey | String | Id of the process element in BPMN (Process Definition key) | approval_process |
| tenantId | String | Tenant Id | my_tenant |
| taskName | String | Name of the user task (from BPMN or modified by the create listener) | Approve Order |
| taskDescription | String | Description of the user task (from BPMN or modified by the create listener) | Approve provided order. |
| assignee | String | Assignee of the user task | USER12345 |
| candidateUsers | Set |
Set of candidate users, separated by a , |
USER12345,USER12346,USER12347 |
| candidateGroups | Set |
Set of candidate groups, separated by a , |
marketing,sales |
| creationDate | OffsetDateTime | Time stamp of task creation formatted as ISO-8601 in UTC | 2025-05-01T10:00:00.000Z |
| followUpDate | OffsetDateTime | Time stamp of task follow-up formatted as ISO-8601 in UTC | 2025-05-02T10:00:00.000Z |
| dueDate | OffsetDateTime | Time stamp of task due formatted as ISO-8601 in UTC | 2025-05-05T10:00:00.000Z |
| lastUpdatedDate | OffsetDateTime | Time stamp of task last update formatted as ISO-8601 in UTC | 2025-05-05T10:00:00.000Z |
Service Tasks#
| Key | Original Type | Description | Example |
|---|---|---|---|
| activityId | String | Id of the element in BPMN (Task definition key) | approve_user_task |
| processDefinitionId | String | Id of process definition (given at deployment time) | approval_process:912834729348 |
| processDefinitionKey | String | Id of the process element in BPMN (Process Definition key) | approval_process |
| tenantId | String | Tenant Id | my_tenant |
| topicName | String | Topic name (from BPMN) for external task | topic_approve |
| creationDate | OffsetDateTime | Time stamp of task creation formatted as ISO-8601 in UTC | 2025-05-01T10:00:00.000Z |