为了账号安全,请及时绑定邮箱和手机立即绑定

关于java异步的问题。

关于java异步的问题。

ibeautiful 2019-05-23 17:46:52
有一张邮件表,存储三个字段:发送人,发送是否成功,发送内容在springmvc中有一个task,每5秒轮询一次这个表,查询出未发送成功的数据,并进行再次发送,发送成功后再更新表记录设置为发送成功。这里存在一个问题,如果第一次轮询发现有未发送成功的邮件并进行发送,但是在发送的过程中开始了5秒后的第二次轮询,由于第一次没发送完所以表记录还是未发生成功,这时候会造成发送重复邮件。请教有什么建议的解决方案吗?
查看完整描述

2 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

我说一个方案吧:再增加一个字段status字段标记当前邮件的处理状态,比如status=0未处理,status=1代表正在处理,status=2表示处理完成。每次轮询未发送的邮件WHEREstatus=0ANDisSend=false开始发送邮件更新status=1异步发送完成更新status=2
其实你这个问题的症结在于发送是否成功这个字段只能表达是/否两种场景
                            
查看完整回答
反对 回复 2019-05-23
?
智慧大石

TA贡献1946条经验 获得超3个赞

如果你使用的是0/5?这种表达式,并且发送右键是同步的(这里理解为可以拿到发送的结果),即使发送邮件超时也是没关系的,因为一个5秒执行不完的时候,会等到下一个周期才开始执行。例如最近五次的运行时间为
2018/1/717:32:45
2018/1/717:32:50
2018/1/717:32:55
2018/1/717:33:00
2018/1/717:33:05
如果在2018/1/717:32:45秒的任务到了2018/1/717:32:50还没有执行完成,将不会再触发2018/1/717:32:50的任务,而是等到2018/1/717:32:55的时候才会继续执行。
                            
查看完整回答
反对 回复 2019-05-23
  • 2 回答
  • 0 关注
  • 413 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信