2025-02-14 16:18:27 +08:00
package cron
2023-06-30 11:24:37 +08:00
import (
"context"
2025-01-04 20:21:21 +08:00
2024-04-19 22:23:08 +08:00
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
2025-01-04 20:21:21 +08:00
disetcd "github.com/openimsdk/open-im-server/v3/pkg/common/discovery/etcd"
2024-08-01 16:12:41 +08:00
pbconversation "github.com/openimsdk/protocol/conversation"
2024-04-28 11:47:05 +08:00
"github.com/openimsdk/protocol/msg"
2024-11-29 16:59:24 +08:00
"github.com/openimsdk/protocol/third"
2025-02-14 16:18:27 +08:00
"github.com/openimsdk/tools/discovery"
2025-01-04 20:21:21 +08:00
"github.com/openimsdk/tools/discovery/etcd"
2024-08-01 16:12:41 +08:00
2024-04-19 22:23:08 +08:00
"github.com/openimsdk/tools/errs"
"github.com/openimsdk/tools/log"
2025-02-14 16:18:27 +08:00
"github.com/openimsdk/tools/mcontext"
"github.com/openimsdk/tools/utils/runtimeenv"
2024-03-06 15:58:05 +08:00
"github.com/robfig/cron/v3"
2025-02-14 16:18:27 +08:00
"google.golang.org/grpc"
2023-06-30 11:24:37 +08:00
)
2025-02-14 16:18:27 +08:00
type Config struct {
2024-05-14 18:21:36 +08:00
CronTask config . CronTask
Share config . Share
Discovery config . Discovery
2024-04-19 22:23:08 +08:00
}
2025-02-14 16:18:27 +08:00
func Start ( ctx context . Context , conf * Config , client discovery . Conn , service grpc . ServiceRegistrar ) error {
log . CInfo ( ctx , "CRON-TASK server is initializing" , "runTimeEnv" , runtimeenv . RuntimeEnvironment ( ) , "chatRecordsClearTime" , conf . CronTask . CronExecuteTime , "msgDestructTime" , conf . CronTask . RetainChatRecords )
2025-01-04 20:21:21 +08:00
if conf . CronTask . RetainChatRecords < 1 {
2025-02-14 16:18:27 +08:00
log . ZInfo ( ctx , "disable cron" )
<- ctx . Done ( )
return nil
2023-07-12 15:31:24 +08:00
}
2025-01-04 20:21:21 +08:00
ctx = mcontext . SetOpUserID ( ctx , conf . Share . IMAdminUserID [ 0 ] )
2024-08-01 16:12:41 +08:00
2025-01-04 20:21:21 +08:00
msgConn , err := client . GetConn ( ctx , conf . Discovery . RpcService . Msg )
2023-07-19 10:47:28 +08:00
if err != nil {
2024-04-28 11:47:05 +08:00
return err
2023-11-13 15:21:54 +08:00
}
2024-08-01 16:12:41 +08:00
2025-01-04 20:21:21 +08:00
thirdConn , err := client . GetConn ( ctx , conf . Discovery . RpcService . Third )
2024-11-29 16:59:24 +08:00
if err != nil {
return err
}
2024-08-01 16:12:41 +08:00
2025-01-04 20:21:21 +08:00
conversationConn , err := client . GetConn ( ctx , conf . Discovery . RpcService . Conversation )
2024-08-01 16:12:41 +08:00
if err != nil {
return err
}
2025-01-04 20:21:21 +08:00
if conf . Discovery . Enable == config . ETCD {
cm := disetcd . NewConfigManager ( client . ( * etcd . SvcDiscoveryRegistryImpl ) . GetClient ( ) , [ ] string {
conf . CronTask . GetConfigFileName ( ) ,
conf . Share . GetConfigFileName ( ) ,
conf . Discovery . GetConfigFileName ( ) ,
} )
cm . Watch ( ctx )
}
2025-06-06 14:25:58 +08:00
locker , err := NewEtcdLocker ( client . ( * etcd . SvcDiscoveryRegistryImpl ) . GetClient ( ) )
if err != nil {
return err
}
2024-12-20 15:45:37 +08:00
srv := & cronServer {
ctx : ctx ,
2025-01-04 20:21:21 +08:00
config : conf ,
2024-12-20 15:45:37 +08:00
cron : cron . New ( ) ,
msgClient : msg . NewMsgClient ( msgConn ) ,
conversationClient : pbconversation . NewConversationClient ( conversationConn ) ,
thirdClient : third . NewThirdClient ( thirdConn ) ,
2025-06-06 14:25:58 +08:00
locker : locker ,
2023-11-13 15:21:54 +08:00
}
2024-07-16 10:46:21 +08:00
2024-12-20 15:45:37 +08:00
if err := srv . registerClearS3 ( ) ; err != nil {
return err
2024-07-16 10:46:21 +08:00
}
2024-12-20 15:45:37 +08:00
if err := srv . registerDeleteMsg ( ) ; err != nil {
return err
2024-11-29 16:59:24 +08:00
}
2024-12-20 15:45:37 +08:00
if err := srv . registerClearUserMsg ( ) ; err != nil {
return err
2024-11-29 16:59:24 +08:00
}
2025-01-04 20:21:21 +08:00
log . ZDebug ( ctx , "start cron task" , "CronExecuteTime" , conf . CronTask . CronExecuteTime )
2024-12-20 15:45:37 +08:00
srv . cron . Start ( )
2025-02-14 16:18:27 +08:00
log . ZDebug ( ctx , "cron task server is running" )
2024-04-28 11:47:05 +08:00
<- ctx . Done ( )
2025-02-14 16:18:27 +08:00
log . ZDebug ( ctx , "cron task server is shutting down" )
2025-06-06 14:25:58 +08:00
srv . cron . Stop ( )
2024-05-07 21:05:41 +08:00
return nil
2023-11-13 15:21:54 +08:00
}
2024-12-20 15:45:37 +08:00
type cronServer struct {
ctx context . Context
2025-02-14 16:18:27 +08:00
config * Config
2024-12-20 15:45:37 +08:00
cron * cron . Cron
msgClient msg . MsgClient
conversationClient pbconversation . ConversationClient
thirdClient third . ThirdClient
2025-06-06 14:25:58 +08:00
locker * EtcdLocker
2024-12-20 15:45:37 +08:00
}
func ( c * cronServer ) registerClearS3 ( ) error {
if c . config . CronTask . FileExpireTime <= 0 || len ( c . config . CronTask . DeleteObjectType ) == 0 {
log . ZInfo ( c . ctx , "disable scheduled cleanup of s3" , "fileExpireTime" , c . config . CronTask . FileExpireTime , "deleteObjectType" , c . config . CronTask . DeleteObjectType )
return nil
}
2025-06-06 14:25:58 +08:00
_ , err := c . cron . AddFunc ( c . config . CronTask . CronExecuteTime , func ( ) {
c . locker . ExecuteWithLock ( c . ctx , "clearS3" , c . clearS3 )
} )
2024-12-20 15:45:37 +08:00
return errs . WrapMsg ( err , "failed to register clear s3 cron task" )
}
func ( c * cronServer ) registerDeleteMsg ( ) error {
if c . config . CronTask . RetainChatRecords <= 0 {
log . ZInfo ( c . ctx , "disable scheduled cleanup of chat records" , "retainChatRecords" , c . config . CronTask . RetainChatRecords )
return nil
}
2025-06-06 14:25:58 +08:00
_ , err := c . cron . AddFunc ( c . config . CronTask . CronExecuteTime , func ( ) {
c . locker . ExecuteWithLock ( c . ctx , "deleteMsg" , c . deleteMsg )
} )
2024-12-20 15:45:37 +08:00
return errs . WrapMsg ( err , "failed to register delete msg cron task" )
}
func ( c * cronServer ) registerClearUserMsg ( ) error {
2025-06-06 14:25:58 +08:00
_ , err := c . cron . AddFunc ( c . config . CronTask . CronExecuteTime , func ( ) {
c . locker . ExecuteWithLock ( c . ctx , "clearUserMsg" , c . clearUserMsg )
} )
2024-12-20 15:45:37 +08:00
return errs . WrapMsg ( err , "failed to register clear user msg cron task" )
}