diff --git a/business/jxstore/cms/api_print.go b/business/jxstore/cms/api_print.go index 61a172a49..6ce84e93b 100644 --- a/business/jxstore/cms/api_print.go +++ b/business/jxstore/cms/api_print.go @@ -382,7 +382,7 @@ func DoPrintMsg(appID int, msgID, printNo, content string, orderNo string) (err Status: event.PrintMsgWait, } - t, ok := event.PrintObject[printNo] + t, ok := event.PrintObject.GetPrintObj(printNo) if ok { t.Lock() defer t.Unlock() diff --git a/business/jxstore/event/event_print.go b/business/jxstore/event/event_print.go index 382b2a76f..cfcb2e289 100644 --- a/business/jxstore/event/event_print.go +++ b/business/jxstore/event/event_print.go @@ -2,12 +2,96 @@ package event import ( "fmt" + "sync" ) -var PrintObject = make(map[string]*TcpClient, 100) // 缓存的打印机对象 -var PrintAddrAndIp = make(map[string]string, 100) // 缓存打印机地址:[ip:printNo] event 文件包,connect只能获取到addr -var PrintIpAndAddr = make(map[string]string, 100) // 缓存打印机地址:[printNo:ip] api_controller 只能获取到printNo +var ( + PrintObject *PrintObjectStruct // 缓存的打印机对象 + PrintAddrAndIp *PrintAddrAndIpStruct // 缓存打印机地址:[ip:printNo] event 文件包,connect只能获取到addr + PrintIpAndAddr *PrintIpAndAddrStruct // 缓存打印机地址:[printNo:ip] api_controller 只能获取到printNo +) func init() { fmt.Println("初始化打印机对象") + PrintObject = &PrintObjectStruct{ + PrintObject: make(map[string]*TcpClient), + RWMutex: new(sync.RWMutex), + } + PrintAddrAndIp = &PrintAddrAndIpStruct{ + PrintObject: make(map[string]string), + RWMutex: new(sync.RWMutex), + } + PrintIpAndAddr = &PrintIpAndAddrStruct{ + PrintObject: make(map[string]string), + RWMutex: new(sync.RWMutex), + } +} + +type PrintObjectStruct struct { + PrintObject map[string]*TcpClient + *sync.RWMutex +} + +func (p *PrintObjectStruct) GetPrintObj(printNo string) (*TcpClient, bool) { + p.RLock() + defer p.RUnlock() + tcpObj, ok := PrintObject.PrintObject[printNo] + return tcpObj, ok +} +func (p *PrintObjectStruct) SetPrintObj(printNo string, tcpObj *TcpClient) { + p.RLock() + defer p.RUnlock() + PrintObject.PrintObject[printNo] = tcpObj +} + +func (p *PrintObjectStruct) DelPrintObj(printNo string) { + p.RLock() + defer p.RUnlock() + delete(PrintObject.PrintObject, printNo) +} + +type PrintAddrAndIpStruct struct { + PrintObject map[string]string + *sync.RWMutex +} + +func (p *PrintAddrAndIpStruct) GetPrintAddrAndIp(ip string) (string, bool) { + p.RLock() + defer p.RUnlock() + printNo, ok := PrintAddrAndIp.PrintObject[ip] + return printNo, ok +} +func (p *PrintAddrAndIpStruct) SetPrintAddrAndIp(ip string, printNo string) { + p.RLock() + defer p.RUnlock() + PrintAddrAndIp.PrintObject[ip] = printNo +} + +func (p *PrintAddrAndIpStruct) DelPrintAddrAndIp(ip string) { + p.RLock() + defer p.RUnlock() + delete(PrintAddrAndIp.PrintObject, ip) +} + +type PrintIpAndAddrStruct struct { + PrintObject map[string]string + *sync.RWMutex +} + +func (p *PrintIpAndAddrStruct) GetPrintIpAndAddr(printNo string) (string, bool) { + p.RLock() + defer p.RUnlock() + tcpObj, ok := PrintIpAndAddr.PrintObject[printNo] + return tcpObj, ok +} +func (p *PrintIpAndAddrStruct) SetPrintIpAndAddr(printNo string, ip string) { + p.RLock() + defer p.RUnlock() + PrintIpAndAddr.PrintObject[printNo] = ip +} + +func (p *PrintIpAndAddrStruct) DelPrintIpAndAddr(printNo string) { + p.RLock() + defer p.RUnlock() + delete(PrintIpAndAddr.PrintObject, printNo) } diff --git a/business/jxstore/event/event_tcp.go b/business/jxstore/event/event_tcp.go index 78fe5bced..e8e3fb81c 100644 --- a/business/jxstore/event/event_tcp.go +++ b/business/jxstore/event/event_tcp.go @@ -71,10 +71,10 @@ func handleConn(c net.Conn) error { } else { fmt.Println("ReadString err:", err) } - if printNo, ok := PrintAddrAndIp[printRemoteAddr]; ok { - delete(PrintIpAndAddr, printNo) - delete(PrintObject, printNo) - delete(PrintAddrAndIp, printRemoteAddr) + if printNo, ok := PrintAddrAndIp.GetPrintAddrAndIp(printRemoteAddr); ok { + PrintAddrAndIp.DelPrintAddrAndIp(printRemoteAddr) + PrintObject.DelPrintObj(printNo) + PrintIpAndAddr.DelPrintIpAndAddr(printRemoteAddr) dao.ExecuteSQL(dao.GetDB(), `UPDATE printer SET status = -1,is_online = -1 WHERE print_no = ? `, []interface{}{printNo}...) } return err @@ -96,8 +96,8 @@ func handleConn(c net.Conn) error { callback = true } - t, ok := PrintObject[printNo] - if !ok || t.Clients[printNo] == nil || t.Clients[printNo].StatusTime.Sub(time.Now()).Seconds() >= 120 { + t, ok := PrintObject.GetPrintObj(printNo) + if !ok || t.Clients[printNo] == nil || time.Now().Sub(t.Clients[printNo].StatusTime).Seconds() >= 120 { t = NewTcpClient() } @@ -241,10 +241,10 @@ func doPrint(t *TcpClient, key string) (err error) { } if c == nil { - if printRemoteAddrIP, have := PrintIpAndAddr[key]; have { - delete(PrintIpAndAddr, PrintAddrAndIp[key]) - delete(PrintAddrAndIp, printRemoteAddrIP) - delete(PrintObject, key) + if printRemoteAddrIP, have := PrintIpAndAddr.GetPrintIpAndAddr(key); have { + PrintIpAndAddr.DelPrintIpAndAddr(key) + PrintAddrAndIp.DelPrintAddrAndIp(printRemoteAddrIP) + PrintObject.DelPrintObj(key) } return } @@ -254,20 +254,20 @@ func doPrint(t *TcpClient, key string) (err error) { printMsg.Comment = err.Error() dao.UpdateEntity(db, printMsg, "Status", "Comment") - if printRemoteAddrIP, have := PrintIpAndAddr[key]; have { - delete(PrintIpAndAddr, PrintAddrAndIp[key]) - delete(PrintAddrAndIp, printRemoteAddrIP) - delete(PrintObject, key) + if printRemoteAddrIP, have := PrintIpAndAddr.GetPrintIpAndAddr(key); have { + PrintIpAndAddr.DelPrintIpAndAddr(key) + PrintAddrAndIp.DelPrintAddrAndIp(printRemoteAddrIP) + PrintObject.DelPrintObj(key) } return } if _, err = c.Write(data); err != nil { globals.SugarLogger.Debugf("handleTcpMessages err [%v]", err) - if printRemoteAddrIP, have := PrintIpAndAddr[key]; have { - delete(PrintIpAndAddr, PrintAddrAndIp[key]) - delete(PrintAddrAndIp, printRemoteAddrIP) - delete(PrintObject, key) + if printRemoteAddrIP, have := PrintIpAndAddr.GetPrintIpAndAddr(key); have { + PrintIpAndAddr.DelPrintIpAndAddr(key) + PrintAddrAndIp.DelPrintAddrAndIp(printRemoteAddrIP) + PrintObject.DelPrintObj(key) } } else { @@ -427,10 +427,10 @@ func HandleCheckTcpHeart(t *TcpClient, key string) { changePrinterStatus(key, printerStatusOffline) // 链接出错,彻底删除换成 - if printRemoteAddrIP, have := PrintIpAndAddr[key]; have { - delete(PrintIpAndAddr, PrintAddrAndIp[key]) - delete(PrintAddrAndIp, printRemoteAddrIP) - delete(PrintObject, key) + if printRemoteAddrIP, have := PrintIpAndAddr.GetPrintIpAndAddr(key); have { + PrintIpAndAddr.DelPrintIpAndAddr(key) + PrintAddrAndIp.DelPrintAddrAndIp(printRemoteAddrIP) + PrintObject.DelPrintObj(key) } } @@ -442,10 +442,10 @@ func HandleCheckTcpHeart(t *TcpClient, key string) { t.delConn(key) // 链接出错,彻底删除换成 - if printRemoteAddrIP, have := PrintIpAndAddr[key]; have { - delete(PrintIpAndAddr, PrintAddrAndIp[key]) - delete(PrintAddrAndIp, printRemoteAddrIP) - delete(PrintObject, key) + if printRemoteAddrIP, have := PrintIpAndAddr.GetPrintIpAndAddr(key); have { + PrintIpAndAddr.DelPrintIpAndAddr(key) + PrintAddrAndIp.DelPrintAddrAndIp(printRemoteAddrIP) + PrintObject.DelPrintObj(key) } return diff --git a/business/jxstore/event/event_tcp_utils.go b/business/jxstore/event/event_tcp_utils.go index 4957c9340..23f5982a8 100644 --- a/business/jxstore/event/event_tcp_utils.go +++ b/business/jxstore/event/event_tcp_utils.go @@ -646,7 +646,7 @@ func Heartbeat(c net.Conn, t *TcpClient, data string, printNo string, printRemot //4、读打印channel并打印,并切等待回调channel中的消息 //5、修改数据库中打印机状态(没在连接池中说明是重新连接的) //6、监听心跳时间,超过1分多钟就clear掉 - if t.getClients(printNo) == nil || t == nil || t.getPrintStatusTime(printNo).IsZero() || t.Clients[printNo].StatusTime.Sub(time.Now()).Seconds() >= 120 { + if t.getClients(printNo) == nil || t == nil || t.getPrintStatusTime(printNo).IsZero() || time.Now().Sub(t.Clients[printNo].StatusTime).Seconds() >= 120 { addConn(c, t, printNo, status) buildAllMap(t, printNo) //t.TimeoutMap[printNo] <- true @@ -663,9 +663,9 @@ func Heartbeat(c net.Conn, t *TcpClient, data string, printNo string, printRemot globals.SugarLogger.Debugf("监听打印机心跳,不存在则创建 :[%v],printNo[%s]", err, printNo) } - PrintObject[printNo] = t - PrintAddrAndIp[printRemoteAddr] = printNo - PrintIpAndAddr[printNo] = printRemoteAddr + PrintObject.SetPrintObj(printNo, t) + PrintAddrAndIp.SetPrintAddrAndIp(printRemoteAddr, printNo) + PrintIpAndAddr.SetPrintIpAndAddr(printNo, printRemoteAddr) } else { //在加到连接池中已经更新了时间,所以放在else里 t.setPrintStatusTime(printNo)