samba/pkg/service/serviceMgr.go
2025-06-04 09:51:39 +08:00

80 lines
1.8 KiB
Go

package service
import (
"fmt"
cmap "github.com/orcaman/concurrent-map/v2"
"strings"
)
const prefixKeyService = "/cluster"
func init() {
newServiceMgr()
}
var mgr *serviceMgr
type serviceMgr struct {
services cmap.ConcurrentMap[string, IService]
//rpcMsg cmap.ConcurrentMap[string, *mq.RpcMessage]
}
func newServiceMgr() {
mgr = &serviceMgr{
services: cmap.New[IService](),
//rpcMsg: cmap.New[*mq.RpcMessage](),
}
}
func getServiceTypeByName(serviceName string) (string, bool) {
names := strings.Split(serviceName, serviceTypeSet)
if len(names) > 0 {
return names[0], true
}
return "", false
}
func FindServiceByType(serviceType string) []IService {
services := make([]IService, 0)
mgr.services.IterCb(func(key string, service IService) {
if type_, ok := getServiceTypeByName(key); ok && type_ == serviceType {
services = append(services, service)
}
})
return services
}
func FindServiceByName(serviceName string) (IService, bool) {
return mgr.services.Get(serviceName)
}
//func Send(msg *Message, src, dst string) error {
// if s, ok := FindServiceByName(src); ok {
// return s.Send(msg, dst)
// }
// return fmt.Errorf("src service:%v is not exist", src)
//}
//func Call(funcName, src, dst string, duration time.Duration, args ...interface{}) ([]interface{}, error) {
// if s, ok := FindServiceByName(src); ok {
// return s.Call(funcName, dst, duration, args...)
// }
// return nil, fmt.Errorf("src service:%v is not exist", src)
//}
func etcdServiceName(serviceType, serviceName string) string {
return fmt.Sprintf("%v/%v/%v", prefixKeyService, serviceType, serviceName)
}
func registerService(s IService) {
mgr.services.Set(s.Name(), s)
}
func unregisterService(name string) {
if s, ok := mgr.services.Get(name); ok {
s.NotifyStop()
mgr.services.Remove(name)
s.WaitStop()
}
}