改进ghttp.Request.Exit,使得调用该方法时立即退出业务执行,开发者无需调用Exit方法时再使用return返回;glog模块增加To链式操作方法,执行下一次写入的writer

This commit is contained in:
john
2018-11-06 18:53:25 +08:00
parent 7fa564a8f0
commit c27aa61e02
11 changed files with 107 additions and 31 deletions

View File

@ -39,11 +39,11 @@ func Dump(i...interface{}) {
}
// 抛出一个异常
func Throw(err interface{}) {
gutil.Throw(err)
func Throw(exception interface{}) {
gutil.Throw(exception)
}
// try...catch...
func TryCatch(try func(), catch func(err interface{})) {
gutil.TryCatch(try, catch)
func TryCatch(try func(), catch ... func(exception interface{})) {
gutil.TryCatch(try, catch...)
}

View File

@ -154,6 +154,7 @@ func (r *Request) GetToStruct(object interface{}, mapping...map[string]string) {
// 退出当前请求执行原理是在Request.exit做标记由服务逻辑流程做判断自行停止
func (r *Request) Exit() {
r.exit.Set(true)
panic(gEXCEPTION_EXIT)
}
// 判断当前请求是否停止执行

View File

@ -52,6 +52,7 @@ const (
gROUTE_REGISTER_HANDLER = 1
gROUTE_REGISTER_OBJECT = 2
gROUTE_REGISTER_CONTROLLER = 3
gEXCEPTION_EXIT = "exit"
)
// ghttp.Server结构体

View File

@ -8,16 +8,16 @@
package ghttp
import (
"os"
"fmt"
"sort"
"reflect"
"strings"
"net/url"
"net/http"
"gitee.com/johng/gf/g/encoding/ghtml"
"gitee.com/johng/gf/g/os/gfile"
"gitee.com/johng/gf/g/os/gtime"
"gitee.com/johng/gf/g/encoding/ghtml"
"net/http"
"net/url"
"os"
"reflect"
"sort"
"strings"
)
// 默认HTTP Server处理入口http包底层默认使用了gorutine异步处理请求所以这里不再异步执行
@ -118,6 +118,11 @@ func (s *Server)handleRequest(w http.ResponseWriter, r *http.Request) {
// 初始化控制器
func (s *Server)callServeHandler(h *handlerItem, r *Request) {
defer func() {
if e := recover(); e != nil && e != gEXCEPTION_EXIT {
panic(e)
}
}()
if h.faddr == nil {
// 新建一个控制器对象处理请求
c := reflect.New(h.ctype)

View File

@ -43,6 +43,11 @@ func (s *Server)BindHookHandlerByMap(pattern string, hookmap map[string]HandlerF
func (s *Server) callHookHandler(hook string, r *Request) {
hookItems := s.getHookHandlerWithCache(hook, r)
if len(hookItems) > 0 {
defer func() {
if e := recover(); e != nil && e != gEXCEPTION_EXIT {
panic(e)
}
}()
// 备份原有的router变量
oldRouterVars := r.routerVars
for _, item := range hookItems {

View File

@ -11,6 +11,7 @@ package glog
import (
"gitee.com/johng/gf/g/container/gtype"
"io"
)
const (
@ -47,6 +48,16 @@ func SetLevel(level int) {
defaultLevel.Set(level)
}
// 可自定义IO接口IO可以是文件输出、标准输出、网络输出
func SetWriter(writer io.Writer) {
logger.SetWriter(writer)
}
// 返回自定义的IO默认为nil
func GetWriter() io.Writer {
return logger.GetWriter()
}
// 获取全局的日志记录等级
func GetLevel() int {
return defaultLevel.Val()
@ -82,6 +93,11 @@ func SetBacktrace(enabled bool) {
logger.SetBacktrace(enabled)
}
// 链式操作设置下一次写入日志内容的Writer
func To(writer io.Writer) *Logger {
return logger.To(writer)
}
// 设置下一次输出的分类,支持多级分类设置
func Cat(category string) *Logger {
return logger.Cat(category)

View File

@ -112,9 +112,9 @@ func (l *Logger) SetBacktraceSkip(skip int) {
}
// 可自定义IO接口IO可以是文件输出、标准输出、网络输出
func (l *Logger) SetWriter(w io.Writer) {
func (l *Logger) SetWriter(writer io.Writer) {
l.mu.Lock()
l.io = w
l.io = writer
l.mu.Unlock()
}
@ -191,13 +191,13 @@ func (l *Logger) print(std io.Writer, s string) {
fmt.Fprintln(os.Stderr, err.Error())
}
}
// 当没有设置writer时需要判断是否允许输出到标准输出
if l.alsoStdPrint.Val() {
l.doStdLockPrint(std, s)
}
} else {
l.doStdLockPrint(writer, s)
}
// 是否允许输出到标准输出
if l.alsoStdPrint.Val() {
l.doStdLockPrint(std, s)
}
}
// 并发安全打印到标准输出

View File

@ -6,7 +6,22 @@
package glog
import "gitee.com/johng/gf/g/os/gfile"
import (
"gitee.com/johng/gf/g/os/gfile"
"io"
)
// 链式操作设置下一次写入日志内容的Writer
func (l *Logger) To(writer io.Writer) *Logger {
logger := (*Logger)(nil)
if l.pr == nil {
logger = l.Clone()
} else {
logger = l
}
logger.SetWriter(writer)
return logger
}
// 链式操作,设置下一次输出的日志分类(可以按照文件目录层级设置)在当前logpath或者当前工作目录下创建category目录
// 这是一个链式操作,可以设置多个分类,将会创建层级的日志分类目录。

View File

@ -66,17 +66,19 @@ func PrintBacktrace() {
}
// 抛出一个异常
func Throw(err interface{}) {
panic(err)
func Throw(exception interface{}) {
panic(exception)
}
// try...catch...
func TryCatch(try func(), catch func(err interface{})) {
defer func() {
if err := recover(); err != nil {
catch(err)
}
}()
func TryCatch(try func(), catch ... func(exception interface{})) {
if len(catch) > 0 {
defer func() {
if e := recover(); e != nil {
catch[0](e)
}
}()
}
try()
}

View File

@ -0,0 +1,27 @@
package main
import (
"gitee.com/johng/gf/g"
"gitee.com/johng/gf/g/os/glog"
"gitee.com/johng/gf/g/net/ghttp"
)
func main() {
p := "/"
s := g.Server()
s.BindHandler(p, func(r *ghttp.Request) {
r.Response.Writeln("start")
r.Exit()
r.Response.Writeln("end")
})
s.BindHookHandlerByMap(p, map[string]ghttp.HandlerFunc{
"BeforeServe" : func(r *ghttp.Request){
glog.To(r.Response.Writer).Println("BeforeServe")
},
"AfterServe" : func(r *ghttp.Request){
glog.To(r.Response.Writer).Println("AfterServe")
},
})
s.SetPort(8199)
s.Run()
}

View File

@ -2,13 +2,17 @@ package main
import (
"fmt"
"gitee.com/johng/gf/g/os/gtime"
)
type T struct {
}
func main() {
s := `
172.20.1.198 - - [2018-11-06T16:26:09+08:00] "POST /passport HTTP/1.1" "OK" 1 200 0.000 0.035 0.035 0.035 448 "-" "-" "-" "{\x22jsonrpc\x22:\x222.0\x22,\x22method\x22:\x22getSessionInfo\x22,\x22params\x22:[\x2262703819__6augmxzV9f5c7o4MEimnMqPhoyKWPi8pXjs2VIj3T43vBfuGZOJ9DxrbRNsFB0ew\x22,true,{\x22platform\x22:\x22web-ph\x22}],\x22id\x22:1}" http unix:/var/run/php/php5.6-fpm.sock med3-svr [med3-svr-65494945bf-jppth] "" "" "" [med3-svr-65494945bf-jppth]
`
var i interface{}
i = "s"
i = make([]string, 100)
fmt.Println(gtime.ParseTimeFromContent(s))
if i == "s" {
fmt.Println(1)
}
}