项目中的任务调度和消息队列方案详解

 
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 
                                               🎈🎈作者主页: 喔的嘛呀🎈🎈

目录

引言

任务调度方案:Quartz Scheduler

应用场景:

优势:

示例代码:

消息队列方案:RabbitMQ

应用场景:

优势:

示例代码:

结语


引言

在软件开发项目中,任务调度和消息队列是实现异步处理、定时任务执行等功能的关键技术。本文将详细介绍我在项目中使用的任务调度和消息队列的方案,并提供代码示例,帮助读者更好地理解和应用这些技术。

任务调度方案:Quartz Scheduler

在我们的项目中,我们使用了Quartz Scheduler作为任务调度器。Quartz是一个功能强大的开源任务调度库,适用于各种任务调度需求。

应用场景:
  1. 定时任务执行: 我们使用Quartz Scheduler来执行各种定时任务,如数据备份、数据清理、统计报表生成等。通过Quartz的cron表达式,可以非常方便地配置任务的执行时间。

  2. 异步任务处理: 有些任务需要在后台异步执行,以提高系统的响应速度和性能。我们利用Quartz Scheduler将这些任务调度到后台线程池中执行,避免阻塞主线程。

优势:
  • 灵活性: Quartz Scheduler提供了丰富的配置选项和灵活的调度策略,可以满足各种任务调度需求。
  • 可靠性: Quartz Scheduler具有高度可靠的任务执行机制,支持任务的持久化存储和恢复,确保任务不会丢失或重复执行。
  • 易用性: Quartz提供了简单易用的API和丰富的文档,使得任务调度的实现变得简单快捷。
示例代码:

