在 CentOS 系统上实现定时执行 Python 邮件发送任务

在 CentOS 系统上实现定时执行 Python 邮件发送任务
在这里插入图片描述

文章目录

在这里插入图片描述

引言

在现代化的IT运维、业务监控和自动化流程中,定期通过电子邮件发送报告、监控状态或业务数据是一项非常普遍的需求。例如,每日凌晨发送前一天的销售报表,每小时发送系统性能状态,或每周一发送项目周报。

CentOS,作为一个稳定、可靠的 Linux 发行版,是众多服务器环境的首选。Python 则因其强大的库生态(如 smtplib, email 用于发邮件,pandas, numpy 用于处理数据)和简洁的语法,成为实现这类任务的理想编程语言。

本文将系统地介绍在 CentOS 7 或 CentOS 8 系统上实现这一目标的五种方案:

  1. 经典基石:Cron 作业
  2. 灵活调度:Systemd 定时器
  3. Python 内生方案:APScheduler 库
  4. 企业级任务队列:Celery with Redis
  5. 一体化解决方案:Jenkins CI/CD 作业

方案一:经典基石 - Cron 作业

1. 原理概述

Cron 是 Linux/Unix 系统中最经典、最广泛使用的定时任务调度程序。它由一个后台守护进程 crond 和一系列配置文件(称为 “crontab”)组成。crond 进程会每分钟检查一次所有配置好的任务,判断是否有任务需要执行。

2. 详细实现步骤

步骤 1:编写 Python 邮件发送脚本
首先,我们需要一个完整的、可独立运行的 Python 脚本。假设我们将其保存为 /opt/scripts/email_report.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from datetime import datetime import pandas as pd # 假设需要生成报告# 邮件配置 SMTP_SERVER ="smtp.office365.com" SMTP_PORT =587 SENDER_EMAIL ="[email protected]" SENDER_PASSWORD ="your_secure_password"# 强烈建议使用应用专用密码 RECIPIENT_EMAIL ="[email protected]"defgenerate_report():"""生成邮件正文内容(示例)"""# 这里可以是任何复杂的逻辑:查询数据库、读取文件、调用API等。 report_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") report_data =f""" <h1>每日业务报告</h1> <p>生成时间: {report_time}</p> <table> <tr><th>指标</th><th>数值</th></tr> <tr><td>销售额</td><td>$15,000</td></tr> <tr><td>新用户</td><td>120</td></tr> </table> """return report_data defsend_email(subject, body):"""发送邮件函数""" msg = MIMEMultipart() msg['From']= SENDER_EMAIL msg['To']= RECIPIENT_EMAIL msg['Subject']= subject # 附加HTML内容 msg.attach(MIMEText(body,'html'))try: server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) server.starttls()# 启用加密 server.login(SENDER_EMAIL, SENDER_PASSWORD) server.sendmail(SENDER_EMAIL, RECIPIENT_EMAIL, msg.as_string())print(f"[{datetime.now()}] 邮件发送成功!")except Exception as e:print(f"[{datetime.now()}] 发送失败: {e}")finally: server.quit()if __name__ =="__main__": email_subject =f"每日报告 - {datetime.now().strftime('%Y-%m-%d')}" email_body = generate_report() send_email(email_subject, email_body)

重要安全提示:将密码直接写在脚本中是极不安全的。建议:

  1. 使用环境变量。
  2. 使用配置文件(如 config.ini.env 文件),并严格设置文件权限(如 chmod 600 config.ini)。
  3. 使用密钥管理服务(如 HashiCorp Vault、AWS Secrets Manager)。

步骤 2:确保脚本具有可执行权限

chmod +x /opt/scripts/email_report.py 

您可以通过直接运行它来测试脚本是否正确工作:

/usr/bin/python3 /opt/scripts/email_report.py 

步骤 3:编辑 Crontab 配置文件
Cron 任务可以通过两种方式配置:

  • 用户级:使用 crontab -e 命令编辑当前用户的定时任务。任务以该用户身份执行。
  • 系统级:编辑 /etc/crontab 文件或将在 /etc/cron.d/ 目录下创建文件。需要指定执行任务的用户。

这里我们使用用户级配置(例如,以 root 或一个专门的用户,如 automation):

crontab -e 

如果是第一次使用,会选择编辑器,选择你熟悉的(如 nano)。

步骤 4:编写 Cron 表达式
在打开的编辑器中,添加一行来定义你的任务。Cron 表达式格式如下:

