Application properties
camunda.connector.polling.enabled=false
camunda.operate.client.enabled=false
camunda.client.operate.enabled=false
camunda.connector.webhook.enabled=false
operate.client.enabled=false
zeebe.client.broker.gateway-address=127.0.0.1:26500
zeebe.client.security.plaintext=false
4.0.0
org.springframework.boot
spring-boot-starter-parent
3.3.4
io.camunda.demo
camunda_helloworld
0.0.1-SNAPSHOT
Process payments
Process payments with Camunda
<java.version>21</java.version>
<version.zeebe.spring>8.5.0</version.zeebe.spring>
<camunda.connector-version>8.5.0</camunda.connector-version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.camunda.connector/spring-boot-starter-camunda-connectors -->
<dependency>
<groupId>io.camunda.connector</groupId>
<artifactId>spring-boot-starter-camunda-connectors</artifactId>
<version>8.5.2</version>
</dependency>
<dependency>
<groupId>io.camunda</groupId>
<artifactId>zeebe-client-java</artifactId>
<version>8.5.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.camunda.connector/element-template-generator-core -->
<dependency>
<groupId>io.camunda.connector</groupId>
<artifactId>element-template-generator-core</artifactId>
<version>${camunda.connector-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.http-client/google-http-client -->
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client</artifactId>
<version>1.45.0</version>
<exclusions>
<exclusion>
<groupId>io.grpc</groupId>
<artifactId>grpc-api</artifactId>
</exclusion>
<exclusion>
<groupId>io.opencensus</groupId>
<artifactId>opencensus-api</artifactId>
</exclusion>
<exclusion>
<groupId>io.grpc</groupId>
<artifactId>grpc-context</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.api-client/google-api-client -->
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>2.7.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/jakarta.validation/jakarta.validation-api -->
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
I want to connect to self managed zebee broker running - register my OutboundConnector.
package io.camunda.connector;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.api.client.http.HttpRequestFactory;
import io.camunda.connector.api.annotation.OutboundConnector;
import io.camunda.connector.api.json.ConnectorsObjectMapperSupplier;
import io.camunda.connector.api.outbound.OutboundConnectorContext;
import io.camunda.connector.api.outbound.OutboundConnectorFunction;
import io.camunda.connector.generator.java.annotation.ElementTemplate;
import io.camunda.connector.generator.java.annotation.ElementTemplate.PropertyGroup;
import io.camunda.connector.http.base.components.HttpTransportComponentSupplier;
import io.camunda.connector.http.base.services.HttpService;
import io.camunda.connector.http.rest.model.HttpJsonRequest;
import java.io.IOException;
import org.springframework.stereotype.Component;
@Component
@OutboundConnector(
name = “HTTP REST”,
inputVariables = {
“url”,
“method”,
“authentication”,
“headers”,
“queryParameters”,
“connectionTimeoutInSeconds”,
“readTimeoutInSeconds”,
“writeTimeoutInSeconds”,
“body”
},
type = HttpJsonFunction.TYPE)
@ElementTemplate(
id = “io.camunda.connectors.HttpJson.v2”,
name = “REST Outbound Connector”,
description = “Invoke REST API”,
inputDataClass = HttpJsonRequest.class,
version = 8,
propertyGroups = {
@PropertyGroup(id = “authentication”, label = “Authentication”),
@PropertyGroup(id = “endpoint”, label = “HTTP endpoint”),
@PropertyGroup(id = “timeout”, label = “Connection timeout”),
@PropertyGroup(id = “payload”, label = “Payload”)
},
documentationRef = “REST Connector | Camunda 8 Docs”,
icon = “icon.svg”)
public class HttpJsonFunction implements OutboundConnectorFunction {
public static final String TYPE = “io.camunda:http-json:1”;
private final HttpService httpService;
public HttpJsonFunction() {
this(
ConnectorsObjectMapperSupplier.getCopy(),
HttpTransportComponentSupplier.httpRequestFactoryInstance());
}
public HttpJsonFunction(
final ObjectMapper objectMapper, final HttpRequestFactory requestFactory) {
this.httpService = new HttpService(objectMapper, requestFactory);
}
@Override
public Object execute(final OutboundConnectorContext context)
throws IOException, InstantiationException, IllegalAccessException {
final var request = context.bindVariables(HttpJsonRequest.class);
return httpService.executeConnectorRequest(request);
}
}
BPMN
<?xml version="1.0" encoding="UTF-8"?><bpmn:definitions xmlns:bpmn=“http://www.omg.org/spec/BPMN/20100524/MODEL” xmlns:bpmndi=“http://www.omg.org/spec/BPMN/20100524/DI” xmlns:dc=“http://www.omg.org/spec/DD/20100524/DC” xmlns:zeebe=“http://camunda.org/schema/zeebe/1.0” xmlns:di=“http://www.omg.org/spec/DD/20100524/DI” xmlns:modeler=“http://camunda.org/schema/modeler/1.0” id=“Definitions_03bsxv6” targetNamespace=“http://bpmn.io/schema/bpmn” exporter=“Camunda Modeler” exporterVersion=“5.28.0” modeler:executionPlatform=“Camunda Cloud” modeler:executionPlatformVersion=“8.6.0”>
<bpmn:process id=“Process_0cy6nj0” isExecutable=“true”>
<bpmn:startEvent id=“StartEvent_1” name=“Start”>
bpmn:outgoingFlow_1mc2qmc</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id=“Flow_1mc2qmc” sourceRef=“StartEvent_1” targetRef=“custom-rest-outbound-connector” />
<bpmn:serviceTask id=“custom-rest-outbound-connector” name=“custom-rest-outbound-connector” zeebe:modelerTemplate=“io.camunda.connectors.HttpJson.v2” zeebe:modelerTemplateVersion=“8” zeebe:modelerTemplateIcon=“data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTE3LjAzMzUgOC45OTk5N0MxNy4wMzM1IDEzLjQ0NzUgMTMuNDI4MSAxNy4wNTI5IDguOTgwNjUgMTcuMDUyOUM0LjUzMzE2IDE3LjA1MjkgMC45Mjc3NjUgMTMuNDQ3NSAwLjkyNzc2NSA4Ljk5OTk3QzAuOTI3NzY1IDQuNTUyNDggNC41MzMxNiAwLjk0NzA4MyA4Ljk4MDY1IDAuOTQ3MDgzQzEzLjQyODEgMC45NDcwODMgMTcuMDMzNSA0LjU1MjQ4IDE3LjAzMzUgOC45OTk5N1oiIGZpbGw9IiM1MDU1NjIiLz4KPHBhdGggZD0iTTQuOTMxMjYgMTQuMTU3MUw2Ljc4MTA2IDMuNzE0NzFIMTAuMTM3NUMxMS4xOTE3IDMuNzE0NzEgMTEuOTgyNCAzLjk4MzIzIDEyLjUwOTUgNC41MjAyN0MxMy4wNDY1IDUuMDQ3MzYgMTMuMzE1IDUuNzMzNTggMTMuMzE1IDYuNTc4OTJDMTMuMzE1IDcuNDQ0MTQgMTMuMDcxNCA4LjE1NTIyIDEyLjU4NDEgOC43MTIxNUMxMi4xMDY3IDkuMjU5MTMgMTEuNDU1MyA5LjYzNzA1IDEwLjYyOTggOS44NDU5TDEyLjA2MTkgMTQuMTU3MUgxMC4zMzE1TDkuMDMzNjQgMTAuMDI0OUg3LjI0MzUxTDYuNTEyNTQgMTQuMTU3MUg0LjkzMTI2Wk03LjQ5NzExIDguNTkyODFIOS4yNDI0OEM5Ljk5ODMyIDguNTkyODEgMTAuNTkwMSA4LjQyMzc0IDExLjAxNzcgOC4wODU2MUMxMS40NTUzIDcuNzM3NTMgMTEuNjc0MSA3LjI2NTEzIDExLjY3NDEgNi42Njg0MkMxMS42NzQxIDYuMTkxMDYgMTEuNTI0OSA1LjgxODExIDExLjIyNjUgNS41NDk1OUMxMC45MjgyIDUuMjcxMTMgMTAuNDU1OCA1LjEzMTkgOS44MDkzNiA1LjEzMTlIOC4xMDg3NEw3LjQ5NzExIDguNTkyODFaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K”>
bpmn:extensionElements
<zeebe:taskDefinition type=“io.camunda:http-json:1” retries=“3” />
zeebe:ioMapping
<zeebe:input source=“noAuth” target=“authentication.type” />
<zeebe:input source=“GET” target=“method” />
<zeebe:input source=“http://localhost:8090/hello” target=“url” />
<zeebe:input source=“20” target=“connectionTimeoutInSeconds” />
<zeebe:input source=“20” target=“readTimeoutInSeconds” />
</zeebe:ioMapping>
zeebe:taskHeaders
<zeebe:header key=“resultVariable” value=“response” />
<zeebe:header key=“retryBackoff” value=“PT0S” />
</zeebe:taskHeaders>
</bpmn:extensionElements>
bpmn:incomingFlow_1mc2qmc</bpmn:incoming>
bpmn:outgoingFlow_1e3rwhw</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:endEvent id=“Event_0s41gep” name=“stop”>
bpmn:incomingFlow_1e3rwhw</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id=“Flow_1e3rwhw” sourceRef=“custom-rest-outbound-connector” targetRef=“Event_0s41gep” />
</bpmn:process>
<bpmndi:BPMNDiagram id=“BPMNDiagram_1”>
<bpmndi:BPMNPlane id=“BPMNPlane_1” bpmnElement=“Process_0cy6nj0”>
<bpmndi:BPMNShape id=“_BPMNShape_StartEvent_2” bpmnElement=“StartEvent_1”>
<dc:Bounds x=“179” y=“99” width=“36” height=“36” />
bpmndi:BPMNLabel
<dc:Bounds x=“185” y=“142” width=“25” height=“14” />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id=“Activity_1v244s4_di” bpmnElement=“custom-rest-outbound-connector”>
<dc:Bounds x=“270” y=“77” width=“100” height=“80” />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id=“Event_0s41gep_di” bpmnElement=“Event_0s41gep”>
<dc:Bounds x=“432” y=“99” width=“36” height=“36” />
bpmndi:BPMNLabel
<dc:Bounds x=“439” y=“142” width=“22” height=“14” />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id=“Flow_1mc2qmc_di” bpmnElement=“Flow_1mc2qmc”>
<di:waypoint x=“215” y=“117” />
<di:waypoint x=“270” y=“117” />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id=“Flow_1e3rwhw_di” bpmnElement=“Flow_1e3rwhw”>
<di:waypoint x=“370” y=“117” />
<di:waypoint x=“432” y=“117” />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
But keep getting error as below:
Description:
Parameter 0 of method springOperateClientAdapter in io.camunda.connector.runtime.inbound.operate.OperateClientConfiguration required a bean of type ‘io.camunda.operate.CamundaOperateClient’ that could not be found.
Action:
Consider defining a bean of type ‘io.camunda.operate.CamundaOperateClient’ in your configuration.