mq/app/utils/tcp.go

93 lines
2.0 KiB
Go

package utils
import (
"bufio"
"context"
"encoding/json"
"fmt"
"github.com/qit-team/snow-core/redis"
"net"
"sync/atomic"
"time"
)
var (
workNum int32 = 0
workSingleNum = &workNum
maxNum = 2000
handNum int32 = 0
handSingleNum = &handNum
busy int32 = 0
busySingle = &busy
)
func handLogacal(conn net.Conn, data []byte) {
conn.Write([]byte("2\n"))
time.Sleep(1 * time.Second)
atomic.AddInt32(workSingleNum, -1)
atomic.AddInt32(handSingleNum, 1)
atomic.StoreInt32(busySingle, 0)
fmt.Println(*handSingleNum, "处理条数")
fmt.Println(string(data), "消息")
}
func handleConnection(conn net.Conn) {
for {
buf := make([]byte, 1024)
reader := bufio.NewReader(conn)
line, err := reader.ReadString('\n')
if err != nil {
fmt.Println("Error reading from connection:", err)
return
}
// 将读取到的字符串转换为字节切片
buf = []byte(line)
if err == nil && len(buf) > 2 {
var data map[string]interface{}
json.Unmarshal(buf, &data)
redis.GetRedis().HDel(context.Background(), "kafka_message", data["serial_number"].(string)).Result()
if atomic.LoadInt32(workSingleNum) >= int32(maxNum) {
if atomic.LoadInt32(busySingle) == 0 {
fmt.Println("繁忙")
atomic.StoreInt32(busySingle, 1)
conn.Write([]byte("5\n"))
continue
}
} else {
fmt.Println("收到", *workSingleNum, maxNum, string(buf))
conn.Write([]byte(data["serial_number"].(string) + "\n"))
fmt.Println(data["serial_number"].(string), "ggggggggggggg")
go handLogacal(conn, buf)
atomic.AddInt32(workSingleNum, 1)
conn.Write([]byte("2\n"))
}
} else {
conn.Write([]byte("6\n"))
}
}
}
func StartTcpServer() {
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Error starting server:", err)
return
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting connection:", err)
continue
}
go handleConnection(conn)
}
}