activiti实战七(通过监听器发邮件)

1、使用spring的邮件封装类

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host">
<value>xxxcom</value>
</property>
<property name="port">
<value>25</value>
</property>
<property name="protocol" value="smtp"/>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.timeout">25000</prop>
</props>
</property>
<property name="username">
<value>xxx</value> <!-- 发送者用户名 -->
</property>
<property name="password">
<value>xxx</value> <!-- 发送者密码 -->
</property>
</bean>

2、在<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">中添加属性

<property name="eventListeners">
<list>
<bean
class="xxx.activitimgmt.activitideploy.listeners.MyEventListener">
</bean>
</list>
</property>

3、创建监听器,实现ActivitiEventListener接口

public class MyEventListener implements ActivitiEventListener {

@Autowired
private MailWrapper mailWrapper;//用于发邮件的类

@Override
public void onEvent(ActivitiEvent event) {
// System.out.println("Event received: " + event.getType());
if (event.getType() == ActivitiEventType.TASK_CREATED) {// 任务创建,当流程走到一个任务节点时,会进入这个条件
ActivitiEntityEvent entityEvent = (ActivitiEntityEvent) event;
TaskEntity taskEntity = (TaskEntity) entityEvent.getEntity();
// taskEntity.getAssignee(),它是ID
Set<IdentityLink> candidates = taskEntity.getCandidates();//这个是获取候选的
for (IdentityLink identityLink : candidates) {
System.out.println(identityLink.getGroupId());// 根据identityLink.getGroupId(),这个GroupId就是流程图中activiti:candidateGroups对应的值。用它可以查询 该组的所有用户,然后发邮件,让其去审批。

}
}
if (event.getType() == ActivitiEventType.TASK_ASSIGNED) {// 任务认领,按照谁先登录谁先认领的原则,认领后会给该认领的用户发邮件
ActivitiEntityEvent entityEvent = (ActivitiEntityEvent) event;
TaskEntity taskEntity = (TaskEntity) entityEvent.getEntity();//认领后我们主要用taskEntity.getAssignee()来查询当前用户信息,并发邮件
mailWrapper.sendTaskMail(taskEntity.getOwner(), taskEntity.getAssignee(), taskEntity.getName(),
event.getType());
}

if (event.getType() == ActivitiEventType.TASK_COMPLETED) {//审批完成,首先会进入下一节点,并给下一节点的用户发邮件,之后会通过历史流程去找到流程发起者,并将审批信息通过邮件发送给发起者。这里要注意,该类不能注入historyService,因为它先于historyService存在,必须通过entityEvent.getEngineServices();去获取。
ActivitiEntityEvent entityEvent = (ActivitiEntityEvent) event;


TaskEntity taskEntity = (TaskEntity) entityEvent.getEntity();// 这个任务是当前做完的任务,可以理解为历史任务了
EngineServices engineServices = entityEvent.getEngineServices();
HistoryService historyService = engineServices.getHistoryService();
TaskService taskService = engineServices.getTaskService();
ProcessInstance processInstance = taskEntity.getProcessInstance();
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstance.getId()).singleResult();//根据流程ID获取历史流程
String startUserId = historicProcessInstance.getStartUserId();//获取流程的发起人
List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processInstance.getId()).list();//获取历史历史流程的所有任务,包括下一节点的任务,不包括下下节点的任务
String message = "";
String userId = "";
for (HistoricTaskInstance historicTaskInstance : list) {
if (historicTaskInstance.getId().equals(taskEntity.getId())) {//找出和当前完成任务ID一致的历史任务,并从中获取审批信息
List<Comment> taskComments = taskService.getTaskComments(historicTaskInstance.getId());
for (Comment comment : taskComments) {
message = comment.getFullMessage();// 审批信息
userId = comment.getUserId();// 审批人
}
}
}
mailWrapper.sendTaskMail(message, startUserId, userId, event.getType());//不要太在意这个方法,随便写的
}

}

@Override
public boolean isFailOnException() {
return true;//true表示打印错误信息,并抛异常,否则任务会往下执行
}
}

