從0開始用kotlin作CRM之郵件系統--3使用xxljob來提高性能

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

先來回顧咱們的需求:多線程

  • 我有幾百個帳號須要收發件app

  • 我但願每次執行的郵箱地址固定this

  • 可擴展機器spa

xxljob文檔地址:www.xuxueli.com/xxl-job,請先根據文檔熟悉xxljob
我對xxkjob的理解:線程

  • 執行器:一組執行任務的進程。每一個進程就是任務的具體執行者
  • 任務:指定哪一個執行器,以什麼頻率,以什麼策略調度任務
  1. 分紅n個任務,配置在application-dev.yml中,餘數做爲分片任務的參數,like this : {"mailIdMod":2}code

  2. 當參數大於總數時,要從新計算一次 if(mailIdMod>n){mailIdMod=mailIdMod%n}隊列

  3. 查出全部的郵箱,並根據片數,計算出每片處理的郵箱範圍進程

  4. 而後當前線程,只處理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)
                }
            }
複製代碼
相關文章
相關標籤/搜索