IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Java实现定时任务队列功能 -> 正文阅读

[大数据]Java实现定时任务队列功能

(1)首先,创建一个队列任务

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;

public class QueueTask {

    private static final Logger log = LoggerFactory.getLogger(QueueTask.class);

    //每次执行十条任务
    private final LinkedBlockingQueue<TaskHandler> tasks = new LinkedBlockingQueue<TaskHandler>(10);

    private ExecutorService service = Executors.newSingleThreadExecutor();

    private volatile boolean running = true;

    private Future<?> serviceThreadStatus = null;

    @PostConstruct
    public void init() {
        serviceThreadStatus = service.submit(new Thread(() -> {
            while (running) {
                try {
                    //开始一个任务
                    TaskHandler task = tasks.take();
                    try {
                        task.processTask();
                    } catch (Exception e) {
                        log.error("任务处理发生错误", e);
                    }
                } catch (InterruptedException e) {
                    log.error("服务停止,退出", e);
                    running = false;
                }
            }
        }));
    }

    public boolean addData(TaskHandler dataHandler) {
        if (!running) {
            log.warn("service is stop");
            return false;
        }
        //offer 队列已经满了,无法再加入的情况下
        boolean success = tasks.offer(dataHandler);
        if (!success) {
            log.warn("添加任务到队列失败");
        }
        return success;
    }

    //判断队列是否有任务
    public boolean isEmpty() {
        return tasks.isEmpty();
    }

    public boolean checkServiceRun() {
        return running && !service.isShutdown() && !serviceThreadStatus.isDone();
    }

    public void activeService() {
        running = true;
        if (service.isShutdown()) {
            service = Executors.newSingleThreadExecutor();
            init();
            log.info("线程池关闭,重新初始化线程池及任务");
        }
        if (serviceThreadStatus.isDone()) {
            init();
            log.info("线程池任务结束,重新初始化任务");
        }
    }

    @PreDestroy
    public void destroy() {
        running = false;
        service.shutdownNow();
    }

}

(2)其次,抽象出一个任务处理器的接口

public interface TaskHandler {
    //处理任务
    void processTask();
}

(3)接着,补充接口的实现类——定时任务

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;

/**
 * 定时任务
 */
public class TimingTaskService implements TaskHandler {

    @Autowired
    QueueTask queueTask;

    private String taskInfo;

    public TimingTaskService(String taskInfo) {
        this.taskInfo = taskInfo;
    }

    //每隔10分钟执行一次
    @Override
    @Scheduled(cron = "0 0/10 * * * ?")
    public void processTask() {
        boolean isSuccess = queueTask.addData(new TimingTaskService("newTaskInfo"));
        if (isSuccess) {
            System.out.println("the queueService has done!");
        }
    }
}

(4)最后,补充单元测试,测试以上方法的正确性

import org.junit.Assert;
import org.junit.Test;

public class TimingTaskServiceTest {

    @Test
    public void timingTaskServiceTest() {
        QueueTask queueTask = new QueueTask();
        Assert.assertTrue(queueTask.addData(new TimingTaskService("newTaskInfo")));
        Assert.assertFalse(queueTask.addData(new TimingTaskService("taskInfo")));
    }
}
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:39:53  更:2022-01-25 10:41:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:50:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码