// ジョブネットワークレコードをInsertする。 func (r *ResultMap) insertJobNetwork() error { var isCommit bool tx, err := r.conn.GetDbMap().Begin() if err != nil { return err } defer func() { if !isCommit { tx.Rollback() } }() now := utctime.Now().String() r.JobnetResult.CreateDate = now r.JobnetResult.UpdateDate = now err = tx.Insert(r.JobnetResult) if err != nil { return err } if err = tx.Commit(); err != nil { return err } log.Debug(fmt.Sprintf("networkId[%v]", r.JobnetResult.ID)) isCommit = true return nil }
// ホスト名がhost、ポート番号がportのservantへ接続し、ジョブ実行要求を送信する。 // servantから返信されたジョブ実行結果を関数外へ返す。 // // param : host ホスト名。 // // param : port ポート番号。 // // param : req リクエストメッセージ。 // // return : 返信メッセージ。 // // return : エラー情報。 func SendRequest(host string, port int, req string, stCh chan<- string) (string, error) { const bufSize = 1024 timeout := time.Duration(config.Job.ConnectionTimeoutSec) * time.Second addr := fmt.Sprintf("%s:%d", host, port) conn, err := net.DialTimeout("tcp", addr, timeout) if err != nil { return ``, err } defer conn.Close() log.Debug(req) _, err = conn.Write([]byte(req + MsgEnd)) if err != nil { return ``, err } scanner := bufio.NewScanner(conn) var res *response WAITRESPONSE: for { select { case res = <-readResponse(scanner): if res.err != nil { return ``, res.err } log.Debug(res.msg) if res.msg == message.HEARTBEAT { // ハートビートメッセージの場合はバッファサイズを初期化する。 continue } else if strings.HasPrefix(res.msg, message.ST_HEADER) { st := res.msg[len(message.ST_HEADER):] stCh <- st continue } break WAITRESPONSE case <-time.After(timeout): return ``, fmt.Errorf("Connetion timeout.") } } return res.msg, nil }
// ハートビートを開始する。 func (s *Session) startHeartbeat() { s.endHeartbeatCh = make(chan endSig, 1) go func() { t := time.Duration(config.Servant.Job.HeartbeatSpanSec) * time.Second for { select { case <-s.endHeartbeatCh: return case <-time.After(t): log.Debug("send heatbeat...") s.Conn.Write([]byte(message.HEARTBEAT + MsgEnd)) } } }() }