Exemplo n.º 1
0
        public IModulePipeline GetPipeline(IModuleInstance user, string urlActor)
        {
            if (bStarted == false)
            {
                throw new Exception("must getpipeline after System.Start()");
            }

            var userstr = "";

            if (user != null)
            {
                userstr = localModulePath[user];
            }
            var refName = userstr + "_" + urlActor;

            //if (refPipelines.TryGetValue(refName, out IModulePipeline pipe))
            //{
            //    return pipe;
            //}

            if (urlActor[0] == '@')//收到通讯
            {
                var             sppos  = urlActor.IndexOf('/');
                var             addrid = UInt64.Parse(urlActor.Substring(1, sppos - 1));
                var             path   = urlActor.Substring(sppos + 1);
                var             addr   = linkedIP[addrid];
                ISystemPipeline refsys = null;
                if (refSystems.TryGetValue(addr, out refsys))
                {
                    return(refsys.GetPipeline(user, path));
                }
                else
                {//没连接
                    return(null);
                }
                //refPipelines[refName] = new PipelineRefRemote(refSystemThis, userstr, refsys as RefSystemRemote, path);
                //return refPipelines[refName];
            }
            if (urlActor.IndexOf("this/") == 0)//本地模块
            {
                var actorpath = urlActor.Substring(5);
                //var actor = this.localModules[actorpath];
                return(refSystemThis.GetPipeline(user, actorpath));
                //refPipelines[refName] = new PipelineRefLocal(refSystemThis, userstr, actorpath, actor);
                //return refPipelines[refName];
            }
            else //有地址的模块
            {
                var             sppos  = urlActor.IndexOf('/');
                var             addr   = urlActor.Substring(0, sppos);
                var             path   = urlActor.Substring(sppos + 1);
                ISystemPipeline refsys = null;
                if (refSystems.TryGetValue(addr, out refsys))
                {
                    IModulePipeline node = refsys.GetPipeline(user, path);
                    //if(PreInit!=null)
                    //{
                    //    PreInit(node);
                    //}
                    return(node);
                }
                else
                {//没连接
                    IModulePipeline node = null;
                    refsys = this.Connect(addr.AsIPEndPoint(), (system) => {
                        node = system.GetPipeline(user, path);
                        //if (PreInit != null)
                        //{
                        //    PreInit(node);
                        //}
                    });
                    return(node);
                }

                //refPipelines[refName] = new PipelineRefRemote(refSystemThis, userstr, refsys as RefSystemRemote, path);
                //return refPipelines[refName];
            }
        }