* * * * * /path/to/command arg1 arg2 - - - - - | | | | | | | | | +----- 星期几 (0 - 6) (周日=0 或 7) | | | +------- 月份 (1 - 12) | | +--------- 日期 (1 - 31) | +----------- 小时 (0 - 23) +------------- 分钟 (0 - 59) 

示例

    • 30 2 * * *:每天 2:30 AM。
    • /usr/bin/python3:使用绝对路径指定 Python 解释器,避免因环境变量问题找不到命令。
    • >> /var/log/email_report.log 2>&1:将脚本的标准输出(stdout)和标准错误(stderr)重定向追加到日志文件中,便于调试和审计。确保该日志文件存在且有写入权限(sudo touch /var/log/email_report.log && sudo chmod 666 /var/log/email_report.log 或授权给特定用户)。

每 10 分钟执行一次

*/10 * * * * /usr/bin/python3 /opt/scripts/email_report.py >> /var/log/email_report.log 2>&1 

每周一早上 9:00 执行

0 9 * * 1 /usr/bin/python3 /opt/scripts/email_report.py >> /var/log/email_report.log 2>&1 

每天凌晨 2:30 执行

30 2 * * * /usr/bin/python3 /opt/scripts/email_report.py >> /var/log/email_report.log 2>&1 

保存并退出编辑器(在 nano 中是 Ctrl+X,然后按 Y,最后回车)。

步骤 5:验证与调试

  • 查看所有已配置的 Cron 任务:crontab -l
  • 查看 Cron 日志以排查问题:通常位于 /var/log/cron。使用 tail -f /var/log/cron 实时查看。
  • 检查您指定的任务日志文件:tail -f /var/log/email_report.log
3. 优缺点分析
  • 优点
    • 极其简单:配置快速,学习成本低。
    • 无处不在:所有 Linux 系统都自带,无需安装额外软件。
    • 稳定可靠crond 守护进程经过数十年考验,非常稳定。
  • 缺点
    • 无自动重试:任务如果执行失败,只能等到下一个周期。
    • 依赖环境:任务在独立的子 Shell 中运行,可能无法完全继承用户的所有环境变量(如 PATH),因此必须使用绝对路径。
    • 无任务队列:如果上一次任务执行时间过长,超过了下次任务的开始时间,Cron 会启动新的进程,可能导致资源冲突。
    • 功能单一:仅能按时间调度,无法实现基于依赖、事件或复杂逻辑的调度。
4. 适用场景
  • 简单的、周期性的、无状态的任务。
  • 对可靠性要求不是极端苛刻的场景(例如,偶尔漏发一次报告影响不大)。
  • 系统管理员希望使用最原生、最小依赖的方案。

方案二:灵活调度 - Systemd 定时器

1. 原理概述

Systemd 是现代 CentOS(7 及以后版本)的初始化系统和服务管理器。除了管理服务,它还可以替代 Cron 完成定时任务调度。它通过两种单元文件协同工作:

  • Service 单元(.service):定义要执行什么任务(即你的 Python 脚本)。
  • Timer 单元(.timer):定义何时执行该任务。
2. 详细实现步骤

步骤 1:创建 Systemd Service 文件
Service 文件定义了如何运行我们的脚本。

sudovim /etc/systemd/system/email-report.service 

内容如下:

[Unit] Description=Send daily email report via Python script [Service] Type=oneshot User=automation # 指定运行用户,增强安全性 ExecStart=/usr/bin/python3 /opt/scripts/email_report.py # 可以在这里设置环境变量,更安全 Environment="SMTP_PASSWORD=your_app_specific_password" # 定义工作目录和日志输出 WorkingDirectory=/opt/scripts StandardOutput=journal StandardError=journal 
  • Type=oneshot:表示服务执行一次就会退出,非常适合这种一次性任务。
  • User=automation:使用一个非特权用户来运行任务,遵循最小权限原则。
  • Environment:在这里注入敏感信息(如密码)比在脚本中硬编码更安全。

步骤 2:创建 Systemd Timer 文件
Timer 文件负责调度对应的 Service。

sudovim /etc/systemd/system/email-report.timer 

内容如下:

[Unit] Description=Timer for daily email report Requires=email-report.service [Timer] # 类似 Cron 的定时语法 OnCalendar=*-*-* 02:30:00 # OnCalendar=Mon *-*-* 09:00:00 # 每周一9点 # 可选:如果服务器当时关机了,开机后是否立即执行错过的任务 Persistent=true # 可选:随机延迟,避免所有定时任务同时启动(例如,在30分钟内随机时间执行) RandomizedDelaySec=1800 [Install] WantedBy=timers.target 
  • OnCalendar:使用灵活的时间定义格式。*-*-* 02:30:00 表示每天 2:30 AM。
  • Persistent=true:如果因为系统关机错过了执行时间,下次启动时会立即执行一次,非常适合每日报告这种不容错过的任务。

