github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmg/SubCommand/serviceCmd/rpc.go (about)

     1  package serviceCmd
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/bronze1man/kmg/errors"
     6  	"github.com/bronze1man/kmg/kmgCrypto"
     7  	"github.com/bronze1man/kmg/kmgErr"
     8  	"github.com/bronze1man/kmg/kmgProcessMutex"
     9  	"time"
    10  )
    11  
    12  type StartStatus string
    13  
    14  const (
    15  	StartStatusSuccess StartStatus = "StartStatusSuccess"
    16  	StartStatusFail                = "StartStatusFail"
    17  )
    18  
    19  var statusChannel = make(chan StartStatus)
    20  
    21  var rpcPsk = kmgCrypto.Get32PskFromString("w4n4ts28cq")
    22  
    23  var rpcAddress = "127.0.0.1:2777"
    24  
    25  type ServiceRpc struct{}
    26  
    27  func (sr *ServiceRpc) Send(status StartStatus) {
    28  	statusChannel <- status
    29  }
    30  
    31  //TODO 对于不会发 RPC 的进程,应该可以用一个 flag 来表明不需要等待 RPC 响应
    32  func waitRpcRespond() chan error {
    33  	returnChan := make(chan error)
    34  	lock := &kmgProcessMutex.FileMutex{Name: "kmg_service_lock"}
    35  	lock.Lock()
    36  	rpcCloser := ListenAndServe_ServiceRpc(rpcAddress, &ServiceRpc{}, rpcPsk)
    37  	__closer := func() {
    38  		err := rpcCloser()
    39  		time.Sleep(time.Second)
    40  		lock.UnLock()
    41  		kmgErr.PanicIfError(err)
    42  	}
    43  	go func() {
    44  		select {
    45  		case startStatus := <-statusChannel:
    46  			__closer()
    47  			if startStatus == StartStatusSuccess {
    48  				returnChan <- nil
    49  			} else {
    50  				returnChan <- errors.New("StartFail")
    51  			}
    52  		case <-time.After(time.Minute * 2):
    53  			__closer()
    54  			returnChan <- errors.New("Rpc timeout")
    55  		}
    56  	}()
    57  	return returnChan
    58  }
    59  
    60  func ServiceStartSuccess() {
    61  	time.Sleep(time.Millisecond * 100)
    62  	client := NewClient_ServiceRpc("http://"+rpcAddress, rpcPsk)
    63  	err := client.Send(StartStatusSuccess)
    64  	if err != nil {
    65  		fmt.Println("[Warning kmg service] please use kmg service start/restart", err)
    66  	}
    67  }
    68  
    69  //暂时没什么用
    70  func ServiceStartFail() {
    71  	time.Sleep(time.Second)
    72  	client := NewClient_ServiceRpc("http://"+rpcAddress, rpcPsk)
    73  	err := client.Send(StartStatusFail)
    74  	if err != nil {
    75  		fmt.Println("src/github.com/bronze1man/kmg/kmg/SubCommand/serviceCmd/rpc.go ServiceStartFail", err)
    76  	}
    77  }