73 lines
1.7 KiB
Go
73 lines
1.7 KiB
Go
|
|
package sqlAsyncMgr
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
|
||
|
|
"github.com/jinzhu/gorm"
|
||
|
|
"goutil/logUtil"
|
||
|
|
"goutil/stringUtil"
|
||
|
|
)
|
||
|
|
|
||
|
|
type SqlAsyncWorkerPool struct {
|
||
|
|
// 工作者数量
|
||
|
|
wcount int32
|
||
|
|
|
||
|
|
// 工作者列表
|
||
|
|
workers []*SqlAsyncWorker
|
||
|
|
}
|
||
|
|
|
||
|
|
// newSqlAsyncWorkerPool 构造同步池
|
||
|
|
func newSqlAsyncWorkerPool(workerCount int32, _flushCallBack func(*SqlAsyncItemModel), _logAction func(logUtil.LogType, string), _getSyncName func() string, db *gorm.DB) *SqlAsyncWorkerPool {
|
||
|
|
result := &SqlAsyncWorkerPool{
|
||
|
|
wcount: workerCount,
|
||
|
|
workers: make([]*SqlAsyncWorker, workerCount, workerCount),
|
||
|
|
}
|
||
|
|
|
||
|
|
var i int32
|
||
|
|
for i = 0; i < workerCount; i++ {
|
||
|
|
newWorker := newSqlAsyncWorker(i, _flushCallBack, _logAction, _getSyncName, db)
|
||
|
|
result.workers[i] = newWorker
|
||
|
|
}
|
||
|
|
|
||
|
|
return result
|
||
|
|
}
|
||
|
|
|
||
|
|
// Start 启动
|
||
|
|
func (this *SqlAsyncWorkerPool) Start() {
|
||
|
|
for _, w := range this.workers {
|
||
|
|
w.Start()
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Stop 停止工作
|
||
|
|
func (this *SqlAsyncWorkerPool) Stop() []*SqlAsyncItemModel {
|
||
|
|
result := make([]*SqlAsyncItemModel, 0)
|
||
|
|
for _, w := range this.workers {
|
||
|
|
if tempList := w.Stop(); tempList != nil {
|
||
|
|
result = append(result, tempList...)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return result
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetWork 获取指定work
|
||
|
|
func (this *SqlAsyncWorkerPool) GetWork(tableName string) (*SqlAsyncWorker, error) {
|
||
|
|
index := stringUtil.HashCode(tableName) % int(this.wcount)
|
||
|
|
if index < 0 || index >= int(this.wcount) {
|
||
|
|
return nil, fmt.Errorf("SqlAsyncWorkerPool中work数量为:%v,不存在id=%v的worker", this.wcount, index)
|
||
|
|
}
|
||
|
|
|
||
|
|
return this.workers[index], nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetWaitSyncCount 获取待同步的sql数量
|
||
|
|
func (this *SqlAsyncWorkerPool) GetWaitSyncCount() int32 {
|
||
|
|
var count int32
|
||
|
|
for _, w := range this.workers {
|
||
|
|
count = count + w.WaitSqlCount()
|
||
|
|
}
|
||
|
|
|
||
|
|
return count
|
||
|
|
}
|