步骤 3:启用并启动 Timer

# 重新加载 systemd 配置,使其识别新的单元文件sudo systemctl daemon-reload # 启用 Timer,使其在系统启动时自动激活sudo systemctl enable email-report.timer # 立即启动 Timersudo systemctl start email-report.timer 

步骤 4:验证与监控

  • 查看所有活动的 Timer:systemctl list-timers
  • 查看 Timer 的状态:systemctl status email-report.timer
  • 查看 Service 的执行日志(因为输出重定向到了 journal):journalctl -u email-report.service
  • 实时跟踪日志:journalctl -u email-report.service -f
3. 优缺点分析
  • 优点
    • 与系统集成度高:享受 Systemd 的所有功能,如日志管理(journald)、依赖关系、资源控制(cgroups)等。
    • 更精确的时间控制:可以定义相对于其他事件(如启动后、活动结束后)的计时。
    • 错时补偿Persistent=true 选项可以弥补因宕机错过的任务。
    • 更高的安全性:可以方便地以特定用户和组运行,并设置环境变量。
  • 缺点
    • 配置稍复杂:需要创建两个文件,语法与 Cron 不同。
    • 系统依赖性:仅适用于使用 Systemd 的系统(CentOS 7+ 没问题)。
4. 适用场景
  • 已经广泛使用 Systemd 管理的服务器环境。
  • 需要更可靠的任务执行(错后补发)和更丰富的日志功能。
  • 需要对任务进行资源限制(CPU、内存)的情况。

方案三:Python 内生方案 - APScheduler 库

1. 原理概述

APScheduler(Advanced Python Scheduler)是一个纯 Python 库,允许你将调度逻辑直接嵌入到你的 Python 应用程序中。它就像一个“进程内的 Cron”,调度器在你的 Python 进程中运行,并在预定的时间执行你指定的函数。

2. 详细实现步骤

步骤 1:安装 APScheduler

pip3 install apscheduler 

步骤 2:编写一个常驻的 Python 程序
创建一个新的脚本,例如 /opt/scripts/email_scheduler.py。这个脚本将一直运行,并在后台负责调度。

#!/usr/bin/env python3from apscheduler.schedulers.blocking import BlockingScheduler from datetime import datetime import logging # 导入你自己写好的发送邮件函数# 假设 email_report.py 中有一个 main() 函数from email_report import main as send_report_job # 配置日志,方便查看调度情况 logging.basicConfig() logging.getLogger('apscheduler').setLevel(logging.DEBUG)# 创建调度器实例 scheduler = BlockingScheduler()# 添加定时任务@scheduler.scheduled_job('cron', hour=2, minute=30)defscheduled_email_job():print(f"[{datetime.now()}] 定时任务被触发,开始执行发送邮件...")try: send_report_job()# 调用你写好的函数print(f"[{datetime.now()}] 任务执行完成")except Exception as e:print(f"[{datetime.now()}] 任务执行出错: {e}")# 也可以这样添加,效果一样# scheduler.add_job(send_report_job, 'cron', hour=2, minute=30)if __name__ =='__main__':print(f"[{datetime.now()}] 邮件调度服务启动...")try: scheduler.start()# 这是一个阻塞调用,会一直运行直到程序被终止except(KeyboardInterrupt, SystemExit):print(f"[{datetime.now()}] 邮件调度服务被手动终止。")# 可以在这里做一些清理工作 scheduler.shutdown()

步骤 3:让程序在后台持续运行
直接运行 python3 email_scheduler.py 会占用一个终端。我们需要让它作为守护进程运行。

专业方法:使用 Systemd Service(推荐)
创建一个 Systemd Service 文件来管理这个常驻的 Python 程序,这样它可以随系统启动、自动重启、集中日志。

sudovim /etc/systemd/system/email-scheduler.service 
[Unit] Description=Email Scheduler Service with APScheduler [Service] Type=simple User=automation ExecStart=/usr/bin/python3 /opt/scripts/email_scheduler.py WorkingDirectory=/opt/scripts Restart=always # 如果程序意外退出,自动重启 RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target 

然后启用并启动它:

