首页
苏兮影视
随笔记
壁纸
更多
直播
时光轴
友联
关于
统计
Search
1
软件添加id功能按钮
760 阅读
2
v2ray节点搭建
731 阅读
3
typecho非常有特色的模块
549 阅读
4
QQxml消息卡片生成源码
503 阅读
5
网易云音乐歌单ID获取教程
476 阅读
谈天说地
建站源码
经验教程
资源分享
动漫美图
登录
Search
标签搜索
java
flutter
springboot
rust
安卓
linux
vue
docker
joe
快捷键
git
fish shell
maven
redis
netty
dart
groovy
js
设计模式
rpc
尽意
累计撰写
103
篇文章
累计收到
39
条评论
首页
栏目
谈天说地
建站源码
经验教程
资源分享
动漫美图
页面
苏兮影视
随笔记
壁纸
直播
时光轴
友联
关于
统计
搜索到
87
篇与
的结果
2024-10-23
Docker 常用命令大全:从入门到精通
Docker 是一种开源的容器化平台,它能够将应用程序及其依赖打包成一个标准化的单元,从而实现在任何环境中的一致性运行。无论是开发、测试还是生产环境,Docker 都为我们提供了灵活且高效的解决方案。本文将通过详细整理 Docker 的常用命令,帮助你从基础操作到高级使用,全面掌握 Docker 技能。一、Docker 基础概念在开始使用 Docker 之前,了解以下几个基础概念非常重要:镜像(Image):镜像是一个只读模板,包含了应用程序及其依赖的所有内容。镜像是创建容器的基础,它可以从公共仓库(如 Docker Hub)中获取,也可以通过 Dockerfile 自行构建。容器(Container):容器是基于镜像的实例,它封装了应用程序的所有依赖和运行环境。每个容器相互隔离,且可以独立运行。仓库(Registry):镜像存储的地方。最常用的仓库是 Docker Hub,但也可以搭建私有仓库。数据卷(Volume):数据卷是一种 Docker 提供的持久化存储方式,数据卷存储在容器外部,用于保存容器产生的持久性数据。二、Docker 安装与启动1. 安装 Docker根据你的操作系统,选择适当的安装方式:Ubuntu/Debian:sudo apt update sudo apt install docker.ioCentOS:sudo yum install dockerWindows/MacOS:可以通过 Docker Desktop 来安装。安装完成后,启动 Docker 服务:sudo systemctl start docker2. 检查 Docker 是否正确安装安装完成后可以通过以下命令检查 Docker 是否安装成功,并查看版本号:docker --version这将输出类似如下的信息:Docker version 20.10.7, build f0df350三、镜像管理1. 拉取镜像拉取镜像是使用 Docker 的第一步,镜像从远程仓库(如 Docker Hub)下载。可以使用以下命令来拉取镜像:docker pull [镜像名]:[标签]标签通常用来表示镜像的版本号,例如拉取 ubuntu 的 20.04 版本:docker pull ubuntu:20.04如果没有指定标签,Docker 默认会拉取 latest 标签的版本:docker pull nginx2. 查看本地镜像列表查看主机上已有的镜像:docker images输出示例:REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 2b95cfa1f442 5 days ago 133MB ubuntu 20.04 ba6acccedd29 2 weeks ago 72.8MB这列出了镜像的名称(REPOSITORY)、标签(TAG)、镜像 ID、创建时间和大小。3. 删除镜像如果不再需要某个镜像,可以将其删除:docker rmi [镜像ID]例如,删除 ID 为 ba6acccedd29 的镜像:docker rmi ba6acccedd29如果镜像正在被使用,可以通过 -f 参数强制删除:docker rmi -f [镜像ID]4. 自定义镜像:构建 Dockerfile通过 Dockerfile,用户可以构建自定义的镜像。Dockerfile 是包含一系列命令的文本文件,定义了如何构建镜像。使用 docker build 命令可以基于 Dockerfile 构建镜像。Dockerfile 示例:# 使用基础镜像 FROM ubuntu:20.04 # 安装应用 RUN apt-get update && apt-get install -y nginx # 复制配置文件 COPY ./my-nginx-config /etc/nginx/nginx.conf # 暴露端口 EXPOSE 80 # 启动命令 CMD ["nginx", "-g", "daemon off;"]构建镜像:docker build -t my-nginx:v1 .此命令将在当前目录下查找 Dockerfile 并构建一个名为 my-nginx 的新镜像,版本为 v1。四、容器管理1. 运行容器启动一个基于镜像的容器:docker run [选项] [镜像名]:[标签]常用选项:-d:后台运行容器。-p:指定端口映射(格式:宿主机端口:容器端口)。--name:指定容器名称。-v:挂载数据卷(格式:宿主机路径:容器路径)。例如,运行一个 Nginx 容器并映射 8080 端口到容器的 80 端口:docker run -d -p 8080:80 --name mynginx nginx2. 查看容器状态查看当前运行的容器列表:docker ps输出示例:CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e5080f377d38 nginx "nginx -g 'daemon of…" 3 hours ago Up 3 hours 0.0.0.0:8080->80/tcp mynginx如果想查看所有容器(包括停止的):docker ps -a3. 停止、启动和重启容器停止容器:docker stop [容器ID或名称]启动一个已停止的容器:docker start [容器ID或名称]重启容器:docker restart [容器ID或名称]4. 进入容器如果想在运行中的容器内执行命令,可以使用 docker exec 命令进入容器:docker exec -it [容器ID或名称] /bin/bash例如,进入一个 Nginx 容器并进入 bash 终端:docker exec -it mynginx /bin/bash5. 删除容器如果容器已经停止或不再需要,可以通过以下命令删除它:docker rm [容器ID或名称]如果容器正在运行,可以强制删除:docker rm -f [容器ID或名称]五、数据管理1. 数据卷创建与挂载数据卷用于持久化容器中的数据,即使容器删除或重新创建,数据卷中的数据仍然存在。创建数据卷:docker volume create [卷名]查看已创建的数据卷:docker volume ls在启动容器时,将数据卷挂载到容器中:docker run -d -v [卷名]:[容器路径] [镜像名]例如,将名为 my-volume 的卷挂载到容器的 /data 目录下:docker run -d -v my-volume:/data ubuntu删除数据卷:docker volume rm [卷名]六、网络管理1. 自定义 Docker 网络Docker 默认会为容器创建一个桥接网络。你也可以创建自定义网络,以便容器之间通过网络名称互相通信。创建自定义网络:docker network create [网络名]将容器连接到自定义网络:docker network connect [网络名] [容器ID或名称]2. 查看网络配置查看 Docker 中已创建的网络:docker network ls显示特定网络的详细信息:docker network inspect [网络名]七、Docker 日志与监控1. 查看容器日志可以通过 docker logs 命令查看容器的日志输出:docker logs [容器ID或名称]如果需要实时查看日志,可以加上 -f 参数:docker logs -f [容器ID或名称]2. 监控容器资源查看容器的 CPU、内存、网络等资源使用情况:docker stats输出示例:CONTAINER ID NAME CPU
2024年10月23日
79 阅读
0 评论
1 点赞
Quartz 整合 Spring Boot
1. 项目初始化1.1 引入依赖首先,我们需要在 Spring Boot 项目中引入 Quartz 相关的依赖。对于 Maven 项目,编辑 pom.xml 文件,添加如下依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>对于 Gradle 项目,则添加如下依赖:implementation 'org.springframework.boot:spring-boot-starter-quartz'1.2 添加数据库支持(可选)如果我们打算让 Quartz 任务持久化(任务信息存储到数据库中),则需要添加数据库驱动。例如,使用 MySQL 数据库时,添加以下依赖:<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>这样我们就可以通过 Quartz 将任务存储在数据库中,保证任务在调度器重启后仍然存在。2. 创建 Quartz 任务2.1 创建一个简单的 Job在 Quartz 中,每个任务都由一个 Job 类来表示。Job 是 Quartz 的核心接口,它只有一个 execute() 方法,当触发器触发任务时,该方法将会被调用。我们首先创建一个简单的任务类 MyQuartzJob,该任务每次被触发时会输出 "Hello, Quartz!" 以及当前的时间。import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.stereotype.Component; @Component public class MyQuartzJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("执行任务: Hello, Quartz! 当前时间: " + System.currentTimeMillis()); } }2.2 解释Job 接口要求实现 execute(JobExecutionContext context) 方法,这个方法将在任务触发时被 Quartz 调度器调用。JobExecutionContext 提供了调度任务的上下文信息,如任务数据、触发器信息等。我们使用了 @Component 注解将该任务类注册为 Spring 的 Bean,便于在配置中注入和管理。3. 配置 Quartz 调度任务为了使任务能够被 Quartz 调度器调度,我们需要配置 JobDetail 和 Trigger。JobDetail 定义了任务的具体信息,而 Trigger 定义了任务的触发规则(如时间间隔、执行次数等)。3.1 基于时间间隔的 SimpleTrigger以下是一个配置类 QuartzConfig,它定义了一个每 5 秒触发一次的任务。import org.quartz.JobDetail; import org.quartz.Trigger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.quartz.JobDetailFactoryBean; import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean; @Configuration public class QuartzConfig { // 配置 JobDetail @Bean public JobDetailFactoryBean jobDetail() { JobDetailFactoryBean factoryBean = new JobDetailFactoryBean(); factoryBean.setJobClass(MyQuartzJob.class); // 绑定 Job 类 factoryBean.setDescription("这是一个示例 Quartz Job"); factoryBean.setDurability(true); // 任务持久化 return factoryBean; } // 配置 Trigger(每 5 秒执行一次) @Bean public SimpleTriggerFactoryBean trigger(JobDetail jobDetail) { SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean(); factoryBean.setJobDetail(jobDetail); // 绑定任务 factoryBean.setRepeatInterval(5000); // 每 5 秒触发一次 factoryBean.setRepeatCount(SimpleTriggerFactoryBean.REPEAT_INDEFINITELY); // 无限重复执行 return factoryBean; } }3.2 解释JobDetailFactoryBean:用于定义 Quartz 的 JobDetail。它将指定的 Job 与任务元数据(如任务描述、持久化策略等)绑定。SimpleTriggerFactoryBean:用于配置一个简单触发器(SimpleTrigger),我们可以设置触发间隔时间(单位:毫秒)以及重复执行次数。在这个示例中,任务会每隔 5 秒重复执行一次,且无限次重复。3.3 CronTrigger 的使用如果需要更复杂的触发条件,比如按照每天某个时间点或每周的某些特定时刻触发任务,Quartz 提供了 CronTrigger。CronTrigger 允许我们通过 Cron 表达式精确地控制任务的调度时间。import org.quartz.JobDetail; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.quartz.CronTriggerFactoryBean; import org.springframework.scheduling.quartz.JobDetailFactoryBean; @Configuration public class QuartzCronConfig { // 配置 JobDetail @Bean public JobDetailFactoryBean cronJobDetail() { JobDetailFactoryBean factoryBean = new JobDetailFactoryBean(); factoryBean.setJobClass(MyQuartzJob.class); factoryBean.setDescription("这是一个示例 Cron Quartz Job"); factoryBean.setDurability(true); // 任务持久化 return factoryBean; } // 配置 CronTrigger(每 10 秒执行一次) @Bean public CronTriggerFactoryBean cronTrigger(JobDetail cronJobDetail) { CronTriggerFactoryBean factoryBean = new CronTriggerFactoryBean(); factoryBean.setJobDetail(cronJobDetail); // 绑定任务 factoryBean.setCronExpression("0/10 * * * * ?"); // 每 10 秒触发一次 return factoryBean; } }3.4 Cron 表达式解释"0/10 * * * * ?":每隔 10 秒执行一次。Cron 表达式的格式是 "秒 分 时 日 月 星期 年(可选)"。这个表达式表示每分钟的第 0 秒开始,每 10 秒触发一次任务。4. 使用 JobDataMap 传递参数在实际应用中,任务往往需要使用外部数据。Quartz 提供了 JobDataMap,用于在任务执行时传递参数。4.1 配置任务并传递参数在 JobDetailFactoryBean 中,我们可以通过 setJobDataAsMap() 方法传递参数:@Bean public JobDetailFactoryBean jobDetailWithParams() { JobDetailFactoryBean factoryBean = new JobDetailFactoryBean(); factoryBean.setJobClass(MyQuartzJob.class); factoryBean.setDescription("带参数的 Quartz Job"); factoryBean.setDurability(true); // 传递参数 Map<String, Object> jobDataMap = new HashMap<>(); jobDataMap.put("param1", "参数值1"); factoryBean.setJobDataAsMap(jobDataMap); return factoryBean; }4.2 在 Job 中获取参数在 execute() 方法中,我们可以通过 JobExecutionContext 获取传递的参数:public class MyQuartzJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { String param1 = context.getMergedJobDataMap().getString("param1"); System.out.println("执行任务,参数1: " + param1); } }JobDataMap 允许我们在任务执行时携带自定义数据,并在任务中访问这些数据。对于复杂的业务逻辑,这一特性非常实用。5. 任务持久化(使用 JDBC)Quartz 支持将任务信息持久化到数据库中,这对于任务调度器重启时继续执行未完成的任务非常重要。为了使用持久化功能,我们需要配置数据库,并让 Quartz 将任务和调度信息保存到数据库中。5.1 创建数据库表首先,你需要为 Quartz 创建数据库表。Quartz 官方提供了 SQL 脚本用于创建这些表。你可以在 Quartz 文档 中找到5.2 配置 Quartz 使用数据库在 application.properties 或 application.yml 文件中,我们需要配置 Quartz 使用 JDBC 存储任务调度数据。对于 application.properties:spring.quartz.job-store-type=jdbc # 使用数据库存储 spring.quartz.jdbc.initialize-schema=always # 自动创建表,生产环境中建议使用 validate spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate # JDBC驱动代理 spring.datasource.url=jdbc:mysql://localhost:3306/quartz_db?useSSL=false&serverTimezone=UTC # 数据库连接URL spring.datasource.username=root # 数据库用户名 spring.datasource.password=your_password # 数据库密码对于 application.yml:spring: quartz: job-store-type: jdbc # 使用数据库存储 jdbc: initialize-schema: always # 自动创建表 properties: org: quartz: jobStore: driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate # JDBC代理 datasource: url: jdbc:mysql://localhost:3306/quartz_db?useSSL=false&serverTimezone=UTC # 数据库URL username: root # 数据库用户名 password: your_password # 数据库密码5.3 初始化数据库Quartz 提供了内置的表结构,默认会在数据库中创建任务、触发器、锁等所需的表。配置 spring.quartz.jdbc.initialize-schema=always 可以让 Spring Boot 在启动时自动初始化这些表。你也可以手动执行 Quartz 提供的 SQL 脚本,这些脚本位于 Quartz 官方发布包的 docs/dbTables 目录下。5.4 解释job-store-type:指定 Quartz 如何存储任务信息。memory 表示将任务存储在内存中,jdbc 则表示将任务存储在数据库中。driverDelegateClass:指定数据库驱动代理类。对于 MySQL,我们使用 StdJDBCDelegate,如果使用其他数据库(如 PostgreSQL),则需要根据数据库类型选择对应的代理类。initialize-schema:控制是否在启动时自动创建 Quartz 需要的表。生产环境下应设置为 validate,以避免重复创建表。5.5 测试任务持久化当 Quartz 任务配置完成并启动时,所有的任务、触发器以及调度信息都会存储到配置的数据库中。你可以停止并重启应用程序,来验证任务的持久性。如果配置正确,任务调度器重新启动后,Quartz 将从数据库中恢复之前的任务调度信息并继续执行未完成的任务。6. 任务并发控制默认情况下,Quartz 会在多个线程中并发执行多个任务。如果你希望控制任务的并发执行,可以通过 @DisallowConcurrentExecution 注解来实现,确保同一个任务在同一时间只有一个实例在运行。6.1 禁止并发执行修改我们的 MyQuartzJob 类,添加 @DisallowConcurrentExecution 注解:import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.stereotype.Component; @DisallowConcurrentExecution // 禁止并发执行 @Component public class MyQuartzJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("执行任务: Hello, Quartz! 当前时间: " + System.currentTimeMillis()); } }6.2 解释@DisallowConcurrentExecution:Quartz 提供的注解,用于确保在同一时间内同一任务(JobDetail)只能执行一次。如果该任务正在运行,新的任务不会并发执行。7. 动态添加与删除任务在实际应用中,我们可能需要根据某些业务规则动态地添加或删除定时任务。Quartz 支持动态管理任务,可以通过 Quartz 提供的 API 来实现任务的增删改查。7.1 动态添加任务以下是一个示例,用于动态添加任务:import org.quartz.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class QuartzJobService { @Autowired private Scheduler scheduler; // 注入 Quartz 的 Scheduler // 动态添加任务 public void addJob(String jobName, String groupName, String cronExpression) throws SchedulerException { JobDetail jobDetail = JobBuilder.newJob(MyQuartzJob.class) .withIdentity(jobName, groupName) .build(); CronTrigger trigger = TriggerBuilder.newTrigger() .withIdentity(jobName + "Trigger", groupName) .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)) .build(); scheduler.scheduleJob(jobDetail, trigger); // 将任务和触发器注册到调度器 } }7.2 动态删除任务以下是动态删除任务的示例:public void deleteJob(String jobName, String groupName) throws SchedulerException { JobKey jobKey = JobKey.jobKey(jobName, groupName); scheduler.deleteJob(jobKey); // 删除指定的任务 }7.3 调用示例你可以通过 REST API 或者在服务启动时调用这些方法:@RestController @RequestMapping("/jobs") public class JobController { @Autowired private QuartzJobService jobService; @PostMapping("/add") public String addJob(@RequestParam String jobName, @RequestParam String groupName, @RequestParam String cronExpression) { try { jobService.addJob(jobName, groupName, cronExpression); return "任务添加成功"; } catch (SchedulerException e) { e.printStackTrace(); return "任务添加失败"; } } @DeleteMapping("/delete") public String deleteJob(@RequestParam String jobName, @RequestParam String groupName) { try { jobService.deleteJob(jobName, groupName); return "任务删除成功"; } catch (SchedulerException e) { e.printStackTrace(); return "任务删除失败"; } } }8. 总结通过本教程,你已经学会了如何将 Quartz 整合到 Spring Boot 中,并实现以下功能:创建简单的定时任务。使用 SimpleTrigger 和 CronTrigger 实现时间间隔和复杂调度的任务。通过 JobDataMap 向任务传递参数。实现任务的持久化,并将任务信息保存到数据库中。控制任务的并发执行,避免重复调度。动态添加和删除定时任务。Quartz 强大的调度功能与 Spring Boot 的简洁配置相结合,使得我们可以轻松构建复杂的任务调度系统。在实际应用中,你可以根据业务需求进行进一步的自定义和优化,构建一个高度可扩展的调度系统。
2024年10月19日
87 阅读
0 评论
2 点赞
Java Quartz 定时任务调度
介绍Quartz 是一个功能强大的 Java 任务调度库,能够调度执行定时任务或周期性任务。它支持复杂的调度方式,适用于分布式任务系统。本篇文章将介绍如何在 Java 项目中使用 Quartz。1. 添加依赖在使用 Quartz 之前,需要在项目中引入相应的依赖库。以下是基于 Maven 的项目依赖:<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency>对于 Gradle,可以添加以下依赖:implementation 'org.quartz-scheduler:quartz:2.3.2'2. 创建一个 JobQuartz 中的每个任务都由一个 Job 来表示。Job 是一个接口,所有任务类都需要实现它的 execute() 方法。import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class HelloJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Hello Quartz! 当前时间: " + System.currentTimeMillis()); } }3. 创建 JobDetail 和 TriggerJobDetail 表示任务的定义,而 Trigger 表示任务的触发方式(如何时执行)。以下代码展示了如何创建一个简单的任务,并定义每隔 5 秒执行一次。import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; public class QuartzScheduler { public static void main(String[] args) throws SchedulerException { // 1. 创建 Scheduler 实例 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 2. 定义 JobDetail JobDetail jobDetail = JobBuilder.newJob(HelloJob.class) .withIdentity("helloJob", "group1") .build(); // 3. 定义 Trigger(5 秒执行一次) Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("simpleTrigger", "group1") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(5) .repeatForever()) .build(); // 4. 将 JobDetail 和 Trigger 绑定到调度器上 scheduler.scheduleJob(jobDetail, trigger); // 5. 启动调度器 scheduler.start(); // 6. 调度器运行一段时间后关闭 try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } // 7. 停止调度器 scheduler.shutdown(); } }解释:Scheduler 是 Quartz 的核心,它管理和控制任务的执行。JobDetail 是对任务的定义,包含任务的类和任务的元数据。Trigger 用于定义任务的触发方式。这里使用 SimpleScheduleBuilder 每隔 5 秒重复执行一次。调度器启动后,任务会按设定的触发器条件执行。4. 使用 CronTrigger除了 SimpleTrigger,Quartz 还支持更加复杂的 CronTrigger,它允许使用 Cron 表达式来定义任务的执行时间。Trigger cronTrigger = TriggerBuilder.newTrigger() .withIdentity("cronTrigger", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * ? * * *")) .build();上面的 Cron 表达式 "0/10 * * ? * * *" 表示每隔 10 秒执行一次。5. 处理任务中的数据在实际应用中,任务通常需要一些上下文数据。我们可以使用 JobDataMap 来传递数据。JobDetail jobDetail = JobBuilder.newJob(HelloJob.class) .withIdentity("helloJob", "group1") .usingJobData("message", "Hello from Quartz!") .build();在 Job 的 execute() 方法中可以通过 JobExecutionContext 获取传递的数据:public class HelloJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { JobDataMap dataMap = context.getJobDetail().getJobDataMap(); String message = dataMap.getString("message"); System.out.println("执行任务: " + message + " 当前时间: " + System.currentTimeMillis()); } }6. 任务持久化Quartz 支持将任务信息持久化到数据库中。使用 JDBC JobStore 可以让任务在调度器重启后依然存在。为了启用持久化功能,需要配置 Quartz 的 quartz.properties 文件并设置相应的数据源。以下是部分配置示例:org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.dataSource=myDS org.quartz.dataSource.myDS.driver=com.mysql.cj.jdbc.Driver org.quartz.dataSource.myDS.URL=jdbc:mysql://localhost:3306/quartz org.quartz.dataSource.myDS.user=root org.quartz.dataSource.myDS.password=password7. 总结本文介绍了 Quartz 的基本使用方法,从创建简单任务到使用 Cron 表达式进行任务调度,并且还介绍了如何传递数据和持久化任务。Quartz 提供了非常灵活的定时任务调度能力,适合各种场景的任务调度需求。
2024年10月19日
71 阅读
0 评论
3 点赞
2024-10-15
rust使用ffmpeg
使用命令创建项目cargo new ffmpeg-rust添加ffmpeg-next库cargo add ffmpeg-next这个时候cargo run肯定会报一堆错误使用这个ffmpeg-next官方仓库的 wiki 中的 GNU 构建指南https://github.com/zmwangx/rust-ffmpeg/wiki/Notes-on-building这里回车选择默认全部安装vcpkg integrate install vcpkg install ffmpeg[core,avcodec,avformat,swscale,avdevice,avfilter] --triplet x64-windows --recurse这时候在执行cargo run应该就不报错了
2024年10月15日
78 阅读
1 评论
3 点赞
2024-09-21
dart使用grpc
1.添加依赖项: 在你的 pubspec.yaml 文件中,添加 gRPC 和 protobuf 的依赖:dependencies: protobuf: ^3.1.0 grpc: ^4.0.12.安装 Dart 的 protoc_pluginprotoc_plugin 是 Dart 的 gRPC 插件,它可以将 .proto 文件编译为 Dart 代码。通过 Dart 的包管理工具 pub 来安装:dart pub global activate protoc_plugin 并配置环境变量3.生成 Protocol Buffers 代码: 创建一个 .proto 文件,定义服务和消息hello.proto:syntax = "proto3"; package hello; service Hello { rpc SayHello (HelloRequest) returns (HelloReply); } message HelloRequest { string name = 1; } message HelloReply { string message = 1; } 4.使用 protoc 生成 Dart 代码protoc --dart_out=grpc:lib/src/generated -I. lib/protos/hello.proto --dart_out=grpc:lib/src/generated:生成带 gRPC 支持的 Dart 文件,并将其放入 lib/src/generated 目录。-I .:指定 .proto 文件的路径(.表示当前目录)。lib/protos/hello.proto:指定你要编译的 .proto 文件。5.编写客户端代码client.dartimport 'package:grpc/grpc.dart'; import 'generated/protos/hello.pb.dart'; // 引入生成的消息定义 import 'generated/protos/hello.pbgrpc.dart'; // 引入生成的 gRPC 客户端和服务 Future<void> main() async { // 创建一个 gRPC 客户端连接到服务端,假设服务端在本地的 50051 端口 final channel = ClientChannel( 'localhost', port: 50051, options: const ChannelOptions(credentials: ChannelCredentials.insecure()), ); final client = HelloClient(channel); try { // 调用 sayHello 并打印响应 for(int i = 0;i<10;i++) { final response = await client.sayHello(HelloRequest() ..name = "hello grpc$i"); print('Received: $response'); } } finally { // 关闭客户端通道 await channel.shutdown(); } } 6.编写服务端代码server.dartimport 'package:grpc/grpc.dart'; import 'generated/protos/hello.pb.dart'; import 'generated/protos/hello.pbgrpc.dart'; // 实现 Hello 服务 class HelloService extends HelloServiceBase { @override Future<HelloReply> sayHello(ServiceCall call, HelloRequest request) async { print("server message:${request.name}"); // 构建响应 return HelloReply()..message = 'Hello, ${request.name}!'; } } Future<void> main() async { // 启动 gRPC 服务端 final server = Server.create(services: [HelloService()]); await server.serve(port: 50051); print('Server listening on port ${server.port}...'); } 7.运行代码运行服务端dart run lib/src/server.dart 运行客户端dart run lib/src/client.dart 项目的目录结构:
2024年09月21日
95 阅读
0 评论
2 点赞
1
...
5
6
7
...
18