1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/chaos.su-medispatcher

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
medispatcher.go 2.8 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
chaos Отправлено 28.05.2015 08:09 7569d22
package main
import (
"encoding/json"
"fmt"
"medispatcher/config"
"medispatcher/logger"
"medispatcher/msgredist"
"medispatcher/recoverwatcher"
rpcSrv "medispatcher/rpc/connection"
"medispatcher/sender"
"os"
"os/signal"
"runtime"
"runtime/debug"
"syscall"
"time"
)
var exitSigChan = make(chan int8)
func main() {
err := config.Setup()
if err != nil {
fmt.Printf("Failed to setup configs: %v", err)
os.Exit(1)
}
maxProcs := runtime.NumCPU()
if maxProcs > 1 {
maxProcs -= 1
}
runtime.GOMAXPROCS(maxProcs)
logger.InitDefaultLogger()
go ProcessSysSignal()
go rpcSrv.StartServer()
go recoverwatcher.StartAndWait()
go msgredist.StartAndWait()
go sender.StartAndWait()
<-exitSigChan
}
// 系统信号处理
func ProcessSysSignal() {
var exitSigSent bool
var exitSigSentLock = make(chan bool, 1)
// 系统信号监控通道
osSingalChan := make(chan os.Signal, 10)
signal.Notify(osSingalChan)
var sigusr1 = syscall.Signal(0xa)
// 在此阻塞,监控并处理系统信号
for {
osSingal := <-osSingalChan
go func(sig *os.Signal) {
switch *sig {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
exitSigSentLock <- true
if !exitSigSent {
logger.GetLogger("INFO").Print("Quit signal received! exit...\n")
exitSigSent = true
<-exitSigSentLock
} else {
logger.GetLogger("INFO").Print("Quit signal already sent! ignore...\n")
<-exitSigSentLock
return
}
workerExitSigChan := make(chan string)
go rpcSrv.Stop(&workerExitSigChan)
go msgredist.Stop(&workerExitSigChan)
go recoverwatcher.Stop(&workerExitSigChan)
go sender.Stop(&workerExitSigChan)
sigReceivedCount := 0
for sigReceivedCount < 4 {
select {
case workerName := <-workerExitSigChan:
sigReceivedCount += 1
logger.GetLogger("INFO").Printf("%v worker exited.", workerName)
default:
time.Sleep(time.Millisecond * 40)
}
}
exitSigChan <- int8(1)
case syscall.SIGALRM:
logger.GetLogger("INFO").Print("Received manual GC signal, starting free OS memory!")
gcStats := debug.GCStats{}
debug.ReadGCStats(&gcStats)
gcStatsOut, _ := json.MarshalIndent(gcStats, "", "")
fmt.Fprintf(os.Stdout, "%s\r\n", gcStatsOut)
debug.FreeOSMemory()
case sigusr1:
fmt.Printf("Current goroutines: %d\n", runtime.NumGoroutine())
// case syscall.SIGUSR2:
// fmt.Printf("Configs: %s\n", config.GetConfig())
case syscall.SIGHUP:
curDebugMode := !config.DebugEnabled()
logger.GetLogger("INFO").Printf("Received force toggle DEBUG mode signal, setting DEBUG mode to : %v", curDebugMode)
config.SetDebug(curDebugMode)
default:
if config.DebugEnabled() {
logger.GetLogger("INFO").Printf("un-expected signal: %s(%d)\n", *sig, *sig)
}
}
}(&osSingal)
}
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/chaos.su-medispatcher.git
git@api.gitlife.ru:oschina-mirror/chaos.su-medispatcher.git
oschina-mirror
chaos.su-medispatcher
chaos.su-medispatcher
master