From 9f867b81cbc113056d839799f2b054bfcf239324 Mon Sep 17 00:00:00 2001 From: away <1819625428@qq.com> Date: Mon, 28 Jun 2021 15:42:25 +0800 Subject: [PATCH] add time task server --- src/timed_task/open_im_timed_task.go | 42 +++++++++++++++++++++++++ src/timed_task/timed_task/init.go | 26 +++++++++++++++ src/timed_task/timed_task/timed_task.go | 26 +++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 src/timed_task/open_im_timed_task.go create mode 100644 src/timed_task/timed_task/init.go create mode 100644 src/timed_task/timed_task/timed_task.go diff --git a/src/timed_task/open_im_timed_task.go b/src/timed_task/open_im_timed_task.go new file mode 100644 index 000000000..f6cd87a67 --- /dev/null +++ b/src/timed_task/open_im_timed_task.go @@ -0,0 +1,42 @@ +package main + +import ( + "Open_IM/src/common/config" + "Open_IM/src/common/db" + "fmt" + "time" +) + +func main() { + for { + fmt.Println("start delete mongodb expired record") + timeUnixBegin := time.Now().Unix() + count, _ := db.DB.MgoUserCount() + fmt.Println("mongodb record count: ", count) + for i := 0; i < count; i++ { + time.Sleep(1 * time.Millisecond) + uid, _ := db.DB.MgoSkipUID(i) + fmt.Println("operate uid: ", uid) + err := db.DB.DelUserChat(uid) + if err != nil { + fmt.Println("operate uid failed: ", uid, err.Error()) + } + } + + timeUnixEnd := time.Now().Unix() + costTime := timeUnixEnd - timeUnixBegin + if costTime > int64(config.Config.Mongo.DBRetainChatRecords*24*3600) { + continue + } else { + sleepTime := 0 + if int64(config.Config.Mongo.DBRetainChatRecords*24*3600)-costTime > 24*3600 { + sleepTime = 24 * 3600 + } else { + sleepTime = config.Config.Mongo.DBRetainChatRecords*24*3600 - int(costTime) + } + fmt.Println("sleep: ", sleepTime) + time.Sleep(time.Duration(sleepTime) * time.Second) + } + } + +} diff --git a/src/timed_task/timed_task/init.go b/src/timed_task/timed_task/init.go new file mode 100644 index 000000000..8ee5d9452 --- /dev/null +++ b/src/timed_task/timed_task/init.go @@ -0,0 +1,26 @@ +package timed_task + +type TimeTask struct { + delMgoChatChan chan bool +} + +var timeTask TimeTask + +func GetInstance() *TimeTask { + if timeTask.delMgoChatChan == nil { + timeTask.delMgoChatChan = make(chan bool) + go func() { + timeTask.delMgoChatChan <- true + }() + } + return &timeTask +} + +func (t *TimeTask) Run() { + for { + select { + case <-t.delMgoChatChan: + t.timedDeleteUserChat() + } + } +} diff --git a/src/timed_task/timed_task/timed_task.go b/src/timed_task/timed_task/timed_task.go new file mode 100644 index 000000000..a2626dd6e --- /dev/null +++ b/src/timed_task/timed_task/timed_task.go @@ -0,0 +1,26 @@ +package timed_task + +import ( + "Open_IM/src/common/db" + "time" +) + +func (t *TimeTask) timedDeleteUserChat() { + now := time.Now() + next := now.Add(time.Hour * 24) + next = time.Date(next.Year(), next.Month(), next.Day(), 0, 0, 0, 0, next.Location()) + tm := time.NewTimer(next.Sub(now)) + + <-tm.C + + count, _ := db.DB.MgoUserCount() + for i := 0; i < count; i++ { + time.Sleep(10 * time.Millisecond) + uid, _ := db.DB.MgoSkipUID(i) + db.DB.DelUserChat(uid) + } + + go func() { + t.delMgoChatChan <- true + }() +}