sudo systemctl daemon-reload sudo systemctl enable email-scheduler.service sudo systemctl start email-scheduler.service 

使用 journalctl -u email-scheduler.service -f 查看日志。

简单方法:使用 nohup

nohup python3 /opt/scripts/email_scheduler.py > /var/log/email_scheduler.log 2>&1&
3. 优缺点分析
  • 优点
    • 极致灵活:调度逻辑是代码的一部分,可以实现极其复杂的调度规则(例如,根据前一个任务的结果决定下一个任务的执行时间)。
    • 跨平台:不依赖操作系统本身的调度器,可以在 Windows 等系统上以相同方式工作。
    • 任务协同:所有任务在同一个进程内,可以轻松共享状态和数据。
  • 缺点
    • 单点故障:如果这个 Python 进程崩溃,所有定时任务都会停止,除非配置了 Systemd 的 Restart=always
    • 需要常驻内存:会一直占用一个进程和内存。
    • 增加复杂性:需要编写额外的“包装”代码和管理进程的生命周期。
4. 适用场景
  • 你的应用本身就是一个需要长时间运行的 Python 进程(如 Web 应用使用 Flask/ Django),并希望在应用中集成定时功能。
  • 调度逻辑非常复杂,需要基于代码中的动态状态来决定。
  • 希望获得平台无关的调度解决方案。

方案四:企业级任务队列 - Celery with Redis

1. 原理概述

对于大型、分布式、需要高可靠性的应用,专业的任务队列是首选方案。Celery 是 Python 生态中最著名的分布式任务队列。它由以下几部分组成:

  • Celery Worker:执行任务的“工人”。我们的发送邮件任务就是一个 Celery “任务”。
  • 消息代理(Broker):Worker 和任务派发者之间的中介,负责传递消息。常用 Redis 或 RabbitMQ。
  • 任务派发者(Client):你的程序,调用任务函数,将任务放入 Broker。
  • 后端(Backend):存储任务执行的结果(可选)。

在这个方案中,我们使用 Celery Beat 作为调度器,它定期将任务发送到 Broker,然后由 Worker 取走并执行。

2. 详细实现步骤

步骤 1:安装 Celery 和 Redis

pip3 install celery redis # 安装 Redis 服务器sudo yum install epel-release sudo yum install redis sudo systemctl start redis sudo systemctl enable redis 

步骤 2:编写 Celery 应用和任务
创建 celery_app.py

from celery import Celery from datetime import datetime # 导入你的发送函数from email_report import main as send_report_function # 创建 Celery 实例,指定 Broker 和 Backend(这里都用 Redis) app = Celery('email_tasks', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0')# 定义一个任务@app.taskdefsend_report_task():print(f"[{datetime.now()}] Celery 任务开始执行")try: send_report_function()return"邮件发送成功"except Exception as e:returnf"邮件发送失败: {e}"

步骤 3:配置周期性调度(Beat)
celery_app.py 同一目录下创建 celeryconfig.py

from datetime import timedelta from celery.schedules import crontab # 启用 Beat 调度器 beat_schedule ={'send-daily-report':{'task':'celery_app.send_report_task',# 任务的完整路径'schedule': crontab(hour=2, minute=30),# 每天2:30# 'schedule': timedelta(minutes=10), # 每10分钟},}

步骤 4:启动 Worker 和 Beat
需要启动两个进程:

启动 Beat Scheduler(在另一个终端中):

cd /opt/scripts celery -A celery_app beat --loglevel=info 

启动 Worker(在一个终端中):

cd /opt/scripts celery -A celery_app worker --loglevel=info 

步骤 5:使用 Systemd 管理 Celery(生产环境必须)
为 Celery Worker 和 Beat 分别创建 Systemd service 文件,以便管理和守护化。这是生产环境的标准做法。配置稍复杂,需参考官方文档。

3. 优缺点分析
  • 优点
    • 高可靠性与分布式:Worker 可以分布在多台机器上,Broker 和 Backend 保证了任务不丢失。
    • 高性能与可扩展:可以轻松增加 Worker 数量来处理大量任务。
    • 功能丰富:支持任务重试、速率限制、工作流(链、组)等高级功能。
    • 监控性好:有丰富的工具(如 Flower)来监控任务状态。
  • 缺点
    • 架构最复杂:需要维护额外的组件(Redis/RabbitMQ, Worker, Beat)。
    • 资源消耗大:相比其他方案,占用更多内存和 CPU。
    • 学习曲线陡峭:配置和理解整个系统需要更多时间。
