异常宕机捕获处理

This commit is contained in:
duanhf2012
2020-04-01 15:21:49 +08:00
parent a76527c7d7
commit 27ff65726a
6 changed files with 64 additions and 22 deletions

View File

@@ -1,7 +1,9 @@
package event package event
import ( import (
"fmt"
"github.com/duanhf2012/origin/log" "github.com/duanhf2012/origin/log"
"runtime"
"sync" "sync"
) )
@@ -78,3 +80,17 @@ func (slf *EventProcessor) SetEventReciver(eventProcessor IEventProcessor){
func (slf *EventProcessor) GetEventReciver() IEventProcessor{ func (slf *EventProcessor) GetEventReciver() IEventProcessor{
return slf.eventReciver return slf.eventReciver
} }
func (slf *EventProcessor) EventHandler(processor IEventProcessor,ev *Event) {
defer func() {
if r := recover(); r != nil {
buf := make([]byte, 40960)
l := runtime.Stack(buf, false)
err := fmt.Errorf("%v: %s", r, buf[:l])
log.Error("core dump info:%+v\n",err)
}
}()
processor.OnEventHandler(ev)
}

View File

@@ -24,10 +24,11 @@ func NewPBProcessor() *PBProcessor {
return processor return processor
} }
func (slf *PBProcessor) SetLittleEndian(littleEndian bool){ func (p *PBProcessor) SetByteOrder(littleEndian bool) {
slf.LittleEndian = littleEndian p.LittleEndian = littleEndian
} }
type PBPackInfo struct { type PBPackInfo struct {
typ uint16 typ uint16
msg proto.Message msg proto.Message

View File

@@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"github.com/duanhf2012/origin/log" "github.com/duanhf2012/origin/log"
"reflect" "reflect"
"runtime"
"strings" "strings"
"unicode" "unicode"
"unicode/utf8" "unicode/utf8"
@@ -168,6 +169,15 @@ func (slf *RpcHandler) GetRpcResponeChan() chan *Call{
} }
func (slf *RpcHandler) HandlerRpcResponeCB(call *Call){ func (slf *RpcHandler) HandlerRpcResponeCB(call *Call){
defer func() {
if r := recover(); r != nil {
buf := make([]byte, LenStackBuf)
l := runtime.Stack(buf, false)
err := fmt.Errorf("%v: %s\n", r, buf[:l])
log.Error("core dump info:%+v",err)
}
}()
if call.Err == nil { if call.Err == nil {
call.callback.Call([]reflect.Value{reflect.ValueOf(call.Reply),NilError}) call.callback.Call([]reflect.Value{reflect.ValueOf(call.Reply),NilError})
}else{ }else{
@@ -176,8 +186,20 @@ func (slf *RpcHandler) HandlerRpcResponeCB(call *Call){
} }
var LenStackBuf int = 40960
func (slf *RpcHandler) HandlerRpcRequest(request *RpcRequest) { func (slf *RpcHandler) HandlerRpcRequest(request *RpcRequest) {
defer func() {
if r := recover(); r != nil {
buf := make([]byte, LenStackBuf)
l := runtime.Stack(buf, false)
err := fmt.Errorf("%v: %s", r, buf[:l])
log.Error("core dump info:%+v\n",err)
rpcErr := RpcError("call error : core dumps")
request.requestHandle(nil,&rpcErr)
}
}()
v,ok := slf.mapfunctons[request.ServiceMethod] v,ok := slf.mapfunctons[request.ServiceMethod]
if ok == false { if ok == false {
err := Errorf("RpcHandler %s cannot find %s",slf.rpcHandler.GetName(),request.ServiceMethod) err := Errorf("RpcHandler %s cannot find %s",slf.rpcHandler.GetName(),request.ServiceMethod)

View File

@@ -77,14 +77,6 @@ type RpcAgent struct {
userData interface{} userData interface{}
} }
type RpcRequestRw struct {
//
ServiceMethod string // format: "Service.Method"
//Seq uint64 // sequence number chosen by client
InputParam []byte
requestHandle RequestHandler
}
func (agent *RpcAgent) WriteRespone(serviceMethod string,seq uint64,reply interface{},err *RpcError) { func (agent *RpcAgent) WriteRespone(serviceMethod string,seq uint64,reply interface{},err *RpcError) {
var rpcRespone RpcResponse var rpcRespone RpcResponse

View File

@@ -1,10 +1,13 @@
package service package service
import ( import (
"fmt"
"github.com/duanhf2012/origin/event" "github.com/duanhf2012/origin/event"
"github.com/duanhf2012/origin/log"
"github.com/duanhf2012/origin/rpc" "github.com/duanhf2012/origin/rpc"
"github.com/duanhf2012/origin/util/timer" "github.com/duanhf2012/origin/util/timer"
"reflect" "reflect"
"runtime"
"sync" "sync"
"sync/atomic" "sync/atomic"
) )
@@ -27,7 +30,6 @@ type IService interface {
} }
type Service struct { type Service struct {
Module Module
rpc.RpcHandler //rpc rpc.RpcHandler //rpc
@@ -38,6 +40,7 @@ type Service struct {
serviceCfg interface{} serviceCfg interface{}
gorouterNum int32 gorouterNum int32
startStatus bool startStatus bool
} }
func (slf *Service) OnSetup(iservice IService){ func (slf *Service) OnSetup(iservice IService){
@@ -82,6 +85,7 @@ func (slf *Service) Start() {
} }
func (slf *Service) Run() { func (slf *Service) Run() {
defer slf.wg.Done() defer slf.wg.Done()
var bStop = false var bStop = false
for{ for{
@@ -96,7 +100,7 @@ func (slf *Service) Run() {
case rpcResponeCB := <- rpcResponeCallBack: case rpcResponeCB := <- rpcResponeCallBack:
slf.GetRpcHandler().HandlerRpcResponeCB(rpcResponeCB) slf.GetRpcHandler().HandlerRpcResponeCB(rpcResponeCB)
case ev := <- eventChan: case ev := <- eventChan:
slf.this.(event.IEventProcessor).OnEventHandler(ev) slf.EventHandler(slf.this.(event.IEventProcessor),ev)
case t := <- slf.dispatcher.ChanTimer: case t := <- slf.dispatcher.ChanTimer:
t.Cb() t.Cb()
} }
@@ -118,6 +122,16 @@ func (slf *Service) GetName() string{
func (slf *Service) OnRelease(){ func (slf *Service) OnRelease(){
defer func() {
if r := recover(); r != nil {
buf := make([]byte, 40960)
l := runtime.Stack(buf, false)
err := fmt.Errorf("%v: %s", r, buf[:l])
log.Error("core dump info:%+v\n",err)
}
}()
slf.this.OnRelease()
} }
func (slf *Service) OnInit() error { func (slf *Service) OnInit() error {

View File

@@ -1,6 +1,9 @@
package timer package timer
import ( import (
"fmt"
"github.com/duanhf2012/origin/log"
"runtime"
"time" "time"
) )
@@ -28,20 +31,14 @@ func (t *Timer) Stop() {
} }
func (t *Timer) Cb() { func (t *Timer) Cb() {
/*
defer func() { defer func() {
t.cb = nil
if r := recover(); r != nil { if r := recover(); r != nil {
if conf.LenStackBuf > 0 { buf := make([]byte, 40960)
buf := make([]byte, conf.LenStackBuf) l := runtime.Stack(buf, false)
l := runtime.Stack(buf, false) err := fmt.Errorf("%v: %s", r, buf[:l])
log.Error("%v: %s", r, buf[:l]) log.Error("core dump info:%+v\n",err)
} else {
log.Error("%v", r)
}
} }
}() }()
*/
if t.cbex!=nil { if t.cbex!=nil {
t.cbex(t) t.cbex(t)