mirror of
https://github.com/crawlab-team/crawlab.git
synced 2026-01-22 17:31:03 +01:00
89 lines
1.5 KiB
Go
89 lines
1.5 KiB
Go
package client
|
|
|
|
import (
|
|
"github.com/crawlab-team/crawlab/core/errors"
|
|
"github.com/crawlab-team/crawlab/core/interfaces"
|
|
"github.com/crawlab-team/crawlab/trace"
|
|
"github.com/emirpasic/gods/lists/arraylist"
|
|
"math/rand"
|
|
)
|
|
|
|
type Pool struct {
|
|
// settings
|
|
size int
|
|
cfgPath string
|
|
|
|
// internals
|
|
clients *arraylist.List
|
|
}
|
|
|
|
func (p *Pool) GetConfigPath() (path string) {
|
|
return p.cfgPath
|
|
}
|
|
|
|
func (p *Pool) SetConfigPath(path string) {
|
|
p.cfgPath = path
|
|
}
|
|
|
|
func (p *Pool) Init() (err error) {
|
|
for i := 0; i < p.size; i++ {
|
|
if err := p.NewClient(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (p *Pool) NewClient() (err error) {
|
|
c, err := NewClient()
|
|
if err != nil {
|
|
return trace.TraceError(err)
|
|
}
|
|
if err := c.Start(); err != nil {
|
|
return err
|
|
}
|
|
p.clients.Add(c)
|
|
return nil
|
|
}
|
|
|
|
func (p *Pool) GetClient() (c interfaces.GrpcClient, err error) {
|
|
idx := p.getRandomIndex()
|
|
res, ok := p.clients.Get(idx)
|
|
if !ok {
|
|
return nil, trace.TraceError(errors.ErrorGrpcClientNotExists)
|
|
}
|
|
c, ok = res.(interfaces.GrpcClient)
|
|
if !ok {
|
|
return nil, trace.TraceError(errors.ErrorGrpcInvalidType)
|
|
}
|
|
return c, nil
|
|
}
|
|
|
|
func (p *Pool) SetSize(size int) {
|
|
p.size = size
|
|
}
|
|
|
|
func (p *Pool) getRandomIndex() (idx int) {
|
|
return rand.Intn(p.clients.Size())
|
|
}
|
|
|
|
func NewPool(opts ...PoolOption) (p interfaces.GrpcClientPool, err error) {
|
|
// pool
|
|
p = &Pool{
|
|
size: 1,
|
|
clients: arraylist.New(),
|
|
}
|
|
|
|
// apply options
|
|
for _, opt := range opts {
|
|
opt(p)
|
|
}
|
|
|
|
// initialize
|
|
if err := p.Init(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return p, nil
|
|
}
|