RPA任务提交
任务提交 taskCommit
1. 方法入口
- 注解说明
@PostMapping("/task/commit")
:HTTP POST 请求映射,接收任务提交请求。@Validated(Insert.class)
:基于分组校验规则对RpaCommitDTO
进行参数校验。@RequestBody
:绑定请求体中的 JSON 数据到RpaCommitDTO
对象。 - 参数:
rpaCommitDTO
:任务提交的请求参数(如应用编码、提交人、文件地址等)。httpServletRequest
:用于获取请求头中的appKey
。
- 返回值:
AjaxResult
统一响应结构(包含任务ID或错误信息)。
2. 动态设置 AppCode
reSetAppCode(rpaCommitDTO); |
- 动作:根据策略表动态修改
rpaCommitDTO
中的appCode
。 - 目的:实现灵活的业务路由(例如灰度发布或环境切换)。
3. 特殊业务路由
// 长春1.0特殊处理 |
- 路由逻辑:
- 长春1.0:若
appCode
匹配预设枚举值,走独立的老版本逻辑。 - 社保士兵任务:若
appCode
以特定前缀开头,执行专用分支。
- 长春1.0:若
- 特点:通过
appCode
实现业务解耦,分离新旧版本逻辑。
4. 通用流程处理
4.1 查询应用信息
RpaApp rpaApp = rpaAppMapper.selectByAppCode(rpaCommitDTO.getAppCode()); |
- 动作:根据
appCode
查询RpaApp
表,校验应用是否存在。 - 异常处理:应用不存在时直接返回错误。
4.2 验证缴纳账号
Integer accountId = rpaPaymentAccountMapper.selectAccountIdByNameAndAppId( |
- 动作:根据账号名称和应用ID查询缴纳账号ID。
- 目的:确保任务绑定的账号有效。
4.3 构建任务业务对象
RpaTaskBO rpaTaskBO = new RpaTaskBO(); |
- 目的:将 DTO 转换为业务对象,传递策略执行所需参数。
4.4 确定运行节点
// 1. 优先查询指定节点关系(按应用+账号) |
- 策略:
- 高优先级:按应用和账号精确绑定节点。
- 低优先级:按应用绑定默认节点。
- 目的:动态分配任务执行节点,支持多租户隔离。
4.5 策略模式生成任务
RpaTask rpaTask = BizStrategyFactory |
- 动作:通过工厂模式根据
businessStrategy
字段选择具体策略类,生成任务实体。 - 扩展性:支持不同业务类型(如社保增减员、税务申报)的任务差异化处理。
4.6 任务持久化
// 设置任务基础属性 |
- 关键字段:
transactionNo
:全局唯一任务流水号。appKey
:标识调用方身份,用于权限控制。
4.7 发送超时检查消息
producer.send(TopicConstant.RPA_LONG_TIME_WAIT_TASK, rpaTask.getId(), 16); |
- 动作:向消息队列发送延迟消息(如 16 分钟)。
- 目的:若任务长时间未执行,触发超时告警或补偿机制。
4.8 触发任务推送
SpringUtils.getBean(this.getClass()).pushTask(rpaTask.getId()); |
- 实现:通过 Spring 工具类获取代理对象,调用异步方法
pushTask
。 - 作用:立即触发任务调度,寻找可用客户端节点执行任务。
4.9 保存推送记录
Long recordId = saveSendRecord( |
- 隐含逻辑:记录任务派发日志,用于后续审计或对账。
4.10 更新统计信息
dataAnalyseService.updateDataAnalyseDailyServiceNum(rpaCommitDTO.getSubmitter()); |
- 业务意义:统计每日服务人数,支持运营数据分析。
推送任务 pushTask (核心)
1. 方法入口
- 注解说明
@Async
:异步执行,任务推送操作不会阻塞主线程。@Transactional
:事务管理,确保数据库操作原子性(需注意异步线程的事务传播)。 - 参数:
taskId
任务唯一标识。
2. 任务状态校验
RpaTaskVO rpaTaskVO = rpaTaskMapper.selectRpaTaskById(taskId); |
- 动作:通过任务ID查询任务详情,检查是否为「等待执行」状态。
- 目的:仅处理待执行任务,避免重复调度。
3. 获取可用客户端节点
List<RpaNodeVO> clients = getExecuteTaskClientIds(rpaTaskVO); |
- 动作:调用
getExecuteTaskClientIds
方法,根据任务属性(如应用类型、牌照等)筛选符合条件的客户端节点。 - 典型实现:可能基于任务绑定的运行节点配置或默认策略选择节点。
4. 客户端在线状态过滤
List<RpaNodeVO> onlineRpaNodes = clients.stream() |
- 动作:过滤出在线状态的客户端节点。
- 目的:确保任务仅派发到活跃节点,避免无效调度。
5. 选择空闲客户端
Optional<RpaNodeVO> first = onlineRpaNodes.stream() |
- 动作:选择第一个「非繁忙」状态的在线节点。
- 策略特点:简单但可能不均衡,适合低并发场景。
6. 客户端繁忙处理
if (!first.isPresent()) { |
- 动作:若无可用节点,记录日志并退出,依赖客户端主动拉取任务。
- 优势:避免频繁轮询,减少服务端压力。
7. 策略执行与任务派发
RpaApp rpaApp = rpaAppMapper.selectByAppCode(rpaTaskVO.getAppCode()); |
- 关键步骤:
- 查询应用配置:获取任务关联的应用策略。
- 策略模式:通过工厂生成具体策略,动态生成执行参数(如URL、表单数据等)。
- 任务派发:调用
executeTask
方法(可能通过RPC或消息队列)触发客户端执行。
8. 任务状态更新
if (isOk) { |
- 动作:若派发成功,更新任务状态为「调度中」并记录执行节点。
- 事务性:依托
@Transactional
确保数据一致性。
9. 异常场景通知
// 客户端不在线 |
- 动作:通过邮件、站内信等方式通知提交者任务异常状态。
- 用户体验:明确反馈问题原因,减少用户困惑。
流程总结
- 状态校验 → 2. 节点筛选 → 3. 在线检查 → 4. 空闲选择 → 5. 策略执行 → 6. 任务派发 → 7. 状态更新
- 分支处理:涵盖客户端离线、繁忙、节点不可用等异常场景,保证流程健壮性。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Yomigaeri的博客!