前期已完成了單機版的項目,幾個帳號還能對付,可是若是有幾百個帳號,就抓瞎了。
那可不能夠用多線程+隊列呢?感受多線程+隊列,應該能對付幾十個帳號。可是好比說我想增長臺機器來處理呢?因此,最終選了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)
}
}
複製代碼