go泛型实现通用对象池封装

连接池基类

package generalpool

import (
    "context"
    "git.ichub.com/general/webcli120/goconfig/base/baseiface"
    "git.ichub.com/general/webcli120/goconfig/base/baseutils"
    "git.ichub.com/general/webcli120/goconfig/base/goutils"
    pool "github.com/jolestar/go-commons-pool"
    "reflect"
    "time"
)

const maxtotal = 1000
const maxidle = 100

type GeneralObjectPool[T baseiface.IpoolObj] struct {
    CommonPool *pool.ObjectPool
}

// NewGeneralObjectPool 使用传入的上下文初始化连接池
func NewGeneralObjectPool[T baseiface.IpoolObj]() *GeneralObjectPool[T] {
    var msgPool = &GeneralObjectPool[T]{}
    return msgPool.init(context.Background())
}

func (self *GeneralObjectPool[T]) init(ctx context.Context) *GeneralObjectPool[T] {
    PoolConfig := pool.NewDefaultPoolConfig()
    PoolConfig.MaxTotal = maxtotal
    PoolConfig.MaxIdle = maxidle

    WithAbandonedConfig := pool.NewDefaultAbandonedConfig()
    self.CommonPool = pool.NewObjectPoolWithAbandonedConfig(ctx, pool.NewPooledObjectFactorySimple(
       func(ctx context.Context) (interface{}, error) {
          return self.Link()
       }), PoolConfig, WithAbandonedConfig)
    return self
}

// Link 初始化连接 ,通过指针初始化结构体
func (self *GeneralObjectPool[T]) Link() (T, error) {
    var ptr T
    var objType = reflect.TypeOf(ptr)
    var value = reflect.New(objType.Elem())
    return value.Interface().(T), nil
}

// BorrowObject 从连接池借用对象,增加了错误处理和重试逻辑
func (self *GeneralObjectPool[T]) BorrowObject(ctx context.Context) (T, error) {
    var inst T
    obj, err := self.CommonPool.BorrowObject(ctx)
    if err != nil {
       goutils.Error("连接池获取对象失败", err)
       // 尝试重试逻辑
       time.Sleep(time.Second) // 简单示例,实际应用中可能需要更复杂的重试策略
       return inst, err
    }
    defer func() {
       if err := self.CommonPool.ReturnObject(ctx, obj); err != nil {
          goutils.Error("返回对象到连接池失败", err)
       }
    }()
    inst = obj.(T)
    inst.Init()
    baseutils.IfProxy(inst)
    return inst, nil
}

// ReturnObject 交还对象到连接池
func (self *GeneralObjectPool[T]) ReturnObject(ctx context.Context, object T) {
    object.Shutdown()
    self.CommonPool.ReturnObject(ctx, object)
}

连接池实例

package generalpool

import "git.ichub.com/general/webcli120/goconfig/base/basedto"

type IchubResultPool struct {
    basedto.BaseEntitySingle
    *GeneralObjectPool[*basedto.IchubResult]
}

func NewIchubResultPool() *IchubResultPool {
    return &IchubResultPool{
       GeneralObjectPool: NewGeneralObjectPool[*basedto.IchubResult](),
    }
}
ichubresult实现

type IpoolObj interface {
    Init()
    Shutdown()
}
func (this *IchubResult) Init() {
    this.Code = 200
    this.Msg = "成功"
    this.Data = nil
}
func (this *IchubResult) Shutdown() {
    // this.Code = 200
    // this.Msg = "成功"
    this.Data = nil
}

测试用例

INFO[2024-08-826 14:58:06]D:/go-ichub/git.ichub.com/webcli120/goconfig/base/generalpool/ichub_result_pool_test.go:61 git.ichub.com/general/webcli120/goconfig/base/generalpool.(*TestIchubResultPoolSuite).Test002_return() 
{
     "code": 200,
     "msg": "成功"
} <nil> 
INFO[2024-08-826 14:58:06]D:/go-ichub/git.ichub.com/webcli120/goconfig/base/generalpool/ichub_result_pool_test.go:67 git.ichub.com/general/webcli120/goconfig/base/generalpool.(*TestIchubResultPoolSuite).Test002_return() 
{
     "code": 200,
     "msg": "成功"
} <nil> 
INFO[2024-08-826 14:58:06]D:/go-ichub/git.ichub.com/webcli120/goconfig/base/generalpool/ichub_result_pool_test.go:50 git.ichub.com/general/webcli120/goconfig/base/generalpool.(*TestIchubResultPoolSuite).TearDownTest()  teardown test                               
INFO[2024-08-826 14:58:06]D:/go-ichub/git.ichub.com/webcli120/goconfig/base/generalpool/ichub_result_pool_test.go:40 git.ichub.com/general/webcli120/goconfig/base/generalpool.(*TestIchubResultPoolSuite).TearDownSuite()  teardown suite                              
--- PASS: TestIchubResultPoolSuites (0.00s)
    --- PASS: TestIchubResultPoolSuites/Test002_return (0.00s)
PASS

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leijmdas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值