fix
This commit is contained in:
parent
5871da7b54
commit
fef9f8d390
|
@ -18,6 +18,7 @@ type ServiceContext struct {
|
||||||
{{.middleware}}
|
{{.middleware}}
|
||||||
MysqlConn *gorm.DB
|
MysqlConn *gorm.DB
|
||||||
AllModels *gmodel.AllModelsGen
|
AllModels *gmodel.AllModelsGen
|
||||||
|
RabbitMq *initalize.RabbitMqHandle
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewServiceContext(c {{.config}}) *ServiceContext {
|
func NewServiceContext(c {{.config}}) *ServiceContext {
|
||||||
|
@ -26,6 +27,7 @@ func NewServiceContext(c {{.config}}) *ServiceContext {
|
||||||
Config: c,
|
Config: c,
|
||||||
MysqlConn: initalize.InitMysql(c.SourceMysql),
|
MysqlConn: initalize.InitMysql(c.SourceMysql),
|
||||||
AllModels: gmodel.NewAllModels(initalize.InitMysql(c.SourceMysql)),
|
AllModels: gmodel.NewAllModels(initalize.InitMysql(c.SourceMysql)),
|
||||||
|
RabbitMq:initalize.InitRabbitMq(c.SourceRabbitMq, nil),
|
||||||
{{.middlewareAssignment}}
|
{{.middlewareAssignment}}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,22 +2,28 @@ package initalize
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
"errors"
|
||||||
"fusenapi/constants"
|
"fusenapi/constants"
|
||||||
"github.com/streadway/amqp"
|
"github.com/streadway/amqp"
|
||||||
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
"log"
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
// handle
|
type RabbitMqHandle struct {
|
||||||
type QueueItem struct {
|
|
||||||
Ch *amqp.Channel
|
|
||||||
Queue amqp.Queue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var mapMq = make(map[string]*QueueItem)
|
// 连接属性
|
||||||
|
type queueItem struct {
|
||||||
|
ch *amqp.Channel
|
||||||
|
queue amqp.Queue
|
||||||
|
}
|
||||||
|
|
||||||
func InitRabbitMq(url string, config *tls.Config) {
|
// 存储连接
|
||||||
|
var mapMq = make(map[constants.RABBIT_MQ]queueItem)
|
||||||
|
|
||||||
|
func InitRabbitMq(url string, config *tls.Config) *RabbitMqHandle {
|
||||||
if url == "" {
|
if url == "" {
|
||||||
return
|
return nil
|
||||||
}
|
}
|
||||||
conn, err := amqp.DialTLS(url, config)
|
conn, err := amqp.DialTLS(url, config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -39,13 +45,76 @@ func InitRabbitMq(url string, config *tls.Config) {
|
||||||
nil, // 其他参数
|
nil, // 其他参数
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
conn.Close()
|
|
||||||
ch.Close()
|
|
||||||
log.Fatalf("Failed to declare a queue: %v", err)
|
log.Fatalf("Failed to declare a queue: %v", err)
|
||||||
}
|
}
|
||||||
mapMq[string(queueName)] = &QueueItem{
|
mapMq[queueName] = queueItem{
|
||||||
Ch: ch,
|
ch: ch,
|
||||||
Queue: q,
|
queue: q,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return &RabbitMqHandle{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送消息
|
||||||
|
func (h *RabbitMqHandle) SendMsg(queueName constants.RABBIT_MQ, message []byte) error {
|
||||||
|
object, ok := mapMq[queueName]
|
||||||
|
if !ok {
|
||||||
|
return errors.New("unknown queue")
|
||||||
|
}
|
||||||
|
// 发送消息到队列
|
||||||
|
return object.ch.Publish(
|
||||||
|
"", // exchange,如果为空,则使用默认交换机
|
||||||
|
object.queue.Name, // routing key,将消息发送到指定队列
|
||||||
|
false, // 是否等待服务器响应
|
||||||
|
false, // 是否立即发送
|
||||||
|
amqp.Publishing{
|
||||||
|
ContentType: "text/plain", //普通文本
|
||||||
|
Body: message,
|
||||||
|
}, // 消息内容
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 消费消息
|
||||||
|
func (h *RabbitMqHandle) Consume(queueName constants.RABBIT_MQ, handleFunc func(data []byte) error) error {
|
||||||
|
object, ok := mapMq[queueName]
|
||||||
|
if !ok {
|
||||||
|
return errors.New("unknown queue")
|
||||||
|
}
|
||||||
|
msgs, err := object.ch.Consume(
|
||||||
|
object.queue.Name, // 队列名
|
||||||
|
"", // 消费者名,如果为空,则是随机生成一个
|
||||||
|
false, // 自动应答
|
||||||
|
false, // 是否排他
|
||||||
|
false, // 是否阻塞
|
||||||
|
false, // 是否等待服务器响应
|
||||||
|
nil, // 其他参数
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to register a consumer: %v", err)
|
||||||
|
}
|
||||||
|
//允许20的并发
|
||||||
|
limit := make(chan struct{}, 20)
|
||||||
|
defer close(limit)
|
||||||
|
// 消费消息
|
||||||
|
for msg := range msgs {
|
||||||
|
limit <- struct{}{}
|
||||||
|
go func(m amqp.Delivery) {
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
logx.Error(err)
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
<-limit
|
||||||
|
}()
|
||||||
|
if err = handleFunc(m.Body); err != nil {
|
||||||
|
logx.Error("failed to deal with MQ message:", string(m.Body))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = object.ch.Ack(m.DeliveryTag, false); err != nil {
|
||||||
|
logx.Error("failed to ack mq to delete")
|
||||||
|
} else {
|
||||||
|
log.Printf("Consume Mq message success: %s", m.Body)
|
||||||
|
}
|
||||||
|
}(msg)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"fusenapi/constants"
|
"fusenapi/constants"
|
||||||
|
"fusenapi/initalize"
|
||||||
"fusenapi/server/websocket/internal/types"
|
"fusenapi/server/websocket/internal/types"
|
||||||
"fusenapi/utils/auth"
|
"fusenapi/utils/auth"
|
||||||
"fusenapi/utils/id_generator"
|
"fusenapi/utils/id_generator"
|
||||||
|
@ -64,13 +65,14 @@ var (
|
||||||
// 每个连接的连接基本属性
|
// 每个连接的连接基本属性
|
||||||
type wsConnectItem struct {
|
type wsConnectItem struct {
|
||||||
conn *websocket.Conn //websocket的连接
|
conn *websocket.Conn //websocket的连接
|
||||||
closeChan chan struct{} //ws连接关闭chan
|
rabbitMq *initalize.RabbitMqHandle
|
||||||
isClose bool //是否已经关闭
|
closeChan chan struct{} //ws连接关闭chan
|
||||||
uniqueId uint64 //ws连接唯一标识
|
isClose bool //是否已经关闭
|
||||||
inChan chan []byte //接受消息缓冲通道
|
uniqueId uint64 //ws连接唯一标识
|
||||||
outChan chan []byte //发送回客户端的消息
|
inChan chan []byte //接受消息缓冲通道
|
||||||
mutex sync.Mutex //互斥锁
|
outChan chan []byte //发送回客户端的消息
|
||||||
renderProperty renderProperty //扩展云渲染属性
|
mutex sync.Mutex //互斥锁
|
||||||
|
renderProperty renderProperty //扩展云渲染属性
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *DataTransferLogic) DataTransfer(svcCtx *svc.ServiceContext, w http.ResponseWriter, r *http.Request) {
|
func (l *DataTransferLogic) DataTransfer(svcCtx *svc.ServiceContext, w http.ResponseWriter, r *http.Request) {
|
||||||
|
@ -100,6 +102,7 @@ func (l *DataTransferLogic) DataTransfer(svcCtx *svc.ServiceContext, w http.Resp
|
||||||
uniqueId := websocketIdGenerator.Get()
|
uniqueId := websocketIdGenerator.Get()
|
||||||
ws := wsConnectItem{
|
ws := wsConnectItem{
|
||||||
conn: conn,
|
conn: conn,
|
||||||
|
rabbitMq: l.svcCtx.RabbitMq,
|
||||||
uniqueId: uniqueId,
|
uniqueId: uniqueId,
|
||||||
closeChan: make(chan struct{}, 1),
|
closeChan: make(chan struct{}, 1),
|
||||||
inChan: make(chan []byte, 1000),
|
inChan: make(chan []byte, 1000),
|
||||||
|
@ -272,7 +275,7 @@ func (w *wsConnectItem) dealwithReciveData(data []byte) {
|
||||||
switch parseInfo.T {
|
switch parseInfo.T {
|
||||||
//图片渲染
|
//图片渲染
|
||||||
case constants.WEBSOCKET_RENDER_IMAGE:
|
case constants.WEBSOCKET_RENDER_IMAGE:
|
||||||
go w.SendToCloudRender(d)
|
w.SendToCloudRender(d)
|
||||||
default:
|
default:
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,8 +59,12 @@ func (w *wsConnectItem) SendToCloudRender(data []byte) {
|
||||||
Option: 1, //0删除 1添加
|
Option: 1, //0删除 1添加
|
||||||
Key: key,
|
Key: key,
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO 数据发送给云渲染服务器
|
// TODO 数据发送给云渲染服务器
|
||||||
|
if err := w.rabbitMq.SendMsg(constants.RABBIT_MQ_ASSEMBLE_RENDER_DATA, data); err != nil {
|
||||||
|
logx.Error(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
logx.Info("发送渲染数据到rabbitmq成功")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ type ServiceContext struct {
|
||||||
|
|
||||||
MysqlConn *gorm.DB
|
MysqlConn *gorm.DB
|
||||||
AllModels *gmodel.AllModelsGen
|
AllModels *gmodel.AllModelsGen
|
||||||
|
RabbitMq *initalize.RabbitMqHandle
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewServiceContext(c config.Config) *ServiceContext {
|
func NewServiceContext(c config.Config) *ServiceContext {
|
||||||
|
@ -26,6 +27,7 @@ func NewServiceContext(c config.Config) *ServiceContext {
|
||||||
Config: c,
|
Config: c,
|
||||||
MysqlConn: initalize.InitMysql(c.SourceMysql),
|
MysqlConn: initalize.InitMysql(c.SourceMysql),
|
||||||
AllModels: gmodel.NewAllModels(initalize.InitMysql(c.SourceMysql)),
|
AllModels: gmodel.NewAllModels(initalize.InitMysql(c.SourceMysql)),
|
||||||
|
RabbitMq: initalize.InitRabbitMq(c.SourceRabbitMq, nil),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user