写一段go代码,根据数据库中获取的字段,确定每周几某个时刻执行任务,任务为重复3次生成csv文件
时间: 2024-03-09 10:51:45 浏览: 59
好的,下面是一个简单的示例代码,用于实现你的需求:
```go
package main
import (
"database/sql"
"encoding/csv"
"fmt"
"time"
"github.com/gorhill/cronexpr"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 连接数据库
db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/database")
if err != nil {
panic(err)
}
defer db.Close()
// 查询需要执行的任务
rows, err := db.Query("SELECT id, cron, filename FROM tasks WHERE status = 1")
if err != nil {
panic(err)
}
defer rows.Close()
// 遍历查询结果
for rows.Next() {
var id int
var cron, filename string
if err := rows.Scan(&id, &cron, &filename); err != nil {
panic(err)
}
// 解析 cron 表达式
expr, err := cronexpr.Parse(cron)
if err != nil {
panic(err)
}
// 获取下一个执行时间
nextTime := expr.Next(time.Now())
// 创建定时任务
timer := time.NewTimer(nextTime.Sub(time.Now()))
// 执行任务
go func(id int, filename string) {
// 等待定时器到期
<-timer.C
// 重复执行任务 3 次
for i := 0; i < 3; i++ {
// 生成 csv 文件
if err := generateCSV(filename); err != nil {
fmt.Printf("Error generating CSV file for task %d: %v\n", id, err)
}
// 等待下一次执行时间
nextTime = expr.Next(nextTime)
timer.Reset(nextTime.Sub(time.Now()))
<-timer.C
}
fmt.Printf("Task %d completed\n", id)
}(id, filename)
}
// 等待所有任务完成
select {}
}
func generateCSV(filename string) error {
// 打开文件
file, err := openFile(filename)
if err != nil {
return err
}
defer file.Close()
// 写入 csv 数据
writer := csv.NewWriter(file)
writer.Write([]string{"Name", "Age", "Gender"})
writer.Write([]string{"Tom", "20", "Male"})
writer.Write([]string{"Mary", "25", "Female"})
writer.Flush()
return nil
}
func openFile(filename string) (*os.File, error) {
// 生成文件名
now := time.Now().Format("20060102_150405")
path := fmt.Sprintf("%s_%s.csv", filename, now)
// 创建文件
file, err := os.Create(path)
if err != nil {
return nil, err
}
return file, nil
}
```
上述代码中,我们首先通过 SQL 查询语句获取需要执行的任务的信息,然后遍历查询结果,解析 cron 表达式并创建定时任务,在定时任务中执行 generateCSV 函数生成 csv 文件。generateCSV 函数中,我们使用 encoding/csv 包来生成 csv 文件。在生成 csv 文件时,我们根据当前时间生成一个带有时间戳的文件名,避免文件名重复。
需要注意的是,上述代码中使用了 gorhill/cronexpr 库来解析 cron 表达式,并使用了 time.Timer 类型来实现定时任务。当定时任务执行次数较多时,可能需要使用更高级的定时任务库来管理任务。
阅读全文