Camunda邮件打印服务示例故障及步骤8执行疑问求助
Camunda邮件打印服务示例问题排查与解答
问题背景
你提到的Camunda官方邮件打印服务示例无法正常运行,还遇到了mail变量无法解析的错误,同时有两个疑问需要解答:运行说明第8点的详细解释,以及启动流程前发送邮件的渠道。先来看下你提供的报错日志:
01-Jun-2018 12:06:11.325 SEVERE [http-nio-8080-exec-3] org.camunda.commons.logging.BaseLogger.logError ENGINE-16004 Exception while closing command context: Unknown property used in expression: ${mail.getAttachments().isEmpty()}. Cause: Cannot resolve identifier 'mail' org.camunda.bpm.engine.ProcessEngineException: Unknown property used in expression: ${mail.getAttachments().isEmpty()}. Cause: Cannot resolve identifier 'mail' at org.camunda.bpm.engine.impl.el.JuelExpression.getValue(JuelExpression.java:60) at org.camunda.bpm.engine.impl.el.UelExpressionCondition.evaluate(UelExpressionCondition.java:47) at org.camunda.bpm.engine.impl.el.UelExpressionCondition.evaluate(UelExpressionCondition.java:42) at org.camunda.bpm.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior.doLeave(ExclusiveGatewayActivityBehavior.java:59) at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityLeave.execute(PvmAtomicOperationActivityLeave.java:52) at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityLeave.execute(PvmAtomicOperationActivityLeave.java:28) at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:91) at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:125) at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:104) at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:79) at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:618) at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:594) at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl$5.callback(PvmExecutionImpl.java:1897) at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl$5.callback(PvmExecutionImpl.java:1894) at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.continueExecutionIfNotCanceled(PvmExecutionImpl.java:1964) at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.dispatchDelayedEventsAndPerformOperation(PvmExecutionImpl.java:1913) at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.dispatchDelayedEventsAndPerformOperation(PvmExecutionImpl.java:1894) at org.camunda.bpm.engine.impl.bpmn.behavior.FlowNodeActivityBehavior.leave(FlowNodeActivityBehavior.java:48) at org.camunda.bpm.engine.impl.bpmn.behavior.FlowNodeActivityBehavior.execute(FlowNodeActivityBehavior.java:40) at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute$2.callback(PvmAtomicOperationActivityExecute.java:57) at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute$2.callback(PvmAtomicOperationActivityExecute.java:46) at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.continueIfExecutionDoesNotAffectNextOperation(PvmExecutionImpl.java:1958) at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute.execute(PvmAtomicOperationActivityExecute.java:38) at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute.execute(PvmAtomicOperationActivityExecute.java:27) at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:91) at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:125) at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:104) at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:79) at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:618) at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:594) at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl$5.callback(PvmExecutionImpl.java:1897) at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl$5.callback(PvmExecutionImpl.java:1894) at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.continueExecutionIfNotCanceled(PvmExecutionImpl.java:1964) at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.dispatchDelayedEventsAndPerformOperation(PvmExecutionImpl.java:1913) at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImp
这个错误的核心是流程执行时找不到名为mail的变量,而流程里的排他网关表达式${mail.getAttachments().isEmpty()}依赖这个变量,所以直接抛出了异常。下面针对你的疑问逐一解答:
一、运行说明第8点的详细解释
这个示例的核心逻辑是通过接收邮件自动触发流程实例启动,第8点要求“启动流程前发送邮件”的本质是:
- 你配置的Camunda邮件连接器会持续轮询指定的邮箱(IMAP/POP3协议)
- 当你发送一封邮件到这个监听邮箱后,连接器会捕获到这封新邮件,解析邮件的内容、附件、发件人等信息
- 接着连接器会自动创建一个流程实例,并把解析后的邮件对象以
mail为变量名注入到流程中,这样流程里的网关才能通过${mail.getAttachments().isEmpty()}判断邮件是否有附件,从而走不同的分支
简单来说,这一步是用邮件作为流程的触发信号,而不是手动去启动流程实例。
二、发送邮件的渠道
你需要把邮件发送到你在示例配置文件中指定的监听邮箱,具体步骤:
- 找到示例中的
mail-config.properties文件,里面会有类似如下配置项:
这里的mail.imap.host=your-imap-server mail.imap.port=993 mail.imap.username=your-monitor-email@xxx.com mail.imap.password=your-email-passwordmail.imap.username对应的邮箱就是你要发送邮件的目标邮箱。 - 用任意邮件客户端(比如Outlook、Gmail、Foxmail)或者通过代码发送邮件到这个邮箱,邮件可以带附件或者不带,用来测试流程的分支逻辑。
- 注意:发送邮件前要确保Camunda邮件服务已经启动,并且连接器处于正常轮询状态,这样才能及时捕获到新邮件并触发流程。
三、错误修复建议
针对你遇到的mail变量缺失错误,建议检查以下几点:
- 确认
mail-config.properties中的邮箱配置是否正确,是否能正常连接到IMAP/POP3服务器 - 检查邮件连接器的配置,确认是否开启了“邮件触发流程”的功能,并且是否正确将邮件对象注入为
mail变量 - 查看流程模型的启动事件,确认是“邮件启动事件”,或者连接器的逻辑是否正确关联到了流程定义
内容的提问来源于stack exchange,提问作者Monu Sharma
相关产品推荐
相关产品推荐

