Camunda Run如何通过Service Task查询数据库?Docker部署求助
解决Camunda Run添加数据库操作Service Task的三种方案
方案1:脚本任务直接执行数据库操作(无需额外代码)
Camunda Run支持在Service Task中用脚本语言直接操作数据库,无需自定义Java代码:
- 复用现有数据库连接
你的Docker Compose已经配置了PostgreSQL连接,Camunda Run会自动将数据源暴露为java:comp/env/jdbc/ProcessEngine,脚本可直接调用。 - 配置BPMN的Service Task
将Service Task的类型设为script,选择Groovy(语法简洁)作为脚本语言,示例代码:
注意:自定义表需要提前在PostgreSQL中创建,可以在PostgreSQL容器挂载初始化脚本// 获取Camunda内置数据源 def dataSource = new InitialContext().lookup("java:comp/env/jdbc/ProcessEngine") def sql = new groovy.sql.Sql(dataSource) // 执行插入操作 def insertSql = "INSERT INTO your_custom_table (column1, column2) VALUES (?, ?)" sql.execute(insertSql, ["test_val1", "test_val2"]) // 查询数据并写入流程变量 def result = sql.firstRow("SELECT * FROM your_custom_table WHERE column1 = ?", ["test_val1"]) execution.setVariable("db_result", result) sql.close()./init.sql:/docker-entrypoint-initdb.d/init.sql实现。 - 优化Docker Compose配置
用depends_on配合健康检查替代旧的links,确保数据库就绪后再启动Camunda:camunda: image: camunda/camunda-bpm-platform:run environment: - DB_DRIVER=org.postgresql.Driver - DB_URL=jdbc:postgresql://postgres:5432/camunda - DB_USERNAME=camunda - DB_PASSWORD=camunda depends_on: postgres: condition: service_healthy ports: - "8080:8080" restart: unless-stopped postgres: image: postgres:14 environment: - POSTGRES_USER=camunda - POSTGRES_PASSWORD=camunda - POSTGRES_DB=camunda volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql healthcheck: test: ["CMD-SHELL", "pg_isready -U camunda"] interval: 5s timeout: 5s retries: 5
方案2:用外部任务(External Task)转移逻辑到Spring Boot应用
把数据库操作逻辑放到你的第三个Spring Boot部署应用中,通过外部任务实现:
- 配置BPMN的Service Task
将Service Task类型设为external,指定topic名称(比如db_operation_topic)。 - 在Spring Boot中实现外部任务Worker
依赖Camunda Spring Boot Starter,添加代码:
这样Spring Boot应用会自动监听Camunda的外部任务,执行数据库操作,无需修改Camunda Run配置。@Component public class DatabaseTaskWorker implements ExternalTaskHandler { @Autowired private JdbcTemplate jdbcTemplate; @Override public void execute(ExternalTask externalTask, ExternalTaskService externalTaskService) { // 从流程变量获取参数 String param = externalTask.getVariable("db_param"); // 执行数据库操作 jdbcTemplate.update("INSERT INTO your_custom_table (column1) VALUES (?)", param); // 完成任务 externalTaskService.complete(externalTask); } } @Configuration public class ExternalTaskConfig { @Bean public ExternalTaskClient externalTaskClient() { return ExternalTaskClient.create() .baseUrl("http://camunda:8080/engine-rest") .asyncResponseTimeout(10000) .build(); } @Bean public Registration registration(ExternalTaskClient client, DatabaseTaskWorker worker) { return client.subscribe("db_operation_topic") .lockDuration(1000) .handler(worker) .open(); } }
方案3:扩展Camunda Run添加自定义Java Delegates(复杂场景)
如果必须用Java实现复杂逻辑,Camunda Run支持挂载自定义JAR扩展:
- 编写自定义Java Delegate
创建Maven项目,依赖对应版本的Camunda Engine,实现JavaDelegate:
打包成JAR文件。public class CustomDatabaseDelegate implements JavaDelegate { @Override public void execute(DelegateExecution execution) throws Exception { DataSource dataSource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ProcessEngine"); try (Connection conn = dataSource.getConnection()) { String sql = "INSERT INTO your_custom_table (column1) VALUES (?)"; try (PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setString(1, execution.getVariable("param").toString()); stmt.executeUpdate(); } } } } - 挂载JAR到Camunda Run容器
修改Docker Compose配置,将JAR挂载到Camunda Run的userlib目录:camunda: image: camunda/camunda-bpm-platform:run environment: - DB_DRIVER=org.postgresql.Driver - DB_URL=jdbc:postgresql://postgres:5432/camunda - DB_USERNAME=camunda - DB_PASSWORD=camunda depends_on: postgres: condition: service_healthy volumes: - ./custom-db-delegate.jar:/camunda/run/userlib/custom-db-delegate.jar ports: - "8080:8080" restart: unless-stopped - 配置BPMN的Service Task
将Service Task类型设为class,填写全类名(比如com.yourpackage.CustomDatabaseDelegate)。
内容的提问来源于stack exchange,提问作者user13237363
相关产品推荐
相关产品推荐

