container-go/servlet/rpc-servlet.go

116 lines
2.3 KiB
Go
Raw Normal View History

2018-04-19 03:46:54 +00:00
package servlet
import (
"net"
2018-04-19 13:46:49 +00:00
"git.loafle.net/commons/logging-go"
2018-04-19 03:46:54 +00:00
crp "git.loafle.net/commons/rpc-go/protocol"
crpj "git.loafle.net/commons/rpc-go/protocol/json"
crr "git.loafle.net/commons/rpc-go/registry"
"git.loafle.net/commons/server-go"
css "git.loafle.net/commons/server-go/socket"
cssn "git.loafle.net/commons/server-go/socket/net"
)
type RPCServlet interface {
cssn.Servlet
}
type RPCServlets struct {
cssn.Servlets
2018-04-19 13:01:11 +00:00
RPCInvoker crr.RPCInvoker
RPCWriteChan <-chan []byte
2018-04-19 03:46:54 +00:00
}
func (s *RPCServlets) Handshake(servletCtx server.ServletCtx, conn net.Conn) error {
return nil
}
func (s *RPCServlets) OnConnect(servletCtx server.ServletCtx, conn css.Conn) {
s.Servlets.OnConnect(servletCtx, conn)
}
func (s *RPCServlets) OnDisconnect(servletCtx server.ServletCtx) {
s.Servlets.OnDisconnect(servletCtx)
}
func (s *RPCServlets) Handle(servletCtx server.ServletCtx,
stopChan <-chan struct{}, doneChan chan<- struct{},
readChan <-chan []byte, writeChan chan<- []byte) {
defer func() {
doneChan <- struct{}{}
}()
var (
src crp.ServerRequestCodec
reply interface{}
replyBuff []byte
err error
)
sc := crpj.NewServerCodec()
2018-04-19 13:51:36 +00:00
go s.handleRPCWrite(stopChan, writeChan)
2018-04-19 03:46:54 +00:00
for {
select {
case msg, ok := <-readChan:
if !ok {
return
}
// grpc exec method call
src, err = sc.NewRequest(msg)
if nil != err {
logging.Logger().Error(err)
break
}
reply, err = s.RPCInvoker.Invoke(src)
replyBuff, err = src.NewResponse(reply, err)
if nil != err {
logging.Logger().Error(err)
s.writeError(src, writeChan, crp.E_INTERNAL, "", err)
break
}
writeChan <- replyBuff
2018-04-19 13:51:36 +00:00
case <-stopChan:
return
}
}
}
func (s *RPCServlets) handleRPCWrite(stopChan <-chan struct{}, writeChan chan<- []byte) {
for {
select {
2018-04-19 13:46:49 +00:00
case buf, ok := <-s.RPCWriteChan:
if !ok {
break
}
2018-04-19 13:01:11 +00:00
writeChan <- buf
2018-04-19 03:46:54 +00:00
case <-stopChan:
return
}
}
}
func (s *RPCServlets) writeError(src crp.ServerRequestCodec, writeChan chan<- []byte, code crp.ErrorCode, message string, data interface{}) {
if !src.HasResponse() {
return
}
pErr := &crp.Error{
Code: code,
Message: message,
Data: data,
}
buf, err := src.NewResponse(nil, pErr)
if nil != err {
logging.Logger().Error(err)
return
}
writeChan <- buf
}