123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- package pomelo
- import (
- cfacade "github.com/mhaya/facade"
- clog "github.com/mhaya/logger"
- pmessage "github.com/mhaya/net/parser/pomelo/message"
- cproto "github.com/mhaya/net/proto"
- )
- // DefaultDataRoute 默认的消息路由
- func DefaultDataRoute(agent *Agent, route *pmessage.Route, msg *pmessage.Message) {
- session := BuildSession(agent, msg)
- // current node
- if agent.NodeType() == route.NodeType() {
- targetPath := cfacade.NewChildPath(agent.NodeId(), route.HandleName(), session.Sid)
- LocalDataRoute(agent, session, route, msg, targetPath)
- return
- }
- if !session.IsBind() {
- clog.Warnf("[sid = %s,uid = %d] Session is not bind with UID. failed to forward message.[route = %s]",
- agent.SID(),
- agent.UID(),
- msg.Route,
- )
- return
- }
- member, found := agent.Discovery().Random(route.NodeType())
- if !found {
- return
- }
- targetPath := cfacade.NewPath(member.GetNodeId(), route.HandleName())
- err := ClusterLocalDataRoute(agent, session, route, msg, member.GetNodeId(), targetPath)
- if err != nil {
- clog.Warnf("[sid = %s,uid = %d,route = %s] cluster local data error. err= %v",
- agent.SID(),
- agent.UID(),
- msg.Route,
- err,
- )
- }
- }
- func LocalDataRoute(agent *Agent, session *cproto.Session, route *pmessage.Route, msg *pmessage.Message, targetPath string) {
- message := cfacade.GetMessage()
- message.Source = session.AgentPath
- message.Target = targetPath
- message.FuncName = route.Method()
- message.Session = session
- message.Args = msg.Data
- agent.ActorSystem().PostLocal(&message)
- }
- func ClusterLocalDataRoute(agent *Agent, session *cproto.Session, route *pmessage.Route, msg *pmessage.Message, nodeID, targetPath string) error {
- clusterPacket := cproto.GetClusterPacket()
- clusterPacket.SourcePath = session.AgentPath
- clusterPacket.TargetPath = targetPath
- clusterPacket.FuncName = route.Method()
- clusterPacket.Session = session // agent session
- clusterPacket.ArgBytes = msg.Data // packet -> message -> data
- return agent.Cluster().PublishLocal(nodeID, clusterPacket)
- }
- func BuildSession(agent *Agent, msg *pmessage.Message) *cproto.Session {
- agent.session.Mid = uint32(msg.ID)
- return agent.session
- }
|