从0开始用kotlin做CRM之邮件系统--3使用xxljob来提升性能

707 阅读1分钟

前期已完成了单机版的项目,几个账号还能对付,但是如果有几百个账号,就抓瞎了。
那可不可以用多线程+队列呢?感觉多线程+队列,应该能对付几十个账号。但是比如说我想增加台机器来处理呢?所以,最终选了xxl-job

先来回顾我们的需求:

  • 我有几百个账号需要收发件

  • 我希望每次执行的邮箱地址固定

  • 可扩展机器

xxljob文档地址:www.xuxueli.com/xxl-job,请先根据文档熟悉xxljob
我对xxkjob的理解:

  • 执行器:一组执行任务的进程。每个进程就是任务的具体执行者
  • 任务:指定哪个执行器,以什么频率,以什么策略调度任务
  1. 分成n个任务,配置在application-dev.yml中,余数作为分片任务的参数,like this : {"mailIdMod":2}

  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)
                }
            }