Skip to content

Commit

Permalink
开放日志消息队列,开放日志实现接口参数
Browse files Browse the repository at this point in the history
  • Loading branch information
zhuxiujia committed Jan 26, 2019
1 parent 6b633e5 commit bb10055
Show file tree
Hide file tree
Showing 8 changed files with 60 additions and 40 deletions.
60 changes: 45 additions & 15 deletions GoMybatis.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,30 +10,60 @@ import (
//如果使用WriteMapperByEngine(),则内建默认的SessionFactory
var DefaultSessionFactory *SessionFactory

//根据sessionEngine写入到mapperPtr
func WriteMapperByEngine(value reflect.Value, xml []byte, sessionEngine *SessionEngine, enableLog bool) {
var DefaultExpressionTypeConvert ExpressionTypeConvert

var DefaultSqlArgTypeConvert SqlArgTypeConvert

var DefaultExpressionEngine ExpressionEngine

var DefaultSqlBuilder SqlBuilder

var DefaultSqlResultDecoder SqlResultDecoder

var DefaultLog Log

//推荐默认使用单例传入
//根据sessionEngine写入到mapperPtr,value:指向mapper指针反射对象,xml:xml数据,sessionEngine:session引擎,enableLog:是否允许日志输出,log:日志实现
func WriteMapperByEngine(value reflect.Value, xml []byte, sessionEngine *SessionEngine, enableLog bool, log Log) {
if value.Kind() != reflect.Ptr {
panic("UseMapper: UseMapper arg must be a pointer")
}
var factory = SessionFactory{}.New(sessionEngine)
if DefaultSessionFactory == nil {
var factory = SessionFactory{}.New(sessionEngine)
DefaultSessionFactory = &factory
}
var expressConvert=GoMybatisExpressionTypeConvert{}
var sqlConvert=GoMybatisSqlArgTypeConvert{}
var expressionEngine = ExpressionEngineProxy{}.New(&ExpressionEngineExpr{},true)
var sqlBuilder=GoMybatisSqlBuilder{}.New(expressConvert,sqlConvert, expressionEngine,&LogStandard{},enableLog)
var decoder = GoMybatisSqlResultDecoder{}
WriteMapper(value, xml, DefaultSessionFactory, decoder,sqlBuilder,enableLog)
if DefaultExpressionTypeConvert == nil {
DefaultExpressionTypeConvert = GoMybatisExpressionTypeConvert{}
}
if DefaultSqlArgTypeConvert == nil {
DefaultSqlArgTypeConvert = GoMybatisSqlArgTypeConvert{}
}
if DefaultExpressionEngine == nil {
DefaultExpressionEngine = &ExpressionEngineExpr{}
}
var expressionEngineProxy = ExpressionEngineProxy{}.New(DefaultExpressionEngine, true)
if log == nil {
DefaultLog = &LogStandard{}
} else {
DefaultLog = log
}
if DefaultSqlBuilder == nil {
DefaultSqlBuilder = GoMybatisSqlBuilder{}.New(DefaultExpressionTypeConvert, DefaultSqlArgTypeConvert, expressionEngineProxy, DefaultLog, enableLog)
}
if DefaultSqlResultDecoder == nil {
DefaultSqlResultDecoder = GoMybatisSqlResultDecoder{}
}
WriteMapper(value, xml, DefaultSessionFactory, DefaultSqlResultDecoder, DefaultSqlBuilder, enableLog)
}

//根据sessionEngine写入到mapperPtr
func WriteMapperPtrByEngine(ptr interface{}, xml []byte, sessionEngine *SessionEngine, enableLog bool) {
//推荐默认使用单例传入
//根据sessionEngine写入到mapperPtr,ptr:指向mapper指针,xml:xml数据,sessionEngine:session引擎,enableLog:是否允许日志输出,log:日志实现
func WriteMapperPtrByEngine(ptr interface{}, xml []byte, sessionEngine *SessionEngine, enableLog bool, log Log) {
v := reflect.ValueOf(ptr)
if v.Kind() != reflect.Ptr {
panic("UseMapper: UseMapper arg must be a pointer")
}
WriteMapperByEngine(v, xml, sessionEngine, enableLog)
WriteMapperByEngine(v, xml, sessionEngine, enableLog, log)
}

//写入方法内容,例如
Expand All @@ -48,7 +78,7 @@ func WriteMapperPtrByEngine(ptr interface{}, xml []byte, sessionEngine *SessionE
//func的结构体参数无需指定mapperParams的tag,框架会自动扫描它的属性,封装为map处理掉
//使用WriteMapper函数设置代理后即可正常使用。
func WriteMapper(bean reflect.Value, xml []byte, sessionFactory *SessionFactory, decoder SqlResultDecoder, sqlBuilder SqlBuilder, enableLog bool) {
beanCheck(bean,sqlBuilder)
beanCheck(bean, sqlBuilder)
var mapperTree = LoadMapperXml(xml)
//make a map[method]xml
var methodXmlMap = makeMethodXmlMap(bean, mapperTree)
Expand Down Expand Up @@ -91,7 +121,7 @@ func WriteMapper(bean reflect.Value, xml []byte, sessionFactory *SessionFactory,
}

//check beans
func beanCheck(value reflect.Value,builder SqlBuilder) {
func beanCheck(value reflect.Value, builder SqlBuilder) {
var t = value.Type()
if t.Kind() == reflect.Ptr {
t = t.Elem()
Expand All @@ -105,7 +135,7 @@ func beanCheck(value reflect.Value,builder SqlBuilder) {
var customLen = 0
for argIndex := 0; argIndex < fieldItem.Type.NumIn(); argIndex++ {
var inType = fieldItem.Type.In(argIndex)
if builder.ExpressionEngineProxy().Name()=="ExpressionEngineGovaluate" && inType.Kind() == reflect.Ptr && inType.String() != GoMybatis_Session_Ptr {
if builder.ExpressionEngineProxy().Name() == "ExpressionEngineGovaluate" && inType.Kind() == reflect.Ptr && inType.String() != GoMybatis_Session_Ptr {
panic(`[GoMybats] ` + fieldItem.Name + `() arg = ` + inType.String() + ` can not be a ptr ! must delete '*'!`)
}
if isCustomStruct(inType) {
Expand Down
2 changes: 1 addition & 1 deletion GoMybatisEngine_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,6 @@ func InitMapperByLocalSession() ExampleActivityMapperImpl {
</select>`)
var exampleActivityMapperImpl ExampleActivityMapperImpl
//设置对应的mapper xml文件,禁止输出日志
WriteMapperPtrByEngine(&exampleActivityMapperImpl, bytes, engine, false)
WriteMapperPtrByEngine(&exampleActivityMapperImpl, bytes, engine, false,nil)
return exampleActivityMapperImpl
}
3 changes: 2 additions & 1 deletion Log.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package GoMybatis

type Log interface {
Println(messages []byte)
QueueLen() int//日志消息队列长度
Println(messages []byte)//日志输出方法实现
}
8 changes: 7 additions & 1 deletion LogStandard.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,15 @@ package GoMybatis
import "log"

type LogStandard struct {
PrintlnFunc func(v []byte)
PrintlnFunc func(messages []byte)//日志输出方法实现
}

//日志消息队列长度
func (this *LogStandard) QueueLen() int {
//默认50万个日志消息缓存队列
return 500000
}
//日志输出方法实现
func (this *LogStandard) Println(v []byte) {
if this.PrintlnFunc != nil {
this.PrintlnFunc(v)
Expand Down
19 changes: 1 addition & 18 deletions LogSystem.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,16 @@ package GoMybatis
import (
"bytes"
"github.com/zhuxiujia/GoMybatis/utils"
"time"
)

type LogMode int

const (
Log_Mode_async LogMode = iota //异步,非实时
Log_Mode_Real_Time //同步,实时
)

type LogSystem struct {
log Log
logChan chan []byte
started bool
mode LogMode
}

//logImpl:日志实现类,queueLen:消息队列缓冲长度
func (this LogSystem) New(logImpl Log, queueLen int, mode LogMode) (LogSystem, error) {
func (this LogSystem) New(logImpl Log, queueLen int) (LogSystem, error) {
if this.started == true {
return this, utils.NewError("LogSystem", "log system is started!")
}
Expand All @@ -30,8 +21,6 @@ func (this LogSystem) New(logImpl Log, queueLen int, mode LogMode) (LogSystem, e
}
this.logChan = make(chan []byte, queueLen)
this.log = logImpl
this.mode = mode

//启动接受者
go this.receiver()
this.started = true
Expand Down Expand Up @@ -61,12 +50,6 @@ func (this *LogSystem) SendLog(logs ...string) error {
//日志接受者
func (this *LogSystem) receiver() error {
for {
if this.mode == Log_Mode_async {
//非实时,加延迟,出让cpu时间片,否则日志占用cpu过多将拖慢系统
time.Sleep(50 * time.Millisecond)
} else if this.mode == Log_Mode_Real_Time {
//实时,直接执行操作
}
logs := <-this.logChan
this.log.Println(logs)
}
Expand Down
4 changes: 2 additions & 2 deletions LogSystem_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ func TestLogSystem_SendLog(t *testing.T) {
endChan <- 1
},
}
var system, err = LogSystem{}.New(&stdLog, 1000000, Log_Mode_async)
var system, err = LogSystem{}.New(&stdLog, 1000000)
if err != nil {
t.Fatal(err)
}
Expand All @@ -35,7 +35,7 @@ func TestLogSystem_Close(t *testing.T) {
endChan <- 1
},
}
var system, err = LogSystem{}.New(&stdLog, 1000000, Log_Mode_async)
var system, err = LogSystem{}.New(&stdLog, 1000000)
if err != nil {
t.Fatal(err)
}
Expand Down
2 changes: 1 addition & 1 deletion SqlBuilder.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ func (this GoMybatisSqlBuilder) New(ExpressionTypeConvert ExpressionTypeConvert,
this.expressionEngineProxy = expressionEngine
this.enableLog = enableLog
if enableLog {
var logSystem, err = LogSystem{}.New(log, 1000, Log_Mode_async)
var logSystem, err = LogSystem{}.New(log, log.QueueLen())
if err != nil {
panic(err)
}
Expand Down
2 changes: 1 addition & 1 deletion example/Example_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ func init() {

bytes, _ := ioutil.ReadAll(file)
//设置对应的mapper xml文件
GoMybatis.WriteMapperPtrByEngine(&exampleActivityMapper, bytes, engine, true)
GoMybatis.WriteMapperPtrByEngine(&exampleActivityMapper, bytes, engine, true,nil)
}

//插入
Expand Down

0 comments on commit bb10055

Please sign in to comment.