Эх сурвалжийг харах

添加定时任务-切换预处理索引别名

wcc 1 жил өмнө
parent
commit
fb82e0651d

+ 6 - 1
README.md

@@ -53,4 +53,9 @@
         省级项目        16           bidding
     
         利用二进制,比如 1101 就代表 第一位、第三位和第四位的字段打上了标签,即:招标公告、招标结果、招标信用 三个标签;
-        以此类推;最终数据库只会存储一个数字,比如 1101 转换成 10进制数字 13 进行存储。
+        以此类推;最终数据库只会存储一个数字,比如 1101 转换成 10进制数字 13 进行存储。
+
+### pre_extract
+
+* 1. 读取 bidding_file  bidding_nomal 数据表,然后拿到 分类好的数据段,传递抽取程序去处理。
+* 2. 定时 创建索引结构;可以每天创建一个或者每月创建一个

+ 2 - 0
pre_extract/config.go

@@ -15,6 +15,8 @@ type EnvConf struct {
 	NextPort   string
 	LocalPort  string
 	Spec       string
+	SwitchSpec string
+	Alias      string
 	SpecType   string
 	Send       bool
 }

+ 2 - 0
pre_extract/config.toml

@@ -25,6 +25,8 @@
     send = false                ## 是否给抽取发送数据;正式环境应为 true
     spec = "0 00 23 * * *"      ## 每天23点执行;//已日更新的方式创建索引
     ## spec = "0 00 01 * * *"   ## 每天01点执行;适合 按照月份创建索引
+    switchspec = "50 59 23 * * *"    ## 切换索引别名的定时任务
+    alias = "bidding_pre"       ## 预处理索引别名
     spectype = "day" ## 定时任务类型;正式环境应该是 month 。day 表示每天创建一个索引;month 表示每个月创建一个
 
 [es]

+ 57 - 0
pre_extract/es.go

@@ -402,6 +402,63 @@ func dealIndexByMonth() {
 
 }
 
+//SwitchAlias 切换别名
+func SwitchAlias() {
+	now := time.Now()
+	// 判断当前时间是否为当前月份的最后一天
+	//按日创建索引
+	if GF.Env.SpecType == "day" {
+		dealAlias()
+	} else if GF.Env.SpecType == "month" {
+		// 获取当前月份的最后一天
+		lastDayOfMonth := time.Date(now.Year(), now.Month()+1, 0, 0, 0, 0, 0, time.UTC)
+		//按月创建索引
+		if now.Day() == lastDayOfMonth.Day() {
+			dealAlias()
+		}
+	}
+}
+
+func dealAlias() {
+	now := time.Now()
+	url := GF.ES.URL
+	username := GF.ES.Username
+	password := GF.ES.Password
+
+	// 创建 Elasticsearch 客户端
+	client, err := elastic.NewClient(
+		elastic.SetURL(url),
+		elastic.SetBasicAuth(username, password),
+		elastic.SetSniff(false),
+	)
+	if err != nil {
+		log.Error("创建 Elasticsearch 客户端失败:", zap.Error(err))
+	}
+	next := now.AddDate(0, 0, 1)
+	month := int(next.Month())
+	monthStr := strconv.Itoa(month)
+	year := next.Year()
+	yearStr := strconv.Itoa(year)
+	//下一个月的索引名称
+	preBiddingIndex := "bidding_" + yearStr + monthStr
+
+	month2 := int(now.Month())
+	monthStr2 := strconv.Itoa(month2)
+	year2 := now.Year()
+	yearStr2 := strconv.Itoa(year2)
+	//当前;的索引名称
+	currIndex := "bidding_" + yearStr2 + monthStr2
+
+	_, err = client.Alias().Add(preBiddingIndex, GF.Env.Alias).Do(context.Background())
+	if err != nil {
+		log.Error("添加别名失败:", zap.Error(err))
+	}
+	_, err = client.Alias().Remove(currIndex, GF.Env.Alias).Do(context.Background())
+	if err != nil {
+		log.Error("删除别名失败:", zap.Error(err))
+	}
+}
+
 //SendMail 发送邮件
 func SendMail(title, content string) {
 	url := fmt.Sprintf("%s?to=%s&title=%s&body=%s", GF.Email.Api, GF.Email.To, title, content)

+ 7 - 0
pre_extract/main.go

@@ -70,9 +70,16 @@ func main() {
 		}
 	}
 
+	//切换别名-定时任务
+	_, err := c.AddFunc(GF.Env.SwitchSpec, SwitchAlias)
+	if err != nil {
+		log.Info("main", zap.Any("AddFunc err", err))
+	}
+
 	c.Start()
 	defer c.Stop()
 
+	//发送数据给抽取
 	if GF.Env.Send {
 		go SendPreData()
 	}

+ 30 - 0
pre_extract/pre_test.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	"fmt"
+	"github.com/robfig/cron/v3"
 	"strconv"
 	"testing"
 	"time"
@@ -21,3 +22,32 @@ func TestMonth(T *testing.T) {
 	PreBiddingIndex := "bidding_" + yearStr + monthStr
 	fmt.Sprintf(PreBiddingIndex)
 }
+
+func TestCronExpression(t *testing.T) {
+	// 模拟指定时间
+	//testTime := time.Date(2022, time.January, 31, 23, 59, 59, 0, time.UTC)
+	//c := cron.New(cron.WithLocation(testTime.Local().Location()))
+
+	local, _ := time.LoadLocation("Asia/Shanghai")
+	c := cron.New(cron.WithLocation(local), cron.WithSeconds())
+
+	// 定义一个任务函数
+	task := func() {
+		fmt.Println("222222")
+	}
+	// 创建一个cron表达式
+	spec := "* * * * * *"
+	//spec := "59 59 23 * * *"
+
+	// 将任务和cron表达式添加到调度器中,并使用测试时间
+	_, err := c.AddFunc(spec, task)
+	if err != nil {
+		t.Fatalf("添加定时任务失败:%v", err)
+	}
+
+	// 启动调度器
+	c.Start()
+	defer c.Stop()
+
+	select {}
+}