mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-04 06:54:45 +08:00
异常宕机捕获处理
This commit is contained in:
@@ -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)
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user