在 Activiti(以及其后续版本 Activiti 7 或 Camunda)中,“消息推送”通常指的是工作流引擎在特定节点(如用户任务、服务任务)完成或触发时,通知外部系统或用户。
由于 Activiti 本身是一个工作流引擎,它主要负责流程实例的状态流转,并不内置即时通讯(IM)或邮件发送功能,消息推送通常通过以下几种方式实现:
常见推送场景
- 任务分配通知:当任务分配给某个用户时,通知该用户。
- 任务完成通知:当任务完成后,通知下一节点的处理人或相关角色。
- 流程实例状态变更通知:如流程启动、挂起、结束等。
- 超时提醒:任务即将超时或已超时,提醒处理人。
实现方式
方式 1:使用 Activiti 的事件监听器(EventListener)
Activiti 提供了多种事件监听机制,可以在特定事件发生时触发自定义逻辑。
1 全局事件监听器(ProcessEngineConfiguration)
在 activiti.cfg.xml 或 Spring 配置中注册全局监听器:
<property name="eventListeners">
<list>
<bean class="com.example.MyTaskListener"/>
</list>
</property> 2 节点级监听器(BPMN 模型中配置)
在 BPMN 2.0 文件中为特定任务节点添加监听器:
<userTask id="task1" name="审批任务">
<extensionElements>
<activiti:taskListener event="create" class="com.example.TaskCreateListener"/>
</extensionElements>
</userTask> 3 Java 监听器实现示例
public class TaskCreateListener implements TaskListener { @Override public void notify(DelegateTask delegateTask) { String assignee = delegateTask.getAssignee(); String taskId = delegateTask.getId(); String taskName = delegateTask.getName(); // 调用推送服务(如邮件、短信、WebSocket 等) pushNotificationService.send(assignee, "您有一个新任务:" + taskName); } }
方式 2:使用 Spring 事件机制(推荐)
在 Spring Boot + Activiti 项目中,可以监听 Activiti 发布的 Spring 事件:
1 启用 Spring 事件监听
@Component
public class ActivitiEventListener implements ApplicationListener<ActivitiEvent> {
@Override
public void onApplicationEvent(ActivitiEvent event) {
if (event.getType() == ActivitiEventType.TASK_CREATED) {
ActivitiEntityEventImpl entityEvent = (ActivitiEntityEventImpl) event;
Task task = (Task) entityEvent.getEntity();
String assignee = task.getAssignee();
String taskName = task.getName();
// 推送通知
pushNotificationService.send(assignee, "新任务:" + taskName);
}
}
} 注意:需要在
activiti.cfg.xml或 Spring 配置中启用 Spring 事件监听器:<property name="eventListeners"> <list> <bean class="org.activiti.engine.impl.spring.SpringEventListener"/> </list> </property>
方式 3:使用 Webhook 或 REST API 回调
Activiti 提供了 REST API,你可以:
- 在外部系统中监听 Activiti 的 REST 回调(Activiti 版本支持)。
- 或者在 Activiti 的监听器中调用外部系统的 Webhook 接口,由外部系统负责推送。

public class WebhookTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
String url = "http://your-push-service.com/webhook";
Map<String, Object> payload = new HashMap<>();
payload.put("taskId", delegateTask.getId());
payload.put("assignee", delegateTask.getAssignee());
payload.put("taskName", delegateTask.getName());
// 使用 RestTemplate 或 HttpClient 发送 POST 请求
restTemplate.postForObject(url, payload, String.class);
}
} 方式 4:结合消息中间件(RabbitMQ / Kafka)
对于高并发或分布式系统,推荐将推送逻辑解耦:
- Activiti 监听器发布消息到 MQ。
- 专门的推送服务消费 MQ 消息,负责发送邮件、短信、WebSocket 推送等。
public class MqTaskListener implements TaskListener {
@Autowired
private RabbitTemplate rabbitTemplate;
@Override
public void notify(DelegateTask delegateTask) {
TaskMessage message = new TaskMessage(
delegateTask.getId(),
delegateTask.getAssignee(),
delegateTask.getName()
);
rabbitTemplate.convertAndSend("task.exchange", "task.created", message);
}
} 推送渠道实现示例
邮件推送
public void sendEmail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(to);
message.setSubject(subject);
message.setText(content);
javaMailSender.send(message);
} WebSocket 实时推送(前端)
- 后端通过 WebSocket 向特定用户推送任务通知。
- 前端监听 WebSocket 消息,弹出提示。

短信推送
调用第三方短信 API(如简米云、酷番云短信服务)。
企业微信/钉钉/飞书机器人
通过 Webhook 调用企业 IM 的机器人接口。
最佳实践建议
| 建议 | 说明 |
|---|---|
| 异步处理 | 推送逻辑应异步执行,避免阻塞流程引擎。 |
| 重试机制 | 推送失败时应具备重试或补偿机制。 |
| 解耦设计 | 将推送逻辑与流程引擎解耦,便于维护和扩展。 |
| 日志记录 | 记录推送成功/失败日志,便于排查问题。 |
| 用户偏好设置 | 支持用户自定义通知方式(邮件、短信、站内信等)。 |
| 方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 事件监听器 | 简单场景 | 实现简单 | 耦合度高 |
| Spring 事件 | Spring 项目 | 与 Spring 集成好 | 需配置事件监听 |
| Webhook/REST | 外部系统集成 | 灵活 | 需维护外部服务 |
| 消息中间件 | 高并发/分布式 | 解耦、可扩展 | 架构复杂 |
根据你的系统架构和需求,选择最适合的方案,如果是简单项目,使用事件监听器 + 邮件/站内信即可;如果是大型分布式系统,建议采用消息中间件 + 独立推送服务的架构。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!

发表回复