Flowable-ui 6.6.0 all-in-one and custom spring app

Hi,

I recently created a Spring Boot application with Flowable 6.6.0, and in a docker-compose.yml, I started a Postgres DB and flowable-ui.

Before release 6.6.0, it was possible to prevent flowable-task from picking up tasks by disabling the async executor via these properties:

flowable.process.async.executor.enabled=false
flowable.cmmn.async.executor.enabled=false

However, even though I have set them up, I still see in the logs the following line:

2021-03-15 16:22:07.821 INFO 1 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'

And, flowable-task is still picking up tasks.

Analyzing flowable-ui’s image flowable-default.properties, I noticed these properties:

#
# Default Task Executor (will be used for @Async)
#
spring.task.execution.pool.core-size=2
spring.task.execution.pool.max-size=50
spring.task.execution.pool.queue-capacity=10000
spring.task.execution.thread-name-prefix=flowable-ui-task-Executor-

#
# Task scheduling
#
spring.task.scheduling.pool.size=5

Is there a way to disable this task executor?

Many thanks in advance.

Hi,

This can be done with flowable.async-executor-activate=false.

See the docs for a complete reference; (section configuration)

Regards,

Yvo

Hi @yvo

Thank you very much for you fast reply.

I have added the property you comment, and in the log files, I still see the ‘applicationTaskExecutor’ being initialized.

