Cannot resolve identifier 'sqlDataRetrievalDelegate'

Hi.
I encountered this problem: Unknown property used in expression: ${sqlDataRetrievalDelegate}. Cause: Cannot resolve identifier ‘sqlDataRetrievalDelegate’.
I have written Java code to connect to MS SQL to fetch the data I need. I built the Jar file using Maven.
I am using Camunda v 7.18.0, I have it deployed using docker container. I have added my jar file to the container and when I try to run the process, I get the error as above. The java code was debugged on my physical machine and I had a successful connection and data retrieval.
What am I doing wrong? What am I missing?
I am attaching my files below for understanding.

My Java:

package org.example;

import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.springframework.stereotype.Component;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;

@Component
public class sqlDataRetrievalDelegate implements JavaDelegate {

    public void execute(DelegateExecution execution) throws Exception {
        // Ваш код для подключения к базе данных MS SQL и выполнения запросов
        String jdbcUrl = "jdbc:sqlserver://11.111.11.11:1111;databaseName=test";
        String username = "user";
        String password = "user";

        List<String> tags = Arrays.asList("TAG1", "TAG2", "TAG3", "TAG4");

        try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password)) {
            StringBuilder queryBuilder = new StringBuilder("SELECT TagName, TimeStamp, Value FROM OPENQUERY (PHD_OLEDB, 'SELECT * FROM phd.phd_data WHERE tagname IN (");
            for (int i = 0; i < tags.size(); i++) {
                queryBuilder.append("''").append(tags.get(i)).append("''");
                if (i < tags.size() - 1) {
                    queryBuilder.append(",");
                }
            }
            queryBuilder.append(") AND raw_data = true')");

            String query = queryBuilder.toString();

            try (PreparedStatement stmt = conn.prepareStatement(query)) {
                try (ResultSet rs = stmt.executeQuery()) {
                    while (rs.next()) {
                        // Пример: Сохранение данных в переменные процесса
                        String tagName = rs.getString("TagName");
                        String timeStamp = rs.getString("TimeStamp");
                        double value = rs.getDouble("Value");

                        // Вывод данных в консоль
                        System.out.println("TagName: " + tagName);
                        System.out.println("TimeStamp: " + timeStamp);
                        System.out.println("Value: " + value);

                        //execution.setVariable("tagNameVariable", tagName);
                        //execution.setVariable("timeStampVariable", timeStamp);
                        //execution.setVariable("valueVariable", value);
                    }
                }
            }
        } catch (SQLException e) {
            // Обработка ошибок, если необходимо
            e.printStackTrace();
        }
    }
}

My pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.dpisarenko</groupId>
    <artifactId>basic-camunda-app</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>13</maven.compiler.source>
        <maven.compiler.target>13</maven.compiler.target>
        <camunda.spring-boot.version>7.18.0</camunda.spring-boot.version>
        <spring-boot.version>2.7.3</spring-boot.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
            <version>${camunda.spring-boot.version}</version>
        </dependency>
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <version>9.4.0.jre16</version>
        </dependency>
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
            <version>${camunda.spring-boot.version}</version>
        </dependency>
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter</artifactId>
            <version>${camunda.spring-boot.version}</version>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.5</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <mainClass>com.myapp.sqlDataRetrievalDelegate</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

My docker-compose.yml:

version: '2'

networks:
  net:
    driver: bridge
    ipam:
      config:
        - subnet: "${NET}"
          gateway: "${GW}"