4. 适用场景
  • 大型、复杂的应用系统,已经或计划使用任务队列。
  • 需要执行大量不同类型的异步或定时任务。
  • 需要任务的高可用性、可扩展性和强大的监控能力。

方案五:一体化解决方案 - Jenkins CI/CD 作业

1. 原理概述

Jenkins 虽然是一个主要的 CI/CD(持续集成/持续部署)工具,但其强大的定时构建功能和丰富的插件生态(如 Email Extension Plugin),使其完全可以作为一个通用的任务调度器来使用。

2. 详细实现步骤

步骤 1:安装和配置 Jenkins

# 安装 Javasudo yum install java-11-openjdk-devel # 添加 Jenkins 仓库并安装sudowget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudorpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key sudo yum install jenkins sudo systemctl start jenkins sudo systemctl enable jenkins 

安装完成后,通过浏览器访问 http://<your-server-ip>:8080,完成初始设置。

步骤 2:安装必要插件
在 Jenkins 管理界面中,安装 “Email Extension Plugin”,它提供了更强大的邮件发送功能。

步骤 3:创建 Pipeline 项目

  1. 点击“新建任务”,输入任务名(如 Daily-Email-Report),选择“Pipeline”,点击“确定”。

在“Pipeline”部分,定义可以是“Pipeline script”,直接写入以下内容:

