首页 > 其他分享 >定时任务基类

定时任务基类

时间:2022-09-27 15:01:28浏览次数:48  
标签:return String param 任务 protected key 基类 import 定时

package com.bessky.common.task;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.thread.ThreadUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.bessky.common.core.function.TeConsumer;
import com.bessky.common.core.util.ContextUtils;
import com.bessky.common.core.util.ThreadUtils;
import com.xxl.job.core.context.XxlJobHelper;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.StringRedisTemplate;

import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Supplier;

public abstract class BaseJobHandler
{
    /**
     * 日志记录器
     */
    protected final Logger log = LoggerFactory.getLogger(this.getClass());

    @Resource
    protected StringRedisTemplate stringRedisTemplate;

    /**
     * 循环执行任务
     *
     * @param items
     * @param action
     * @param error
     * @param size
     * @param <T>
     */
    protected <T> void execute(Collection<T> items, Consumer<T> action, BiConsumer<T, Exception> error, int size)
    {
        if (CollUtil.isEmpty(items))
        {
            return;
        }

        // 创建执行线程
        ExecutorService executor = ThreadUtil.newExecutor(size, size, items.size());

        // 循环执行任务
        items.forEach(item -> executor.execute(() -> {
            try
            {
                action.accept(item);
            }
            catch (Exception e)
            {
                log.error(e.getMessage(), e);
                if (error != null)
                {
                    error.accept(item, e);
                }
                else
                {
                    XxlJobHelper.log(e);
                }
            }
        }));

        // 等待执行完成
        ThreadUtils.await(executor);
    }

    /**
     * 循环执行任务
     *
     * @param items
     * @param action
     * @param error
     * @param <T>
     */
    protected <T> void execute(Collection<T> items, Consumer<T> action, BiConsumer<T, Exception> error)
    {
        this.execute(items, action, error, 100);
    }

    /**
     * 循环执行任务
     *
     * @param map
     * @param action
     * @param error
     * @param size
     * @param <K>
     * @param <V>
     */
    protected <K, V> void execute(Map<K, V> map, BiConsumer<K, V> action, TeConsumer<K, V, Exception> error, int size)
    {
        if (MapUtil.isEmpty(map) || action == null)
        {
            return;
        }

        // 创建执行线程
        ExecutorService executor = ThreadUtil.newExecutor(size, size, map.size());

        // 循环执行任务
        map.forEach((key, value) -> executor.execute(() -> {
            try
            {
                action.accept(key, value);
            }
            catch (Exception e)
            {
                log.error(e.getMessage(), e);
                if (error != null)
                {
                    error.accept(key, value, e);
                }
                else
                {
                    XxlJobHelper.log(e);
                }
            }
        }));

        // 等待执行完成
        ThreadUtils.await(executor);
    }

    /**
     * 循环执行任务
     *
     * @param map
     * @param action
     * @param error
     * @param <K>
     * @param <V>
     */
    protected <K, V> void execute(Map<K, V> map, BiConsumer<K, V> action, TeConsumer<K, V, Exception> error)
    {
        this.execute(map, action, error, 100);
    }

    /**
     * 获取用户标识
     *
     * @return
     */
    protected String getUserId()
    {
        Integer userId = ContextUtils.getUserId();
        return userId != null ? userId.toString() : "0";
    }

    /**
     * 记录调试日志
     *
     * @param format
     * @param arguments
     */
    protected void debug(String format, Object... arguments)
    {
        log.debug(format, arguments);
        XxlJobHelper.log(format, arguments);
    }

    /**
     * 记录警告日志
     *
     * @param format
     * @param arguments
     */
    protected void warn(String format, Object... arguments)
    {
        log.warn(format, arguments);
        XxlJobHelper.log(format, arguments);
    }

    /**
     * 记录错误日志
     *
     * @param format
     * @param arguments
     */
    protected void error(String format, Object... arguments)
    {
        log.error(format, arguments);
        XxlJobHelper.log(format, arguments);
    }

    /**
     * 记录错误日志
     *
     * @param msg
     * @param t
     */
    protected void error(String msg, Throwable t)
    {
        log.error(msg, t);
        XxlJobHelper.log(t);
    }

    /**
     * 指定操作限流
     *
     * @param key
     * @param timeout
     * @param unit
     * @return
     */
    protected Boolean limit(String key, long timeout, TimeUnit unit)
    {
        String userId = ContextUtils.getUserId(0).toString();
        return stringRedisTemplate.opsForValue().setIfAbsent(key, userId, timeout, unit);
    }

    /**
     * 限流两个小时
     *
     * @param key
     * @return
     */
    protected Boolean limit2hour(String key)
    {
        return this.limit(key, 2, TimeUnit.HOURS);
    }

    /**
     * 解析字符参数
     *
     * @param key
     * @return
     */
    protected String parseStringParam(String key)
    {
        // 获取作业参数
        String jobParam = XxlJobHelper.getJobParam();

        if (!JSON.isValidObject(jobParam))
        {
            return null;
        }

        // 解析作业参数
        return JSON.parseObject(jobParam).getString(key);
    }

    /**
     * 解析字符参数
     *
     * @param key
     * @param other
     * @return
     */
    protected String parseStringParam(String key, String other)
    {
        return Optional.ofNullable(key).map(this::parseStringParam).filter(StringUtils::isNotBlank).orElse(other);
    }

    /**
     * 解析字符参数
     *
     * @param key
     * @param other
     * @return
     */
    protected String parseStringParam(String key, Supplier<String> other)
    {
        return Optional.ofNullable(key).map(this::parseStringParam).filter(StringUtils::isNotBlank).orElseGet(other);
    }

