前期已完成了单机版的项目,几个帐号还能对付,可是若是有几百个帐号,就抓瞎了。
那可不能够用多线程+队列呢?感受多线程+队列,应该能对付几十个帐号。可是好比说我想增长台机器来处理呢?因此,最终选了xxl-job
bash
先来回顾咱们的需求:多线程
我有几百个帐号须要收发件app
我但愿每次执行的邮箱地址固定this
可扩展机器spa
xxljob文档地址:www.xuxueli.com/xxl-job,请先根据文档熟悉xxljob
我对xxkjob的理解:线程
分红n个任务,配置在application-dev.yml中,余数做为分片任务的参数,like this : {"mailIdMod":2}code
当参数大于总数时,要从新计算一次 if(mailIdMod>n){mailIdMod=mailIdMod%n}队列
查出全部的邮箱,并根据片数,计算出每片处理的邮箱范围进程
而后当前线程,只处理id余数为mailIdMod的任务文档
var shardingVO = ShardingUtil.getShardingVo()
// 查出全部的邮箱
var mailboxs = mailShopService.list()
var mailCount = mailboxs.size
var per = mailCount / shardingVO.total //每一个片要处理的邮箱数
for (i in 0 until shardingVO.total) {
//开始分片
if (i == shardingVO.index) {
XxlJobLogger.log("第 {} 片, 命中分片开始处理", i)
var startindex = i * per //开始值
//结束值
var end = if (i == shardingVO.total - 1) {
max((i + 1) * per, mailCount)
} else {
(i + 1) * per
}
//过滤未删除的,且生效的,且只处理id为 taskcount余数与mailid同样的
mailboxs.subList(startindex, end).filter {
it.id % tasksCount == mailids.mailIdMod && it.deletedAt == null && it.mailStatus == 1
}.forEach {
it.lastInfo = mailLastInfoService.getLastInfo(MAIL_INBOX_TYPE, it.id)
it.junkOne = mailLastInfoService.getLastInfo(MAIL_JUNK_TYPE, it.id)
mailInboxService.startReceive(it)
}
} else {
XxlJobLogger.log("第 {} 片, 忽略", i)
}
}
复制代码