/** 定时tick,把数据写入文件 **/ func EntityDump(tickTime time.Duration) { c := time.Tick(tickTime * time.Second) for _ = range c { // Utils.LogInfo("%v\n", now) //如果在规定时间内没有更改,就不更新 if dataChange == false { continue } //得到存储方式的句柄 fd := DataStore.GetFd().(*os.File) //清空文件 fd.Truncate(0) //得到gob转换出来的[]byte var wbuf bytes.Buffer egob := gob.NewEncoder(&wbuf) Utils.LogInfo("gob data=%#v\n", TaskData) err := egob.Encode(TaskData) if err != nil { Utils.LogInfo("data gob err") Utils.LogErr(err) continue } _, err = DataStore.Set(wbuf.Bytes()) if err != nil { Utils.LogErr(err) continue } dataChange = false } }
/** 返回所有任务索引数组 **/ func GetAllTaskIndex() ([]Entity.TaskAddr, error) { bufReader := IndexStore.Get() var gobTypeList []Entity.TaskAddr for { var gobType Entity.TaskAddr dataLenBuf := make([]byte, 4) //得到数据体长度 _, err := bufReader.Read(dataLenBuf) if err != nil { Utils.LogInfo("err=%d\n", err) if err == io.EOF { break } return nil, err } dataLen := Utils.BytesToUint32(dataLenBuf) dataBuf := make([]byte, dataLen) _, err = bufReader.Read(dataBuf) Utils.LogInfo("read file index=%#v\n", dataBuf) if err != nil { Utils.LogInfo("err=%d\n", err) return nil, err } rgob := gob.NewDecoder(bytes.NewBuffer(dataBuf)) err = rgob.Decode(&gobType) if err != nil { Utils.LogInfo("gob index err=%d\n", err) return nil, Utils.LogErr(err) } gobTypeList = append(gobTypeList[:], gobType) } Utils.LogInfo("retn index=%#v\n", gobTypeList) return gobTypeList, nil }
/** 取出readyData和waitData数据 **/ func GetData() (*Entity.ReadyData, *Entity.WaitData, error) { //得到存储方式的句柄 fd := DataStore.GetFd().(*os.File) //得到文件状态 fileStat, err := fd.Stat() if err != nil { return nil, nil, Utils.LogErr(err) } //如果文件是空的,直接返回 fileSize := fileStat.Size() if fileSize == 0 { return &Entity.ReadyData{}, &Entity.WaitData{}, nil } //得到文件大小的buf dataBuf := make([]byte, fileSize) //得到文件读取buf bufReader := DataStore.Get() _, err = bufReader.Read(dataBuf) Utils.LogInfo("read file data=%#v\n", dataBuf) if err != nil { Utils.LogInfo("err=%d\n", err) return nil, nil, err } //吧读到的[]byte转换成结构数据,使用全局变量TaskData rgob := gob.NewDecoder(bytes.NewBuffer(dataBuf)) err = rgob.Decode(&TaskData) Utils.LogInfo("gob data =%v\n", TaskData) if err != nil { Utils.LogInfo("gob data err=%d\n", err) return nil, nil, Utils.LogErr(err) } return TaskData.ReadyData, TaskData.WaitData, nil }
/** 根据约定的数据包结构,区分出是telnet还是client **/ func New(conn net.Conn) (IConn, error) { data, err := Utils.ReadConn(1, conn) Utils.LogInfo("new data=%v\n", string(data)) if err != nil { return nil, err } Utils.LogInfo("data=%v\n", data) var retn IConn if string(data) == "1" { Utils.LogInfo("telnet\n") retn = NewTelnet(conn) } else { Utils.LogInfo("client\n") retn = NewClient(conn) } return retn, nil }
/** 写入索引 **/ func AddIndex(dataAddr Entity.TaskAddr) (int, error) { //得到存储方式的句柄 fd := IndexStore.GetFd().(*os.File) //得到文件状态 fileStat, err := fd.Stat() if err != nil { return 0, Utils.LogErr(err) } // //得到文件大小,这个位置就是这条记录的起始位置 dataAddr.FileAddr = fileStat.Size() dataAddr.EleAddr = nil gob.Register(dataAddr) //得到gob转换出来的[]byte var wbuf bytes.Buffer egob := gob.NewEncoder(&wbuf) Utils.LogInfo("gob index=%#v\n", dataAddr) err = egob.Encode(dataAddr) if err != nil { Utils.LogInfo("index gob err") return 0, Utils.LogErr(err) } //拼出最终存入文件的数据==数据长度+数据体 var storeByte []byte storeByteBuf := bytes.NewBuffer(storeByte) //写入数据长度 _, err = storeByteBuf.Write(Utils.Uint32ToBytes(uint32(wbuf.Len()))) if err != nil { return 0, Utils.LogErr(err) } _, err = storeByteBuf.Write(wbuf.Bytes()) if err != nil { return 0, Utils.LogErr(err) } wData := storeByteBuf.Bytes() Utils.LogInfo("len=%d\n", storeByteBuf.Len()) Utils.LogInfo("data=%#v\n", wData) writeNum, err := IndexStore.Set(wData) if err != nil { return 0, Utils.LogErr(err) } return writeNum, nil }
/** 写入任意数据,都使用gob存入file,返回的int64,是该数据在文件中的起始位置 **/ func AddData(data Entity.TaskData) (int, error) { //得到存储方式的句柄 fd := DataStore.GetFd().(*os.File) //得到文件状态 fileStat, err := fd.Stat() if err != nil { return 0, Utils.LogErr(err) } data.FileAddr = fileStat.Size() //得到gob转换出来的[]byte var wbuf bytes.Buffer egob := gob.NewEncoder(&wbuf) Utils.LogInfo("gob data=%#v\n", data) err = egob.Encode(data) if err != nil { Utils.LogInfo("data gob err") return 0, Utils.LogErr(err) } //拼出最终存入文件的数据==数据长度+数据体 var storeByte []byte storeByteBuf := bytes.NewBuffer(storeByte) //写入数据长度 _, err = storeByteBuf.Write(Utils.Uint32ToBytes(uint32(wbuf.Len()))) if err != nil { return 0, Utils.LogErr(err) } _, err = storeByteBuf.Write(wbuf.Bytes()) if err != nil { return 0, Utils.LogErr(err) } wData := storeByteBuf.Bytes() Utils.LogInfo("len=%d\n", storeByteBuf.Len()) Utils.LogInfo("data=%#v\n", wData) writeNum, err := DataStore.Set(wData) if err != nil { return 0, Utils.LogErr(err) } return writeNum, nil }
//http://sendcloud.sohu.com func SendMailBySohu(to, subject, body string) (err error) { resp, err := http.PostForm(Config.GetUrl().MailApi, url.Values{"to": {to}, "subject": {subject}, "html": {body}}) if err != nil { return err } defer resp.Body.Close() res, err := ioutil.ReadAll(resp.Body) if err != nil { Utils.LogPanicErr(err) } Utils.LogInfo(string(res)) return nil }
/** 信号量处理函数 **/ func signalHandle() { for { ch := make(chan os.Signal) signal.Notify(ch, syscall.SIGINT, syscall.SIGUSR1) sig := <-ch Utils.LogInfo("Signal received: %v", sig) switch sig { case syscall.SIGINT: os.Exit(1) case syscall.SIGUSR1: Config.ParseXml(Config.ConfigFile) } } }
/** 解析xml文件 **/ func ParseXml(configFile string) { file, err := os.Open(configFile) if err != nil { Utils.LogPanicErr(err) return } xmlObj := xml.NewDecoder(file) err = xmlObj.Decode(&vsConfig) if err != nil { Utils.LogPanicErr(err) return } Utils.LogInfo("parse xml=%v\n", vsConfig) }
func sendPolicy(conn net.Conn) { defer conn.Close() str := "<cross-domain-policy><site-control permitted-cross-domain-policies=\"master-only\"/> <allow-access-from domain=\"*\" to-ports=\"9876\" /></cross-domain-policy>" // str+="\0" Utils.LogInfo("send data=%s\n", str) _, err := Utils.ReadConn(23, conn) if err != nil { Utils.LogErr(err) } bufk := bufio.NewWriter(conn) bufk.WriteString(str) // bufk.WriteString("\\0") bufk.Flush() }
func (j *Jobsms) Run() { for { Utils.LogInfo("Jobsms delay %d Second", Config.GetLoopTime().Sms) time.Sleep(time.Second * Config.GetLoopTime().Sms) beanstalkd, err := lentil.Dial(Config.GetBeanstalk().Server) if err != nil { Utils.LogPanicErr(err) } else { err = beanstalkd.Use(Config.GetBeanstalk().MobileQueue) } if err != nil { Utils.LogPanicErr(err) } else { for i := 0; i < 10; i++ { job, err := beanstalkd.PeekReady() if err != nil { //Utils.LogPanicErr(err) break } else { body := strings.SplitN(string(job.Body), "\t", 2) if len(body) == 2 { r, err := base64.StdEncoding.DecodeString(body[1]) if err == nil { fmt.Printf("Job id: %d \nmobile: %s \nbody: %s", job.Id, body[0], string(r)) e := SendSms(body[0], string(r)) if e != nil { Utils.LogPanicErr(e) } } } beanstalkd.Delete(job.Id) } } } } }
/** 检查进入等待状态的任务是否到期,到期后放入readyData **/ func CheckWaitTask(readyData *Entity.ReadyData, waitData *Entity.WaitData) { c := time.Tick(time.Second) dataChange := false for _ = range c { for key, value := range *waitData { //已经到期的任务,放入readyData if value.Expired <= uint(time.Now().Unix()) { Utils.LogInfo("check do=%s\n", key) readyData.Add(key, value.Value, value.Expired) waitData.Del(key) dataChange = true } } if dataChange { //存储数据 Store.SetData(readyData, waitData) dataChange = false } } }
func main() { service := ":843" tcpAddr, err := net.ResolveTCPAddr("ip4", service) Utils.LogErr(err) listener, err := net.ListenTCP("tcp", tcpAddr) Utils.LogErr(err) i := 0 runtime.GOMAXPROCS(runtime.NumCPU()) for { conn, err := listener.Accept() if err != nil { Utils.LogErr(err) return } Utils.LogInfo("start conn\n") go sendPolicy(conn) // go Handle.Test(i,roomList, conn) // roomChan <- roomList i++ } }
func (j *Jobmail) Run() { for { Utils.LogInfo("Jobmail delay %d Second", Config.GetLoopTime().Mail) time.Sleep(time.Second * Config.GetLoopTime().Mail) beanstalkd, err := lentil.Dial(Config.GetBeanstalk().Server) if err != nil { Utils.LogPanicErr(err) } else { err = beanstalkd.Use(Config.GetBeanstalk().MailQueue) } if err != nil { Utils.LogPanicErr(err) } else { for i := 0; i < 10; i++ { job, err := beanstalkd.PeekReady() if err != nil { //Utils.LogPanicErr(err) break } else { body := strings.SplitN(string(job.Body), "\t", 4) if len(body) == 4 { r, err := base64.StdEncoding.DecodeString(body[3]) if err == nil { fmt.Printf("Job id: %d \nmail to:%s \nsubject:%s\nbody: , %s", job.Id, body[0], body[1], string(r)) //SendMail( body[0], body[1], string(r), body[2]) SendMailBySohu(body[0], body[1], string(r)) } } beanstalkd.Delete(job.Id) } } } } }
func main() { utils.LogInfo(fmt.Sprintf("-----------------------begin %d", 1)) utils.LogError("----------------------begin") utils.LogWarning("=====================end") utils.LogInfo("=======================end ") }