2023-06-30 11:24:37 +08:00
package tools
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"
2024-12-25 18:08:08 +08:00
kdisc "github.com/openimsdk/open-im-server/v3/pkg/common/discovery"
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-01-04 20:21:21 +08:00
"github.com/openimsdk/tools/discovery/etcd"
2024-08-01 16:12:41 +08:00
2024-04-28 11:47:05 +08:00
"github.com/openimsdk/tools/mcontext"
"github.com/openimsdk/tools/mw"
2024-12-07 17:35:42 +08:00
"github.com/openimsdk/tools/utils/runtimeenv"
2024-04-28 11:47:05 +08:00
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
2023-06-30 11:24:37 +08:00
2024-04-19 22:23:08 +08:00
"github.com/openimsdk/tools/errs"
"github.com/openimsdk/tools/log"
2024-03-06 15:58:05 +08:00
"github.com/robfig/cron/v3"
2023-06-30 11:24:37 +08:00
)
2024-04-19 22:23:08 +08:00
type CronTaskConfig struct {
2024-05-14 18:21:36 +08:00
CronTask config . CronTask
Share config . Share
Discovery config . Discovery
2024-12-07 17:35:42 +08:00
runTimeEnv string
2024-04-19 22:23:08 +08:00
}
2025-01-04 20:21:21 +08:00
func Start ( ctx context . Context , conf * CronTaskConfig ) error {
conf . runTimeEnv = runtimeenv . PrintRuntimeEnvironment ( )
2024-12-07 17:35:42 +08:00
2025-01-04 20:21:21 +08:00
log . CInfo ( ctx , "CRON-TASK server is initializing" , "runTimeEnv" , conf . runTimeEnv , "chatRecordsClearTime" , conf . CronTask . CronExecuteTime , "msgDestructTime" , conf . CronTask . RetainChatRecords )
if conf . CronTask . RetainChatRecords < 1 {
2024-04-28 11:47:05 +08:00
return errs . New ( "msg destruct time must be greater than 1" ) . Wrap ( )
2023-11-13 15:21:54 +08:00
}
2025-01-04 20:21:21 +08:00
client , err := kdisc . NewDiscoveryRegister ( & conf . Discovery , conf . runTimeEnv , nil )
2023-06-30 11:24:37 +08:00
if err != nil {
2024-04-28 11:47:05 +08:00
return errs . WrapMsg ( err , "failed to register discovery service" )
2023-07-12 15:31:24 +08:00
}
2024-04-28 11:47:05 +08:00
client . AddOption ( mw . GrpcClient ( ) , grpc . WithTransportCredentials ( insecure . NewCredentials ( ) ) )
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 )
}
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 ) ,
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 ( )
2024-04-28 11:47:05 +08:00
<- ctx . Done ( )
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
config * CronTaskConfig
cron * cron . Cron
msgClient msg . MsgClient
conversationClient pbconversation . ConversationClient
thirdClient third . ThirdClient
}
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
}
_ , err := c . cron . AddFunc ( c . config . CronTask . CronExecuteTime , c . clearS3 )
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
}
_ , err := c . cron . AddFunc ( c . config . CronTask . CronExecuteTime , c . deleteMsg )
return errs . WrapMsg ( err , "failed to register delete msg cron task" )
}
func ( c * cronServer ) registerClearUserMsg ( ) error {
_ , err := c . cron . AddFunc ( c . config . CronTask . CronExecuteTime , c . clearUserMsg )
return errs . WrapMsg ( err , "failed to register clear user msg cron task" )
}