pipeline { agent any triggers {cron('30 2 * * *')// 每天 UTC 时间 2:30。注意 Jenkins 使用 UTC 时区!} stages {stage('Send Report'){ steps { script {// 这里可以直接调用系统上的 Python 脚本 sh ''' # 激活虚拟环境(如果有) source /path/to/venv/bin/activate # 执行脚本 python3 /opt/scripts/email_report.py '''}}}} post { always {// 使用 Jenkins 的邮件功能发送构建结果,这和你脚本发的邮件是两回事 emailext ( subject:"Jenkins Job '${JOB_NAME}' - 构建结果: ${currentBuild.result?:'SUCCESS'}", body:"""项目:${JOB_NAME}\n构建编号:${BUILD_NUMBER}\n构建状态:${currentBuild.result?:'SUCCESS'}\n详情:${BUILD_URL}""", to:"[email protected]")}}}

你也可以选择“Pipeline script from SCM”,将 Pipeline 配置和你的脚本代码一起存入 Git 仓库,实现配置的版本管理。

步骤 4:配置系统邮件(SMTP)
在“系统管理” -> “系统配置”中,找到“邮件通知”或“Extended E-mail Notification”部分,配置你的 SMTP 服务器信息。

3. 优缺点分析
  • 优点
    • 强大的 Web UI:提供非常友好的图形化界面来配置、触发和查看任务历史。
    • 完整的审计日志:每次执行都有详细的日志记录和构建状态。
    • 丰富的生态:无数插件可以集成各种通知、凭证管理(可以安全地存储密码)、权限控制等。
    • 易于手动触发:可以很方便地通过点击按钮来手动运行一次任务。
  • 缺点
    • 重量级:为了发个邮件,需要部署一整个 Jenkins,资源消耗最大。
    • 时区陷阱:Jenkins 默认使用 UTC 时区,配置 Cron 时需要特别注意转换。
    • 概念复杂:需要理解 Jenkins 的 Job、Pipeline、Stage 等概念。
4. 适用场景
  • 团队中已经在使用 Jenkins 作为 CI/CD 工具。
  • 希望获得极佳的任务执行可视化和历史记录。
  • 任务需要复杂的权限控制(如只允许特定用户触发)或与其他 CI/CD 流程集成。

总结与选择建议

方案复杂度可靠性功能丰富度资源开销最佳适用场景
1. Cron极低简单、独立、周期固定的系统级脚本任务。
2. Systemd Timer需要与系统服务集成、要求错时补发、资源控制的定时任务。
3. APScheduler中(需守护)调度逻辑复杂、需要嵌入到现有 Python 应用中的任务。
4. Celery极高极高企业级、分布式、高吞吐量、需要高级功能(重试、工作流)的任务系统。
5. Jenkins高(UI/审计)极高已有 Jenkins 环境,需要强大UI、审计日志和手动触发能力的任务。

最终决策指南

  • 如果你是系统管理员,只想安静地发个邮件:从 Cron 开始,它简单有效。如果担心服务器重启错过任务,升级到 Systemd Timer
  • 如果你是 Python 开发者,任务逻辑很复杂或与应用状态相关:选择 APScheduler
  • 如果你在构建一个大型平台或微服务:投资 Celery,它是专业且面向未来的选择。
  • 如果你的团队是 Jenkins 的重度用户:用 Jenkins 来统一管理各种自动化任务,包括发邮件,是一个合理的选择。

Read more

【openclaw】从提示词到状态机 —— 基于 MEMORY.md 的 Agent 任务栈架构实践

【openclaw】从提示词到状态机 —— 基于 MEMORY.md 的 Agent 任务栈架构实践

目前的 AI Agent 开发中,我们正经历一个关键的范式转移:从单纯的“提示词工程 (Prompt Engineering)”走向系统化的“上下文工程 (Context Engineering)”。 当 Agent 处理长周期、多步骤的复杂任务时,单纯依靠 LLM 自身的上下文窗口必然会导致“上下文腐败 (Context Rot)”——模型会在长对话中迷失最初的目标,甚至产生幻觉。将 MEMORY.md 改造为“任务栈 (Task Stack)”,本质上是为大模型外挂了一个可视化的图灵机状态纸带。 以下是关于这一改造思路的深度技术思考与架构设计。 为什么选择 Markdown?—— “Memory as Documentation” 理念 目前业界对 Agent 的记忆管理主要有两条路线: 1. Memory as Database:使用 Milvus 等向量数据库存储历史。

By Ne0inhk
Spring Boot 视图层与模板引擎

Spring Boot 视图层与模板引擎

Spring Boot 视图层与模板引擎 19.1 学习目标与重点提示 学习目标:掌握Spring Boot视图层与模板引擎的核心概念与使用方法,包括Spring Boot视图层的基本方法、Spring Boot与Thymeleaf的集成、Spring Boot与Freemarker的集成、Spring Boot与Velocity的集成、Spring Boot的静态资源管理、Spring Boot的实际应用场景,学会在实际开发中处理视图层问题。 重点:Spring Boot视图层的基本方法、Spring Boot与Thymeleaf的集成、Spring Boot与Freemarker的集成、Spring Boot与Velocity的集成、Spring Boot的静态资源管理、Spring Boot的实际应用场景。 19.2 Spring Boot视图层概述 Spring Boot视图层是指使用Spring Boot进行Web应用开发的方法。 19.2.1 视图层的定义 定义:视图层是指使用Spring Boot进行Web应用开发的方法。 作用:

By Ne0inhk

Flutter for OpenHarmony: Flutter 三方库 ntp 精准同步鸿蒙设备系统时间(分布式协同授时利器)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 分布式开发、金融交易或具有严格时效性的业务(如:秒杀倒计时、双因素认证 OTP)时,开发者不能完全信任设备本地的系统时间。用户可能为了某种目的手动篡改时间,或者由于网络同步问题导致时间存在偏差。 ntp 软件包提供了一种直接与互联网授时中心(NTP 服务器)通信的能力。它能绕过本地系统时钟,获取绝对精准的 UTC 时间,并计算出本地时间与真实时间的“偏移量(Offset)”。 一、核心授时原理 ntp 通过测量往返网络延迟来消除误差。 发送 NTP 请求 (UDP) 返回高精度时间戳 鸿蒙 App 全球授时中枢 (pool.ntp.org) 计算网络往返耗时 (RTT) 得出绝对时间偏移量 生成鸿蒙业务专用准时 二、

By Ne0inhk
Spring Boot 数据导入导出与报表生成

Spring Boot 数据导入导出与报表生成

Spring Boot 数据导入导出与报表生成 24.1 学习目标与重点提示 学习目标:掌握Spring Boot数据导入导出与报表生成的核心概念与使用方法,包括数据导入导出的定义与特点、Spring Boot与数据导入导出的集成、Spring Boot与数据导入导出的配置、Spring Boot与报表生成的基本方法、Spring Boot的实际应用场景,学会在实际开发中处理数据导入导出与报表生成问题。 重点:数据导入导出的定义与特点、Spring Boot与数据导入导出的集成、Spring Boot与数据导入导出的配置、Spring Boot与报表生成的基本方法、Spring Boot的实际应用场景。 24.2 数据导入导出概述 数据导入导出是Java开发中的重要组件。 24.2.1 数据导入导出的定义 定义:数据导入导出是指将数据从一个系统导入到另一个系统,或从一个系统导出到另一个系统的过程。 作用: * 实现数据的迁移。 * 实现数据的备份。 * 实现数据的共享。 常见的数据导入导出格式: * CSV:Comma-Separated Values,逗号分

By Ne0inhk