    /**
     * 解析对象参数
     *
     * @param key
     * @param clazz
     * @param <T>
     * @return
     */
    protected <T> T parseObjectParam(String key, Class<T> clazz)
    {
        // 获取作业参数
        String jobParam = XxlJobHelper.getJobParam();

        if (!JSON.isValidObject(jobParam))
        {
            return null;
        }

        // 解析作业参数
        return JSON.parseObject(jobParam).getObject(key, clazz);
    }

    /**
     * 解析对象参数
     *
     * @param key
     * @param clazz
     * @param other
     * @param <T>
     * @return
     */
    protected <T> T parseObjectParam(String key, Class<T> clazz, T other)
    {
        T value = this.parseObjectParam(key, clazz);
        return Optional.ofNullable(value).orElse(other);
    }

    /**
     * 解析对象参数
     *
     * @param key
     * @param other
     * @param clazz
     * @param <T>
     * @return
     */
    protected <T> T parseObjectParam(String key, Supplier<T> other, Class<T> clazz)
    {
        T value = this.parseObjectParam(key, clazz);
        return Optional.ofNullable(value).orElseGet(other);
    }

    /**
     * 解析列表参数
     *
     * @param key
     * @param clazz
     * @param <T>
     * @return
     */
    protected <T> List<T> parseListParam(String key, Class<T> clazz)
    {
        // 获取作业参数
        String jobParam = XxlJobHelper.getJobParam();

        if (!JSON.isValidObject(jobParam))
        {
            return null;
        }

        // 解析作业参数
        JSONArray jsonArray = JSON.parseObject(jobParam).getJSONArray(key);

        if (CollectionUtils.isEmpty(jsonArray))
        {
            return null;
        }

        // 转换参数列表
        return jsonArray.toJavaList(clazz);
    }

    /**
     * 解析映射参数
     *
     * @param key
     * @return
     */
    protected Map<String, String> parseMapParam(String key)
    {
        // 获取作业参数
        String jobParam = XxlJobHelper.getJobParam();

        if (!JSON.isValidObject(jobParam))
        {
            return null;
        }

        // 解析作业参数
        return JSON.parseObject(jobParam).getObject(key, new TypeReference<Map<String, String>>()
        {
        });
    }

    /**
     * 解析作业参数
     *
     * @param key
     * @return
     */
    protected JSONObject parseJsonObject(String key)
    {
        // 获取作业参数
        String jobParam = XxlJobHelper.getJobParam();

        if (!JSON.isValidObject(jobParam))
        {
            return null;
        }

        // 解析作业参数
        return JSON.parseObject(jobParam).getJSONObject(key);
    }
}

 

标签:return,String,param,任务,protected,key,基类,import,定时
From: https://www.cnblogs.com/zrboke/p/16734573.html

相关文章

  • 通过Thread Pool Executor类解析线程池执行任务的核心流程
    摘要:ThreadPoolExecutor是Java线程池中最核心的类之一,它能够保证线程池按照正常的业务逻辑执行任务,并通过原子方式更新线程池每个阶段的状态。本文分享自华为云社区《【高......
  • python使用paramiko实现ssh定时执行命令
    原文https://www.cnblogs.com/Rosaany/p/16093521.html#!/usr/bin/envpython3#-*-coding:utf-8-*-#@Author:Rosaanyimportfunctoolsfromparamiko.ssh_exce......
  • 关于多任务学习MTL的实现步骤记录
    拿任务来讲解:假设我目前已经有了一个目标检测功能,检测物体a,现在我想判断这个a是不是真实场景下的,需要对整图再加个判断,即二分类。这样的需求其实就是典型的多任务学习,即检......
  • 关于软件定时器的一些讨论
    1、简介这里先介绍下软件定时器和硬件定时器的区别硬件定时器:CPU内部自带的定时器模块,通过初始化、配置可以实现定时,定时时间到以后就会执行相应的定时器中断处理函数。......
  • groovy 调整k8s的副本数定时任务
    目录groovy调整k8s的副本数定时任务groovy调整k8s的副本数定时任务packageplatformnode('ecs_wuhan_docker'){println"${BUILD_URL}console"defwxKey......
  • 定时器
    Js中有两种定时器:setInterval:间歇执行,setTimeout:延迟执行setInterval(函数,时间)时间单位ms,语法:setInterval(function(){},1000);隔一秒执行函数一次一般用于倒计时,轮......
  • 51单片机学习日志一:流水灯和定时器
    单片机最小系统的三要素就是电源、晶振、复位电路单片机复位一般是3种情况:上电复位、手动复位、程序自动复位。没有电压差就不会产生电流一、sbit在单片机中的使用C5......
  • linux cron 任务不成功定位
    编辑定时任务:crontab-e查看定时任务执行情况tail-500f/var/log/crontail-500f/var/spool/mail/root报错:/bin/bash^M:坏的解释器:没有那个文件或目录原因:这个文件......
  • Ele_0006:electron 在非全屏模式下,显示时 忽略任务栏高度 打开软件时 闪烁图标
    1,    //打开软件时闪烁图标//c.once('focus',()=>c.flashFrame(true));//c.flashFrame(true); ......
  • centos 任务管理器 htop
    一、以yum方式安装1、yum-yinstallepel-release.noarch2、yum-yinstallhtop 二、源码方式安装1、安装gcc、内核库依赖库yuminstall-ygccncurses-deve2、......