【工作杂谈】后台定时任务问题

1. 场景

前景

微信端(经销商):发布工单后进入视频语音沟通页面,等待15s后工程师未接单,退出沟通页面。

后台工单管理(工程师):首次接单后,经销商不在线,就触发自动呼出功能,去打电话通知经销商进入沟通。

想要实现业务

当后台页面工程师接起工单时,需要系统每隔3分钟循环呼出电话(调用阿里云的语音通知服务)

2. 初步计划

代码:

this.timer = null; //全局设置了一个定时器,在经销商进入通话后,需要清除定时器,终止电话循环呼出

this.timer = setInterval(function(){
   
  // 呼出电话逻辑
}, 3 * 60 * 1000);

错误点:

因为是异步动作,当多个人去接单时,会有同时请求该接口的情况,全局设置定时器会出现变量污染,细想是不可行的,很危险。

3. 最终解决

  1. 增加一个phoneNotify(电话通知任务表),在触发以上情况的时候,就在表中添加一条呼出任务

    try {
         
        const {
          items: allUserData } = await account.list(handler),
          callUserInfo = _.find(allUserData, user => user._id === callUserId);
        let userPhone = '';
        if (isPhone(callUserInfo.id)) {
         
          userPhone = callUserInfo.id;
        } else if (isPhone(callUserInfo.phone)) {
         
          userPhone = callUserInfo.phone;
        }
    
        if (!userPhone) {
         
          throw new error.parameter.ParamError('该用户没有有效手机号,系统无法主动呼出去通知,请主动打电话通知。');
        }
        // 如果有该表单的呼出任务,就不重复呼出
        await isAlreadyHaveNotifyRecord(handler, orderId);
    
        // 第一步、没人沟通先打一次, 之后是每隔3分钟打一次
        log.debug('第一次系统自动呼出');
        await exports.callUserPhone(userPhone, callUserInfo.name);
        // 第二步、之后还要通知的话先加入phoneNotify, 让定时任务去打电话
        const data = {
         
          name 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值