You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Camunda中限制邮件发送任务并发执行(无需外部同步)

限制Camunda邮件Delegate并发执行的简便方案

嘿,这个需求其实不用折腾复杂的外部同步机制,Camunda本身或者简单的Java代码就能搞定,给你两个实用的方案:

方案一:Java Semaphore(单节点场景首选)

如果你的Camunda是单节点部署,直接在Delegate类里用Java的Semaphore就能轻松限制并发数,代码改动极小:

import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import java.util.concurrent.Semaphore;

public class EmailSenderDelegate implements JavaDelegate {
    // 定义信号量,允许最多25个并发执行
    private static final Semaphore SEMAPHORE = new Semaphore(25);

    @Override
    public void execute(DelegateExecution execution) throws Exception {
        SEMAPHORE.acquire(); // 获取执行许可,无许可则等待
        try {
            // 这里编写你的邮件发送逻辑
            System.out.println("正在发送邮件,当前并发数:" + (25 - SEMAPHORE.availablePermits()));
        } finally {
            SEMAPHORE.release(); // 无论执行成功失败,都要释放许可
        }
    }
}

这个方案的优点是零配置、代码侵入少,完全不需要修改Camunda引擎配置,适合单节点场景。但要注意:如果是多节点集群部署,每个节点都会有独立的Semaphore,总并发数会是25乘以节点数,这种场景就不适用了。

方案二:Camunda Job Executor配置(集群场景首选)

如果是多节点集群环境,就得用Camunda内置的Job Executor来做全局并发控制,步骤如下:

  1. 标记任务为异步并指定专属Topic:在BPMN模型里给邮件任务添加camunda:asyncBefore="true",同时设置专属Topic,比如camunda:topic="email-sender"。这样该任务会被Job Executor接管执行。

  2. 配置Topic的并发限制
    如果是Spring Boot项目,直接在application.yml中添加配置:

    camunda.bpm.job-execution:
      job-acquisitions:
        default:
          topics:
            - name: email-sender
              max-parallel-jobs: 25  # 限制该Topic的最大并发数为25
              max-jobs-per-acquisition: 25  # 每次获取的任务数不超过25
    

    如果是传统XML配置,可在processes.xml中调整:

    <job-executor>
      <job-acquisition name="default">
        <properties>
          <property name="maxJobsPerAcquisition">25</property>
          <property name="maxParallelJobs">25</property>
        </properties>
        <topic name="email-sender" maxJobsPerAcquisition="25" maxParallelJobs="25" />
      </job-acquisition>
    </job-executor>
    

这个方案是集群层面的全局控制,不管有多少个节点,整个集群里该邮件任务最多只会有25个并发执行,完美适配分布式场景。而且不需要修改Delegate代码,仅需调整配置和BPMN模型。

额外提醒

  • 如果你的邮件任务是同步执行的,方案一的Semaphore仍然适用,但方案二需要先将任务改为异步(因为Job Executor只处理异步任务)。
  • 无论用哪个方案,都要确保邮件发送逻辑本身是线程安全的,避免并发带来的潜在问题。

内容的提问来源于stack exchange,提问作者user140547

火山引擎 最新活动