services:
  camunda:
    image: "camunda/camunda-bpm-platform:run-latest"
    container_name: "camunda_web"
    restart: unless-stopped
    logging:
      driver: journald
      options:
        tag: camunda
    ports:
      - "8443:8443"
      - "8080:8080"
    networks:
      net:
        ipv4_address: "111.11.1.1"
    environment:
      - CAMUNDA_BPM_DELEGATE_PACKAGES=org.example
      - JAVA_OPTS=-Dlogging.level.org.camunda.bpm=INFO
      - CLASSPATH=/camunda/lib/custom/*
    volumes:
      - '/opt/camunda/cmd/camunda.sh:/camunda/camunda.sh'
      - '/opt/camunda/conf/default.yml:/camunda/configuration/default.yml'
      - '/opt/camunda/conf/production.yml:/camunda/configuration/production.yml'
      - '/opt/camunda/tls:/etc/camunda/tls:ro'
      - '/opt/camunda/db/process-engine.mv.db:/camunda/camunda-h2-default/process-engine.mv.db:rw'
      - '/opt/camunda/keystore/cacerts:/etc/ssl/certs/java/cacerts'
      - '/opt/camunda/keystore/keystore.p12:/camunda/configuration/keystore/keystore.p12:rw'
      - '/opt/camunda/keystore/datalake.terralink2.p12:/camunda/configuration/keystore/test_test.p12:rw'
      - ./custom-lib:/camunda/lib/custom
        #  web:
        #    image: "nginx:${NGINX_IMAGE_VERSION}"
        #    container_name: "${NGINX_CONTAINER_NAME}"
        #    hostname: "${NGINX_HOSTNAME}"
        #    domainname: "${DOMAINNAME}"
        #    restart: "${NGINX_RESTART}"
        #    logging:
        #      driver: "${NGINX_LOG_DRIVER}"
        #      options:
        #        tag: "${NGINX_TAG}"
        #    ports:
        #      - "80:80"
        #      - "${NGINX_HTTPS_PORT}:443"
        #    networks:
        #      net:
        #        ipv4_address: "${NGINX_IP}"
        #    volumes:
        #      - '/opt/camunda/nginx/conf/conf.d:/etc/nginx/conf.d'
        #      - '/opt/camunda/tls:/etc/nginx/tls'

Hello my friend!

Did you annotate your class as @Component so that Springboot recognizes it as a valid bean?

Did you do the “implements” JavaDelegate in this class?

Is the name of your Delegate Class the same as the one you put in your BPM but with a capital letter?

William Robert Alves

Yes, the names are the same in BPMN and Java, below is the screenshot.
This is my first experience writing code to run a process and I may be doing something wrong or understanding the information.

Here’s some of the logs I see on the server

2023-08-15 12:15:02.465  WARN 10 --- [aTaskExecutor-3] org.camunda.bpm.engine.jobexecutor       : ENGINE-14006 Exception while executing job acf3efa9-3b64-11ee-8bf4-0242ac120002:
org.camunda.bpm.engine.ProcessEngineException: Unknown property used in expression: ${sqlDataRetrievalDelegate}. Cause: Cannot resolve identifier 'sqlDataRetrievalDelegate'
        at org.camunda.bpm.engine.impl.el.JuelExpression.getValue(JuelExpression.java:63) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.el.JuelExpression.getValue(JuelExpression.java:51) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.bpmn.behavior.ServiceTaskDelegateExpressionActivityBehavior$3.call(ServiceTaskDelegateExpressionActivityBehavior.java:107) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.bpmn.behavior.ServiceTaskDelegateExpressionActivityBehavior$3.call(ServiceTaskDelegateExpressionActivityBehavior.java:102) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior.executeWithErrorPropagation(AbstractBpmnActivityBehavior.java:90) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.bpmn.behavior.ServiceTaskDelegateExpressionActivityBehavior.performExecution(ServiceTaskDelegateExpressionActivityBehavior.java:127) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.bpmn.behavior.TaskActivityBehavior.execute(TaskActivityBehavior.java:69) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute$2.callback(PvmAtomicOperationActivityExecute.java:61) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute$2.callback(PvmAtomicOperationActivityExecute.java:50) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.continueIfExecutionDoesNotAffectNextOperation(PvmExecutionImpl.java:2082) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute.execute(PvmAtomicOperationActivityExecute.java:42) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute.execute(PvmAtomicOperationActivityExecute.java:31) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:99) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:130) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:110) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:85) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:622) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:596) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl$6.callback(PvmExecutionImpl.java:2021) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl$6.callback(PvmExecutionImpl.java:2018) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.continueExecutionIfNotCanceled(PvmExecutionImpl.java:2088) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.dispatchDelayedEventsAndPerformOperation(PvmExecutionImpl.java:2037) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.dispatchDelayedEventsAndPerformOperation(PvmExecutionImpl.java:2018) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationTransitionNotifyListenerStart.eventNotificationsCompleted(PvmAtomicOperationTransitionNotifyListenerStart.java:61) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationTransitionNotifyListenerStart.eventNotificationsCompleted(PvmAtomicOperationTransitionNotifyListenerStart.java:30) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:70) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:99) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:130) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:110) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:85) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:75) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:631) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:606) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:66) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:99) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:130) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:110) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:85) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:75) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:631) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:606) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:66) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:99) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:130) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:110) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:85) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:75) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:631) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:606) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:66) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:99) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:130) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:110) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:85) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:622) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:596) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationTransitionCreateScope.scopeCreated(PvmAtomicOperationTransitionCreateScope.java:38) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationCreateScope.execute(PvmAtomicOperationCreateScope.java:53) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationCreateScope.execute(PvmAtomicOperationCreateScope.java:27) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:99) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:130) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:117) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:85) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:622) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:596) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.start(PvmExecutionImpl.java:292) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.start(ExecutionEntity.java:449) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.start(PvmExecutionImpl.java:269) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:66) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:38) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandExecutorImpl.execute(CommandExecutorImpl.java:28) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:110) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.spring.SpringTransactionInterceptor.lambda$execute$0(SpringTransactionInterceptor.java:71) ~[camunda-engine-spring-7.18.0.jar!/:7.18.0]
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.3.22.jar!/:5.3.22]
        at org.camunda.bpm.engine.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:71) ~[camunda-engine-spring-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.ProcessApplicationContextInterceptor.execute(ProcessApplicationContextInterceptor.java:70) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandCounterInterceptor.execute(CommandCounterInterceptor.java:35) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:33) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.ExceptionCodeInterceptor.execute(ExceptionCodeInterceptor.java:55) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.ProcessInstantiationBuilderImpl.executeWithVariablesInReturn(ProcessInstantiationBuilderImpl.java:166) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.ProcessInstantiationBuilderImpl.execute(ProcessInstantiationBuilderImpl.java:132) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.ProcessInstantiationBuilderImpl.execute(ProcessInstantiationBuilderImpl.java:128) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.jobexecutor.TimerStartEventJobHandler.startProcessInstance(TimerStartEventJobHandler.java:58) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.jobexecutor.TimerStartEventJobHandler.execute(TimerStartEventJobHandler.java:47) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.jobexecutor.TimerStartEventJobHandler.execute(TimerStartEventJobHandler.java:28) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.persistence.entity.JobEntity.execute(JobEntity.java:133) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.cmd.ExecuteJobsCmd.execute(ExecuteJobsCmd.java:110) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.cmd.ExecuteJobsCmd.execute(ExecuteJobsCmd.java:43) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandExecutorImpl.execute(CommandExecutorImpl.java:28) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:110) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.spring.SpringTransactionInterceptor.lambda$execute$0(SpringTransactionInterceptor.java:71) ~[camunda-engine-spring-7.18.0.jar!/:7.18.0]
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.3.22.jar!/:5.3.22]
        at org.camunda.bpm.engine.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:71) ~[camunda-engine-spring-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.ProcessApplicationContextInterceptor.execute(ProcessApplicationContextInterceptor.java:70) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.CommandCounterInterceptor.execute(CommandCounterInterceptor.java:35) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:33) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.interceptor.ExceptionCodeInterceptor.execute(ExceptionCodeInterceptor.java:55) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.jobexecutor.ExecuteJobHelper.executeJob(ExecuteJobHelper.java:57) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.jobexecutor.ExecuteJobsRunnable.executeJob(ExecuteJobsRunnable.java:110) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.jobexecutor.ExecuteJobsRunnable.run(ExecuteJobsRunnable.java:71) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
        at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]
Caused by: org.camunda.bpm.engine.impl.javax.el.PropertyNotFoundException: Cannot resolve identifier 'sqlDataRetrievalDelegate'
        at org.camunda.bpm.engine.impl.juel.AstIdentifier.eval(AstIdentifier.java:83) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.juel.AstEval.eval(AstEval.java:50) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.juel.AstNode.getValue(AstNode.java:26) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.juel.TreeValueExpression.getValue(TreeValueExpression.java:114) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.delegate.ExpressionGetInvocation.invoke(ExpressionGetInvocation.java:40) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.delegate.DelegateInvocation.proceed(DelegateInvocation.java:58) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.delegate.DefaultDelegateInterceptor.handleInvocationInContext(DefaultDelegateInterceptor.java:92) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.delegate.DefaultDelegateInterceptor.handleInvocation(DefaultDelegateInterceptor.java:63) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        at org.camunda.bpm.engine.impl.el.JuelExpression.getValue(JuelExpression.java:60) ~[camunda-engine-7.18.0.jar!/:7.18.0]
        ... 102 common frames omitted

Your class name is lowercase at the beginning.

If adjusting this doesn’t solve it?

In your code, leave the class name with the first letter in uppercase, and in Camunda you don’t need to change it because it’s correct.

William Robert Alves

Thanks for the idea, but unfortunately it didn’t help to solve my problem :frowning:
Before that I also changed my pom.xml, I thought maybe that would help, but unfortunately that didn’t work either

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.myapp</groupId>
    <artifactId>camunda-sql-data-retrieval</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <!-- Spring Boot Starter Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.5.4</version>
        </dependency>

        <!-- Camunda BPM Spring Boot Starter -->
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter</artifactId>
            <version>7.18.0</version>
        </dependency>

        <!-- Camunda BPM Process Engine -->
        <dependency>
            <groupId>org.camunda.bpm</groupId>
            <artifactId>camunda-engine</artifactId>
            <version>7.18.0</version>
        </dependency>

        <!-- MS SQL Server JDBC Driver -->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <version>9.2.1.jre11</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- Spring Boot Maven Plugin -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>


Hi @AndrewFilippov,

you cannot deploy a process application that is build with the spring-boot-starter to the Camunda docker image 7.18.0, which contains a shared engine installed in Tomcat.

To run your application in a container, use the spring-boot way to create an image. (It is much simpler. The hard part is to decide for one of the various ways to build it: https://spring.io/guides/topicals/spring-boot-docker/)

You don’t need the Camunda image in your scenario.

Hope this helps, Ingo

You propose to build a new container where the JAR file will lie, am I correct?
Then I still have a question why the application cannot be run inside the container where Camunda itself is located…

Hi @AndrewFilippov,

we offer different approaches to create and install your process application, mostly for historical reasons.

The famous installation when we started with Camunda 7, before spring boot and docker was available, was the shared engine in Tomcat. It requires a special maven setup and deployment descriptors, as you can see here: Get started with Camunda and BPMN 2.0 | docs.camunda.org

We provided an early docker image for the base installation, the one you picked up.

Spring-Boot then changed the industry and new approaches to create the process application got available. They changed the underlying architecture as well. Nowadays, you don’t need to install the tomcat server on a production computer anymore.

This change of the architecture is difficult to see in the maven setup and with a lot of examples available on the internet it is very easy to mix them up. But mixing will result in issues as you are experiencing now.

Hope this helps, Ingo

I tried running my JAR file through the new container, but alas, I also got the same errors. during the run I encountered 2 types of errors and as I made changes to the dependencies, these errors alternated
1)

root@demo-dev:/opt/camunda/src/custom-lib# docker run -p 8888:8080 myorg/myapp
Exception in thread "main" java.lang.NoSuchMethodException: com.myapp.SqlDataRetrievalDelegate.main([Ljava.lang.String;)
        at java.base/java.lang.Class.getDeclaredMethod(Class.java:2675)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:47)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
  1. no main manifest attribute, in /app.jar

Here’s my Docker file:

FROM eclipse-temurin:17-jdk-alpine
VOLUME /tmp
COPY ./*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

I built the project using the “mvn clean install” command

Here’s my pom.xml now

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.myapp</groupId>
    <artifactId>camunda-sql-data-retrieval</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <!-- Spring Boot Starter Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.5.4</version>
        </dependency>

        <!-- Camunda BPM Spring Boot Starter -->
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter</artifactId>
            <version>7.18.0</version>
        </dependency>

        <!-- Camunda BPM Process Engine -->
        <dependency>
            <groupId>org.camunda.bpm</groupId>
            <artifactId>camunda-engine</artifactId>
            <version>7.18.0</version>
        </dependency>

        <!-- MS SQL Server JDBC Driver -->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <version>9.2.1.jre11</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- Maven Shade Plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.myapp.SqlDataRetrievalDelegate</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <!-- Spring Boot Maven Plugin -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

Hi @AndrewFilippov,

where do you use the maven-shade-plugin for?

From the stacktrace, I guess, that the Delegate class is the main class as well. If this is the case, I don’t know if it would work.

I usually create a simple main class like here: Setup a Spring Boot Project | docs.camunda.org and add the Delegates in Extra classes implementing the JavaDelegate interface.

I just checked this example: https://github.com/camunda/camunda-bpm-examples/tree/master/spring-boot-starter/example-twitter and build it with mvn clean spring-boot:build-image -Dspring-boot.build-image.imageName=camunda-7-twitter-spring-boot-example

The build worked out of the box with the given maven configuration.

I was able to start it with docker run -p 8080:8080 -t docker.io/library/camunda-7-twitter-spring-boot-example:latest.

Hope this helps, Ingo

Hi. I did as you suggested, now I see this situation.
The process still doesn’t work, it gives the same error as in the beginning.
I started a new container following the example you suggested and this is what I see, The container is not running in the background for some reason.
Here are my changes to the code:

package com.myapp;

import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Component;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Arrays;
import java.util.List;

@SpringBootApplication
@Component("sqlDataRetrievalDelegate")
public class sqlDataRetrievalDelegate implements JavaDelegate {

    public static void main(String[] args) {
        SpringApplication.run(sqlDataRetrievalDelegate.class, args);
    }

    @Override
    public void execute(DelegateExecution execution) {

Here are my changes to the pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.dpisarenko</groupId>
    <artifactId>basic-camunda-app</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>13</maven.compiler.source>
        <maven.compiler.target>13</maven.compiler.target>
        <camunda.spring-boot.version>7.18.0</camunda.spring-boot.version>
        <spring-boot.version>2.4.4</spring-boot.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
            <version>${camunda.spring-boot.version}</version>
        </dependency>
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
            <version>${camunda.spring-boot.version}</version>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.5</version>
        </dependency>
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <version>9.2.1.jre11</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <layout>ZIP</layout>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Here’s what I see in the terminal when I start the container with the

docker run -p 8888:8080 myorg/myapp -d

This was conflicting implementation.

Java delegates doesn’t require main method and annotations like @SpringBootApplication. Probably you need to refactor the code into 2 classes.

@EnableProcessApplication
@SpringBootApplication
public class WorkflowApplication {

    public static void main(String[] args) {
        SpringApplication.run(WorkflowApplication.class, args);
    }
}

And

@Component("sqlDataRetrievalDelegate")
public class SqlDataRetrievalDelegate implements JavaDelegate {

    @Override
    public void execute(DelegateExecution e){
       // implementation goes here
     }
}

I read that Camunda doesn’t require explicitly specifying main, but then I don’t have a project being built.

Is it best worth specifying in the notation?

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>com.example.MyApplication</mainClass> <!-- Replace with your main class -->
            </configuration>
        </plugin>
    </plugins>
</build>

Without it the project is not assembled in IDEA.

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.6.6:repackage (default) on project basic-camunda-app: Execution default of goal org.springframewo
rk.boot:spring-boot-maven-plugin:2.6.6:repackage failed: Unable to find main class -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException