1 Star 2 Fork 0

李文建 / light-protoactor-go

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
activator_actor.go 2.27 KB
一键复制 编辑 原始数据 按行查看 历史
李文建 提交于 2017-11-08 17:09 . Revert "context添加ChildrenMap方法"
package remote
import (
"errors"
"time"
"gitee.com/lwj8507/light-protoactor-go/actor"
)
var (
nameLookup = make(map[string]actor.Props)
activatorPid *actor.PID
)
func spawnActivatorActor() {
activatorPid, _ = actor.SpawnNamed(actor.FromProducer(newActivatorActor()), "activator")
}
//Register a known actor props by name
func Register(kind string, props *actor.Props) {
nameLookup[kind] = *props
}
//GetKnownKinds returns a slice of known actor "kinds"
func GetKnownKinds() []string {
keys := make([]string, 0, len(nameLookup))
for k := range nameLookup {
keys = append(keys, k)
}
return keys
}
type activator struct {
}
func ActivatorForAddress(address string) *actor.PID {
pid := actor.NewPID(address, "activator")
return pid
}
func SpawnFuture(address, name, kind string, timeout time.Duration) *actor.Future {
activator := ActivatorForAddress(address)
f := actor.RequestFuture(activator, &ActorPidRequest{
Name: name,
Kind: kind,
}, timeout)
return f
}
func Spawn(address, kind string, timeout time.Duration) (*actor.PID, error) {
return SpawnNamed(address, "", kind, timeout)
}
func SpawnNamed(address, name, kind string, timeout time.Duration) (*actor.PID, error) {
activator := ActivatorForAddress(address)
res, err := actor.RequestFuture(activator, &ActorPidRequest{
Name: name,
Kind: kind,
}, timeout).Result()
if err != nil {
return nil, errors.New("remote: Remote activating timed out")
}
switch msg := res.(type) {
case *ActorPidResponse:
return msg.Pid, nil
default:
return nil, errors.New("remote: Unknown response when remote activating")
}
}
func newActivatorActor() actor.Producer {
return func() actor.Actor {
return &activator{}
}
}
func (*activator) Receive(context actor.Context) {
switch msg := context.Message().(type) {
case *actor.Started:
logger.Info("Started Activator")
case *actor.Stopping:
case *actor.Stopped:
logger.Info("Stopped Activator")
case *ActorPidRequest:
props := nameLookup[msg.Kind]
name := msg.Name
//unnamed actor, assign auto ID
if name == "" {
name = actor.ProcessRegistry.NextId()
}
pid, _ := actor.SpawnNamed(&props, "Remote$"+name)
response := &ActorPidResponse{
Pid: pid,
}
context.Respond(response)
default:
logger.Error("Activator got unknown message=[%#v]", msg)
}
}
Go
1
https://gitee.com/lwj8507/light-protoactor-go.git
git@gitee.com:lwj8507/light-protoactor-go.git
lwj8507
light-protoactor-go
light-protoactor-go
013e33d7022f

搜索帮助