MailWrapper中主要还是

@Autowired
private MailSender mailSender;

public void sendTaskMail(String xxx, String assignee, String xxx, ActivitiEventType eventType) {

SimpleMailMessage msg = new SimpleMailMessage();
String toEmailAddress = "
xxx@xxx.com";

msg.setSubject("hello world");
msg.setTo(toEmailAddress);
msg.setText(userName + "," + xxx+ ",来自" + userName2 + "的审批");
msg.setFrom("xxx2@xxxcom");

try {
mailSender.send(msg);
} catch (MailException e) {
e.printStackTrace();
}

}

当然我们可以使用邮件模板velocity来做

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "Activiti 实战 pdf" 是一本介绍Activiti流程引擎实战的电子书。该书主要介绍了Activiti的架构、流程设计、流程部署、活动和事件处理、任务管理、用户管理、历史记录、定时任务等内容。通过该书的学习,读者可以了解Activiti的基本原理,掌握Activiti的基本使用方法,在实际项目中使用Activiti开发高效、可靠的业务流程应用。 Activiti是一个开源的BPM流程引擎,它实现了BPMN 2.0规范,并提供了基于Java和Spring的API和服务。Activiti可以方便地与各种应用和平台集成,例如Spring、Spring Boot、Camunda、Drools、MuleSoft等。Activiti被广泛应用于企业级业务流程管理、工作流、电子商务、人力资源、金融等领域。 该书的作者是Tijs Rademakers、Ronald van Luttikhuizen、Jos Dirksen等人,他们是Activiti架构师和专家。该书除了提供详尽的文档和指导外,还包含了一些实践案例和示例代码,可以帮助读者更好地理解和运用Activiti。无论是初学者还是有经验的开发者,都可以从该书中获得收益,它是一本不可多得的Activiti学习资源。 ### 回答2: Activiti 实战 PDF 是一本关于 Activiti 工作流引擎的实践指南书籍,该书适合对工作流引擎有一定了解并希望使用 Activiti 实现工作流的开发人员和架构师阅读。 该书主要涵盖了 Activiti 的基本概念和使用方法,包括工作流引擎的基础知识、流程定义和流程实例的创建、流程图的绘制、任务分配和处理、流程监控和报表等。 这本书通过丰富的实例代码和图示,展示了 Activiti 在实际项目中的应用场景,并详细介绍了如何配置和使用 Activiti,如如何在 Java 代码中使用 Activiti API,如何使用 Spring 集成 Activiti 等。 此外,该书还包含了一些高级的话题,如如何自定义 Activiti 服务、如何在 Activiti 中使用规则引擎和消息中间件等,这些内容对于需要深入了解 Activiti 的开发人员来说具有很大的价值。 总之,Activiti 实战 PDF 对于掌握 Activiti 工作流引擎的开发人员和架构师来说是一本非常实用的实践指南,它不仅能够帮助读者掌握 Activiti 的基本概念和使用方法,还能够帮助他们实现更加复杂的工作流场景。 ### 回答3: Activiti 实战 PDF 是一本关于 Activiti 工作流引擎的实战指南,主要面向开发者和系统管理员,并以实际案例为基础,介绍了 Activiti 的核心概念、基本流程的构建以及高级特性等内容。 本书由熟悉 Activiti 的领域专家撰写,详细介绍了 Activiti 的工作原理、配置和使用方式。其中涵盖了多种流程设计方法,包括界面设计、BPMN 规范和 XML 定义等,并结合实际案例演示了如何使用 Activiti 构建自定义流程应用。 此外,本书还阐述了 Activiti 中的用户、任务、表单、数据和事件等概念,以及如何使用 Activiti Explorer 管理和监控流程的运行与执行情况。最后,本书还介绍了使用 Activiti 进行流程自动化部署、管理与维护的技巧和方法。 总的来说,Activiti 实战 PDF 为初学者和高级用户提供了深入学习 Activiti 工作流引擎的最佳实践方法,帮助用户将其应用于实际开发项目中,提高工作效率和流程管理的可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值