从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)
                }
            }
复制代码
相关文章
相关标签/搜索