@@ -0,0 +1,19 @@ | |||||
package model | |||||
import "time" | |||||
type Message struct { | |||||
Id int64 // 自增主键 | |||||
UserId int64 // 所属类型id | |||||
RequestId int64 // 请求id | |||||
SenderType int32 // 发送者类型 | |||||
SenderId int64 // 发送者账户id | |||||
ReceiverType int32 // 接收者账户id | |||||
ReceiverId int64 // 接收者id,如果是单聊信息,则为user_id,如果是群组消息,则为group_id | |||||
ToUserIds string // 需要@的用户id列表,多个用户用,隔开 | |||||
Type int // 消息类型 | |||||
Content []byte // 消息内容 | |||||
Seq int64 // 消息同步序列 | |||||
SendTime time.Time // 消息发送时间 | |||||
Status int32 // 创建时间 | |||||
} |
@@ -0,0 +1,107 @@ | |||||
package consume | |||||
import ( | |||||
"applet/app/db" | |||||
model2 "applet/app/db/gim/model" | |||||
"applet/app/utils" | |||||
"applet/app/utils/logx" | |||||
"applet/consume/md" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit" | |||||
"encoding/json" | |||||
"errors" | |||||
"fmt" | |||||
"github.com/streadway/amqp" | |||||
) | |||||
func CanalGimMessageConsume(queue md.MqQueue) { | |||||
ch, err := rabbit.Cfg.Pool.GetChannel() | |||||
if err != nil { | |||||
logx.Error(err) | |||||
return | |||||
} | |||||
defer ch.Release() | |||||
//1、将自己绑定到交换机上 | |||||
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey) | |||||
//2、取出数据进行消费 | |||||
ch.Qos(100) | |||||
delivery := ch.Consume(queue.Name, false) | |||||
var res amqp.Delivery | |||||
var ok bool | |||||
for { | |||||
res, ok = <-delivery | |||||
if ok == true { | |||||
//fmt.Println(string(res.Body)) | |||||
fmt.Println(">>>>>>>>>>>>>>>>CanalGimMessageConsume<<<<<<<<<<<<<<<<<<<<<<<<<") | |||||
err = handleCanalGimMessageTable(res.Body) | |||||
if err != nil { | |||||
fmt.Println("err ::: ", err) | |||||
utils.FilePutContents("CanalGimMessageConsume", "[err]:"+err.Error()) | |||||
_ = res.Reject(false) | |||||
////TODO::重新推回队列末尾,避免造成队列堵塞 | |||||
//var msg *md.OneCirclesStructForSignIn | |||||
//json.Unmarshal(res.Body, &msg) | |||||
//ch.Publish(queue.ExchangeName, msg, queue.RoutKey) | |||||
} else { | |||||
_ = res.Ack(true) | |||||
} | |||||
} else { | |||||
panic(errors.New("error getting message")) | |||||
} | |||||
} | |||||
fmt.Println("get msg done") | |||||
} | |||||
func handleCanalGimMessageTable(msg []byte) error { | |||||
//1、解析canal采集至mq中queue的数据结构体 | |||||
var canalMsg *md.CanalGimMessage[md.Message] | |||||
err := json.Unmarshal(msg, &canalMsg) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
//2、判断操作(insert | update) | |||||
if canalMsg.Type == md.CanalMsgInsertSqlType { | |||||
for _, item := range canalMsg.Data { | |||||
var oldM md.Message000 | |||||
get, err := db.ImDb.Table("message_000").ID(item.Id).Get(&oldM) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
if get { | |||||
message := &model2.Message{ | |||||
UserId: oldM.UserId, | |||||
RequestId: oldM.RequestId, | |||||
SenderType: oldM.SenderType, | |||||
SenderId: oldM.SenderId, | |||||
ReceiverType: oldM.ReceiverType, | |||||
ReceiverId: oldM.ReceiverId, | |||||
ToUserIds: oldM.ToUserIds, | |||||
Type: oldM.Type, | |||||
Content: oldM.Content, | |||||
Seq: oldM.Seq, | |||||
SendTime: oldM.SendTime, | |||||
Status: oldM.Status, | |||||
} | |||||
_, err = db.ImDb.InsertOne(message) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
} | |||||
} | |||||
} | |||||
if canalMsg.Type == md.CanalMsgUpdateSqlType { | |||||
//查找是否有数据 | |||||
m := new(model2.Message) | |||||
for _, item := range canalMsg.Data { | |||||
m.Status = int32(utils.StrToInt(item.Status)) | |||||
_, err2 := db.ImDb.Where("user_id =?", item.UserId).And("send_time =?", item.SendTime).Cols("status").Update(&m) | |||||
if err2 != nil { | |||||
return err2 | |||||
} | |||||
} | |||||
} | |||||
return nil | |||||
} |
@@ -103,8 +103,10 @@ func initConsumes() { | |||||
//jobs[consumeMd.InstallmentPaymentAutoRepaidConsumeFunName] = InstallmentPaymentAutoRepaidConsume //分期付 - 自动扣款 | //jobs[consumeMd.InstallmentPaymentAutoRepaidConsumeFunName] = InstallmentPaymentAutoRepaidConsume //分期付 - 自动扣款 | ||||
////////////////////////////////////// SuperCloudIssuance ///////////////////////////////////////////////////// | ////////////////////////////////////// SuperCloudIssuance ///////////////////////////////////////////////////// | ||||
jobs[consumeMd.SuperCloudIssuanceMsgCallBackFunName] = SuperCloudIssuanceMsgCallBackConsume | |||||
jobs[consumeMd.SuperCloudIssuanceAsyncMLoginFunName] = SuperCloudIssuanceAsyncMLoginConsume | |||||
//jobs[consumeMd.SuperCloudIssuanceMsgCallBackFunName] = SuperCloudIssuanceMsgCallBackConsume | |||||
//jobs[consumeMd.SuperCloudIssuanceAsyncMLoginFunName] = SuperCloudIssuanceAsyncMLoginConsume | |||||
jobs[consumeMd.CanalGimMessageConsumeFunName] = CanalGimMessageConsume | |||||
} | } | ||||
func Run() { | func Run() { | ||||
@@ -83,6 +83,15 @@ var RabbitMqQueueKeyList = []*MqQueue{ | |||||
BindKey: "", | BindKey: "", | ||||
ConsumeFunName: "CanalGuideOrderForNumericalStatementConsume", | ConsumeFunName: "CanalGuideOrderForNumericalStatementConsume", | ||||
}, | }, | ||||
{ | |||||
ExchangeName: "canal.topic", | |||||
Name: "canal_gim_message", | |||||
Type: TopicQueueType, | |||||
IsPersistent: false, | |||||
RoutKey: "canal_gim_message", | |||||
BindKey: "", | |||||
ConsumeFunName: "CanalGimMessageConsume", | |||||
}, | |||||
{ | { | ||||
ExchangeName: "canal.topic", | ExchangeName: "canal.topic", | ||||
Name: "canal_guide_order", | Name: "canal_guide_order", | ||||
@@ -625,4 +634,5 @@ const ( | |||||
ZhiosUserProfileInviteCode = "ZhiosUserProfileInviteCode" | ZhiosUserProfileInviteCode = "ZhiosUserProfileInviteCode" | ||||
ZhiosAutoUnFreeze = "ZhiosAutoUnFreeze" | ZhiosAutoUnFreeze = "ZhiosAutoUnFreeze" | ||||
InstallmentPaymentAutoRepaidConsumeFunName = "InstallmentPaymentAutoRepaidConsume" | InstallmentPaymentAutoRepaidConsumeFunName = "InstallmentPaymentAutoRepaidConsume" | ||||
CanalGimMessageConsumeFunName = "CanalGimMessageConsume" | |||||
) | ) |
@@ -0,0 +1,50 @@ | |||||
package md | |||||
import "time" | |||||
type Message struct { | |||||
Id string `json:"id"` | |||||
UserId string `json:"user_id"` | |||||
RequestId string `json:"request_id"` | |||||
SenderType string `json:"sender_type"` | |||||
SenderId string `json:"sender_id"` | |||||
ReceiverType string `json:"receiver_type"` | |||||
ReceiverId string `json:"receiver_id"` | |||||
ToUserIds string `json:"to_user_ids"` | |||||
Type string `json:"type"` | |||||
Content string `json:"content"` | |||||
Seq string `json:"seq"` | |||||
SendTime string `json:"send_time"` | |||||
Status string `json:"status"` | |||||
CreateTime string `json:"create_time"` | |||||
UpdateTime string `json:"update_time"` | |||||
} | |||||
type Message000 struct { | |||||
Id int64 // 自增主键 | |||||
UserId int64 // 所属类型id | |||||
RequestId int64 // 请求id | |||||
SenderType int32 // 发送者类型 | |||||
SenderId int64 // 发送者账户id | |||||
ReceiverType int32 // 接收者账户id | |||||
ReceiverId int64 // 接收者id,如果是单聊信息,则为user_id,如果是群组消息,则为group_id | |||||
ToUserIds string // 需要@的用户id列表,多个用户用,隔开 | |||||
Type int // 消息类型 | |||||
Content []byte // 消息内容 | |||||
Seq int64 // 消息同步序列 | |||||
SendTime time.Time // 消息发送时间 | |||||
Status int32 // 创建时间 | |||||
} | |||||
type CanalGimMessage[T any] struct { | |||||
Data []T `json:"data"` | |||||
Database string `json:"database"` | |||||
ES int64 `json:"es"` | |||||
ID int64 `json:"id"` | |||||
IsDdl bool `json:"isDdl"` | |||||
Old []T `json:"old"` | |||||
PkNames []string `json:"pkNames"` | |||||
Table string `json:"table"` | |||||
TS int64 `json:"ts"` | |||||
Type string `json:"type"` | |||||
} |