sms+quartz多次重发短信

来源:互联网 发布:跟着李炎恢学php 编辑:程序博客网 时间:2024/06/05 10:02

定时短信总是重发,反反复复半个月试了很多种方案:

方案一

思路

检查逻辑,查看是否是因为一个用户报了同一学校不同分校的topic,获取到重复的userid,从而得到了相同的mobile,需要对手机号去重

操作

if(!strMobile.contains(userTopicInfoVoList.get(mobiles).getMobile())){mobile.append(userTopicInfoVoList.get(mobiles).getMobile()).append(",");}

结果

重发

方案二

思路

查看是否是因为quartz的间隔时间太短,导致一次遍历还没完成,还没有更新if_sms未已发送,下一次quartz又来了,又会查出来上次的内容

操作

增加quartz间隔

结果

重发

方法三

思路

quartz在某个时间点,比如说18:00:00执行,在这个点可能会执行多次quartz,直到时间变为18:00:01,停止执行

操作

加静态变量,让quartz只执行一次

Static int TIME=1;while(TIME==1){try{messageService.sendMessageToUser();LOG.info("定时任务发送短信|SmsTimer|executeInternal|params:No");}catch(Exceptione){LOG.error("定时任务发送短信|SmsTimer|executeInternal|params:error={}",e);}finally{TIME++;}

结果

重发

方法四

思路

并发问题,可能两个线程同时执行,A线程还有未time++操作,B线程进来发现time还是1,又进来一次,这个时候需要加锁

操作

privatefinalLocklock=newReentrantLock();//锁while(TIME==1){lock.lock();try{messageService.sendMessageToUser();LOG.info("定时任务发送短信|SmsTimer|executeInternal|params:No");}catch(Exceptione){LOG.error("定时任务发送短信|SmsTimer|executeInternal|params:error={}",e);}finally{TIME++;lock.unlock();}}

结果

重发

方法五

思路

tomcat执行了两次,告诉tomcat,在启动的时候加载webapps下的所有项目工程文件,又让tomcat再加载了一遍(一般情况下配置,主要是由于想域名访问时将工程名去掉的原因配置),这种情况下会导致工程中的quartz定时被两次触发,执行两次。

操作

  <Host/>里面的改成 autoDeploy="false" deployOnStartup="false" 这样就可以避免tomcat服务器中自启动导致quartz定时任务被触发两次。(当然还可以按需求修改,毕竟每个项目的需求都不尽相同。)

结果

不重发

1 0
原创粉丝点击