首先,我们需要定义一个任务类,实现Job接口,并在execute方法中编写任务的具体逻辑:

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;public class MyJob implements Job {public void execute(JobExecutionContext context) throws JobExecutionException {// 执行任务逻辑System.out.println("定时任务执行:" + new Date());}
}

然后,我们需要配置Quartz Scheduler,并创建和调度任务:

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;public class QuartzSchedulerExample {public static void main(String[] args) throws SchedulerException {// 创建调度器Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();// 定义任务JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("myJob", "group1").build();// 定义触发器,每分钟执行一次Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(1).repeatForever()).build();// 将任务和触发器注册到调度器中scheduler.scheduleJob(job, trigger);// 启动调度器scheduler.start();}
}

以上代码演示了如何使用Quartz Scheduler创建一个定时任务,并让它每分钟执行一次。

消息队列方案:RabbitMQ

在我们的项目中,为了实现系统之间的解耦和异步通信,我们选择了RabbitMQ作为消息队列服务。

应用场景:
  1. 事件驱动架构: 我们使用RabbitMQ来构建事件驱动的架构,不同模块之间通过消息队列进行异步通信。比如,当某个服务产生了新的数据,可以将数据发布到消息队列,让其他服务消费并进行相应处理。

  2. 削峰填谷: 在高并发场景下,为了防止系统负载过高,我们会将请求放入消息队列中进行排队处理,实现请求的平滑处理和负载均衡。

优势:
  • 解耦性: 消息队列可以实现不同模块之间的解耦,降低模块之间的耦合度,提高系统的灵活性和可维护性。
  • 异步处理: 通过消息队列,可以实现异步处理,提高系统的并发处理能力和响应速度。
  • 可靠性: RabbitMQ具有高度可靠的消息传输机制,支持消息的持久化存储和可靠传输,确保消息不会丢失。
示例代码:

首先,我们需要配置RabbitMQ连接和消息队列:

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;public class RabbitMQConfig {private final static String QUEUE_NAME = "hello";public static void main(String[] argv) throws Exception {// 创建连接工厂ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");// 创建连接try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);}}
}

  然后,我们可以发送和接收消息:

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;public class RabbitMQProducer {private final static String QUEUE_NAME = "hello";public static void main(String[] argv) throws Exception {// 创建连接工厂ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");// 创建连接try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 发送消息String message = "Hello World!";channel.basicPublish("", QUEUE_NAME, null, message.getBytes());System.out.println(" [x] Sent '" + message + "'");}}
}
import com.rabbitmq.client.*;public class RabbitMQConsumer {private final static String QUEUE_NAME = "hello";public static void main(String[] argv) throws Exception {// 创建连接工厂ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");// 创建连接try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);System.out.println(" [*] Waiting for messages. To exit press Ctrl+C");// 定义消息处理逻辑DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [x] Received '" + message + "'");};// 监听队列channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });}}
}

以上代码演示了如何使用RabbitMQ发送和接收消息,以及如何配置RabbitMQ连接和消息队列。

结语

任务调度和消息队列是现代软件开发中常用的技术手段,可以帮助我们实现系统的高效、可靠、可扩展的运行。通过本文的介绍和代码示例,读者可以更好地理解和应用这些技术,提高系统的性能和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/25544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件项目调研三部曲(调研计划,调研大纲,调研报告)原件获取

软件项目详细调研的目的是依据项目合同的要求,能够通过在客户现场,并通过访谈的方式,尽可能的了解客户的需求和业务现状,包括客户涉及到的业务部门的岗位设置、岗位职责、工作内容、工作流程、管理难点以及通过实施信息化系统的期…

GDPU Java 天码行空15 数据库编程

一、实验目的 1、 了解数据库的基础知识。 2、 掌握MySQL的下载、安装与配置。 3、 掌握MySQL可视化工具的使用。 4、 了解SQL语言。 5、 掌握JDBC中的API,并能进行简单的数据库操作。 二、实验内容 1、 安装MySQL 👨‍🏫 视频教程 2、建…

华为云加码数智升级 赋能山西培育新质生产力

加码企业数智升级,驱动山西新质生产力跃升。6月4日,“云上共创晋而有为”华为云山西数智升级思享会在山西智创城NO.1创新孵化基地举办。 活动由华为云计算技术有限公司主办,太原清控科创科技园管理有限公司协办。活动整合山西鲲鹏生态创新中…

嵌入式单片机中项目在线仿真工具分享

前段时间,无意间发现了一个不错的在线仿真工具(Wokwi),支持多种平台,支持市面上主流的开发板,比如:STM32、ESP32、Arduino、树莓派等。 还支持常见的传感器、显示器件(LCD、LED屏幕)等,还可以播放音乐、联网、逻辑分析仪等,关键还提供了很多实际项目的案例。 这款工…

怎么开发vscode插件

开发VSCode插件主要涉及到JavaScript、TypeScript和Node.js。以下是一个基本的步骤: 环境准备:首先,你需要安装Node.js和VSCode。你还需要全局安装VSCode插件开发工具yo code。在命令行中运行以下命令: npm install -g yo generat…

Cocos2dx 编译游戏安装包制作教程

在本教程中,我们将学习如何为 Visual Studio 编译项目配置图标,并使用 Inno Setup 创建安装包。我们将包括以下部分: 设置项目图标:在 Visual Studio 中配置 .exe 文件的图标,或者使用第三方工具替换编译后的图标。创…

简记:为Docker配置服务代理

简记 为Docker配置服务代理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/art…

网络流媒体协议——HLS协议

HTTP 实时流媒体(HTTP Live Streaming,HLS)协议是苹果公司提出的主要用于直播的流媒体协议。一个完整的基于HLS协议的流媒体直播系统由四部分组成,即音视频采集器、媒体服务器、媒体分发器和播放客户端。 媒体服务器 媒体服务器的…

深入理解交叉熵损失 CrossEntropyLoss - CrossEntropyLoss

深入理解交叉熵损失 CrossEntropyLoss - CrossEntropyLoss flyfish 本系列的主要内容是在2017年所写,GPT使用了交叉熵损失函数,所以就温故而知新,文中代码又用新版的PyTorch写了一遍,在看交叉熵损失函数遇到问题时,可…

小冬瓜AIGC 手撕LLM 拼课

小冬瓜aigc手撕LLM学习 官方认证 手撕LLMRLHF速成班-(附赠LLM加速分布式训练超长文档) 帮助多名同学上岸LLM方向,包括高校副教授,北美PhD,大厂等 课程名称【手撕LLMRLHF】 授课形式:在线会议直播讲解课后录播 时间&…

oppo手机精简包名列表

oppo广告机,coloros为13.0,测试机为oppo a1x 5g。 手机第一次开机后就全屏广告,被恶心了好几个月。现使用universal Android debolater进行卸载测试,其中: 不可卸载的: 开机广告:com.coloros.…

RK3568笔记三十一:ekho 6.3 文本转语音移植

若该文为原创文章,转载请注明原文出处。 移植的目的是在在OCR识别基础上增加语音播放,把识别到的文字直接转TTS播报出来,形成类似点读机的功能。 1、下载文件 libsndfile-1.0.28.tar.gz ekho-6.3.tar.xz 2、解压 tar zxvf libsndfile-1.0…

7-6 sdut-C语言实验-爬楼梯

7-6 sdut-C语言实验-爬楼梯 分数 20 全屏浏览 切换布局 作者 马新娟 单位 山东理工大学 小明是个非常无聊的人,他每天都会思考一些奇怪的问题,比如爬楼梯的时候,他就会想,如果每次可以上一级台阶或者两级台阶,那么…

LangChain基础知识入门

LangChain的介绍和入门 1 什么是LangChain LangChain由 Harrison Chase 创建于2022年10月,它是围绕LLMs(大语言模型)建立的一个框架,LLMs使用机器学习算法和海量数据来分析和理解自然语言,GPT3.5、GPT4是LLMs最先进的代…

【源码】Spring Data JPA原理解析之事务注册原理

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…

Docker 基础使用 (4) 网络管理

文章目录 Docker 网络管理需求Docker 网络架构认识Docker 常见网络类型1. bridge 网络2. host 网络3. container 网络4. none 网络5. overlay 网络 Docker 网路基础指令Docker 网络管理实操 其他相关链接 Docker 基础使用(0)基础认识 Docker 基础使用(1)…

文件操作(Python和C++版)

一、C版 程序运行时产生的数据都属于临时数据&#xff0c;程序—旦运行结束都会被释放通过文件可以将数据持久化 C中对文件操作需要包含头文件< fstream > 文件类型分为两种: 1. 文本文件 - 文件以文本的ASCII码形式存储在计算机中 2. 二进制文件- 文件以文本的二进…

Spring运维之boo项目表现层测试匹配响应执行状态响应体JSON和响应头

匹配响应执行状态 我们创建了测试环境 而且发送了虚拟的请求 我们接下来要进行验证 验证请求和预期值是否匹配 MVC结果匹配器 匹配上了 匹配失败 package com.example.demo;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Auto…

Transformer动画讲解:Softmax函数

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。提前准备才是完全之策。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c…

读AI未来进行式笔记07量子计算

1. AI审讯技术 1.1. 发明者最初的目的是发明一种能够替代精神药物&#xff0c;为人类带来终极快乐的技术 1.1.1. 遗憾的是&#xff0c;他找到的只是通往反方向的大门 1.2. 通过非侵入式的神经电磁干扰大脑边缘系统&#xff0c;诱发受审者最…