``2021-03-16 08:06:21.921 INFO 1 — [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService ‘applicationTaskExecutor’.`

For sure I am missing something but I cannot figure it out.

Here is my docker-compose.yml file.

version: '3.7'
services:

  flowable-db:
    image: postgres:12.3
    ports:
      - 5432:5432
    volumes:
      - data_db_test:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=flowable-db
      - POSTGRES_USER=flowable
      - POSTGRES_PASSWORD=flowable
    networks:
      - test-network

  flowable-ui-app:
    image: flowable/flowable-ui
    depends_on:
      - flowable-db
    environment:
      - SERVER_PORT=8080
      - SPRING_DATASOURCE_DRIVER-CLASS-NAME=org.postgresql.Driver
      - SPRING_DATASOURCE_URL=jdbc:postgresql://flowable-db:5432/flowable-db
      - SPRING_DATASOURCE_USERNAME=flowable
      - SPRING_DATASOURCE_PASSWORD=flowable
      - FLOWABLE_COMMON_APP_IDM-ADMIN_USER=admin
      - FLOWABLE_COMMON_APP_IDM-ADMIN_PASSWORD=test
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_PROCESS_SERVER-ADDRESS=http://host.docker.internal
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_PROCESS_PORT=8090
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_PROCESS_CONTEXT-ROOT=/
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_PROCESS_REST-ROOT=process-api
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CMMN_SERVER-ADDRESS=http://host.docker.internal
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CMMN_PORT=8090
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CMMN_CONTEXT-ROOT=/
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CMMN_REST-ROOT=cmmn-api
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_DMN_SERVER-ADDRESS=http://host.docker.internal
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_DMN_PORT=8090
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_DMN_CONTEXT-ROOT=/
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_DMN_REST-ROOT=dmn-api
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_FORM_SERVER-ADDRESS=http://host.docker.internal
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_FORM_PORT=8090
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_FORM_CONTEXT-ROOT=/
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_FORM_REST-ROOT=form-api
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CONTENT_SERVER-ADDRESS=http://host.docker.internal
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CONTENT_PORT=8090
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CONTENT_CONTEXT-ROOT=/
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_CONTENT_REST-ROOT=content-api
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_APP_SERVER-ADDRESS=http://host.docker.internal
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_APP_PORT=8090
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_APP_CONTEXT-ROOT=/
      - FLOWABLE_ADMIN_APP_SERVER-CONFIG_APP_REST-ROOT=app-api
      - FLOWABLE_TASK_APP_KAFKA-ENABLED=false
      - FLOWABLE_TASK_APP_REST-ENABLED=false
      - FLOWABLE_PROCESS_ASYNC_EXECUTOR_ENABLED=false
      - FLOWABLE_CMMN_ASYNC_EXECUTOR_ENABLED=false
      - FLOWABLE_ASYNC-EXECUTOR-ACTIVATE=false
      - FLOWABLE_EXPERIMENTAL_DEBUGGER_ENABLED=true
    ports:
      - 8091:8080
    networks:
      - test-network
    entrypoint: ["./wait-for-something.sh", "flowable-db", "5432", "PostgreSQL", "/flowable-entrypoint.sh"]

  mailhog:
    image: mailhog/mailhog
    ports:
      - 1025:1025
      - 8025:8025
    networks:
      - test-network

volumes:
  data_db_test:

networks:
  test-network:

I am testing a dummy BPMN workflow which only executes a custom delegate. And since the ‘applicationTaskExecutor’ is picking up the jobs, it is throwing this error:

2021-03-16 08:47:25.189 ERROR 1 --- [io-8080-exec-10] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [/flowable-ui] threw exception [Request processing failed; nested exception is org.flowable.common.engine.api.FlowableException: Unknown property used in expression: ${dummyBpmnDelegate}] with root cause

org.flowable.common.engine.impl.javax.el.PropertyNotFoundException: Cannot resolve identifier 'dummyBpmnDelegate'

Here is the BPMN:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef">
  <process id="dummyBpmnProcessV1" name="Dummy BPMN Process v1" isExecutable="true">
    <startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
    <sequenceFlow id="sid-F49FE376-A49E-4136-8591-31CA504186F5" sourceRef="startEvent1" targetRef="sid-3C62C4AC-8702-455C-BAB4-C5EDC39AB4F1"></sequenceFlow>
    <serviceTask id="sid-3C62C4AC-8702-455C-BAB4-C5EDC39AB4F1" name="Dummy Bpmn Delegate" flowable:delegateExpression="${dummyBpmnDelegate}"></serviceTask>
    <endEvent id="sid-A07555EB-15E6-4FB2-BB01-4D7BD223163E"></endEvent>
    <sequenceFlow id="sid-37933849-81D8-43BD-A5B3-E4AAE4F44F79" sourceRef="sid-3C62C4AC-8702-455C-BAB4-C5EDC39AB4F1" targetRef="sid-A07555EB-15E6-4FB2-BB01-4D7BD223163E"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_dummyBpmnProcessV1">
    <bpmndi:BPMNPlane bpmnElement="dummyBpmnProcessV1" id="BPMNPlane_dummyBpmnProcessV1">
      <bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
        <omgdc:Bounds height="30.0" width="30.0" x="100.0" y="163.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-3C62C4AC-8702-455C-BAB4-C5EDC39AB4F1" id="BPMNShape_sid-3C62C4AC-8702-455C-BAB4-C5EDC39AB4F1">
        <omgdc:Bounds height="80.0" width="100.0" x="175.0" y="138.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-A07555EB-15E6-4FB2-BB01-4D7BD223163E" id="BPMNShape_sid-A07555EB-15E6-4FB2-BB01-4D7BD223163E">
        <omgdc:Bounds height="28.0" width="28.0" x="320.0" y="164.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="sid-F49FE376-A49E-4136-8591-31CA504186F5" id="BPMNEdge_sid-F49FE376-A49E-4136-8591-31CA504186F5">
        <omgdi:waypoint x="129.9499984899576" y="178.0"></omgdi:waypoint>
        <omgdi:waypoint x="174.9999999999917" y="178.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-37933849-81D8-43BD-A5B3-E4AAE4F44F79" id="BPMNEdge_sid-37933849-81D8-43BD-A5B3-E4AAE4F44F79">
        <omgdi:waypoint x="274.95000000000005" y="178.0"></omgdi:waypoint>
        <omgdi:waypoint x="320.0" y="178.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

And finally, here is the delegate used in the service task:

@Service("dummyBpmnDelegate")
@Scope("prototype")
@Slf4j
public class DummyBpmnDelegate implements JavaDelegate {
    
    @Override
    public void execute(DelegateExecution execution) {
        log.info("Dummy BPMN Delegate");
    }
}

Once again, thank you very much for the help.

Looking at it quickly it seems as your service task isn’t marked as async.
Can you verify this?

Yes. That is correct.

And if I mark it as async, my custom Spring App picks up the task.

The same thing happens with a Task Listener. Although, I have not test it by marking the user task as async.

Many thanks for you help @yvo