Added worker registry in registry.go
This commit is contained in:
68
services/data_service/internal/worker/registry.go
Normal file
68
services/data_service/internal/worker/registry.go
Normal file
@@ -0,0 +1,68 @@
|
||||
package worker
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type Factory func() Worker
|
||||
|
||||
type Registry struct {
|
||||
mu sync.RWMutex
|
||||
workerFactories map[string]Factory
|
||||
}
|
||||
|
||||
func NewRegistry() *Registry {
|
||||
return &Registry{
|
||||
workerFactories: make(map[string]Factory),
|
||||
}
|
||||
}
|
||||
|
||||
func (r *Registry) Register(workerType string, workerFactory Factory) error {
|
||||
r.mu.Lock()
|
||||
defer r.mu.Unlock()
|
||||
|
||||
if _, ok := r.workerFactories[workerType]; ok {
|
||||
return fmt.Errorf("worker already registered: %s", workerType)
|
||||
}
|
||||
|
||||
if workerFactory == nil {
|
||||
return fmt.Errorf("nil workerFactory provided for: %s", workerType)
|
||||
}
|
||||
|
||||
r.workerFactories[workerType] = workerFactory
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Registry) Spawn(workerType string) (Worker, error) {
|
||||
r.mu.RLock()
|
||||
defer r.mu.RUnlock()
|
||||
|
||||
workerFactory, ok := r.workerFactories[workerType]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("unknown worker type: %s", workerType)
|
||||
}
|
||||
|
||||
return workerFactory(), nil
|
||||
}
|
||||
|
||||
func (r *Registry) RegisteredWorkers() []string {
|
||||
r.mu.RLock()
|
||||
defer r.mu.RUnlock()
|
||||
|
||||
workerTypes := make([]string, 0, len(r.workerFactories))
|
||||
for k := range r.workerFactories {
|
||||
workerTypes = append(workerTypes, k)
|
||||
}
|
||||
|
||||
return workerTypes
|
||||
}
|
||||
|
||||
func (r *Registry) Factory(workerType string) (Factory, bool) {
|
||||
r.mu.RLock()
|
||||
defer r.mu.RUnlock()
|
||||
|
||||
workerFactory, ok := r.workerFactories[workerType]
|
||||
return workerFactory, ok
|
||||
}
|
||||
Reference in New Issue
Block a user