Пример #1
0
        /// <summary>
        /// 是否包含服务上下文对应的消息发布对象
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public bool Contains(ServiceContext context)
        {
            ServiceRequest   request         = context.Request;
            bool             sessionRequired = context.SessionRequired;
            ServicePublisher pub             = null;
            string           key             = request.ServiceUrl;

            return(dict.ContainsKey(key));
        }
Пример #2
0
        /// <summary>
        /// 获取出版商,如果没有,则创建一个(享元模式)
        /// </summary>
        /// <param name="request">服务请求对象</param>
        /// <returns>出版商</returns>
        public ServicePublisher GetPublisher(IServiceContext context)
        {
            ServiceRequest request         = context.Request;
            bool           sessionRequired = context.SessionRequired;
            string         key             = "";

            if (request.RequestModel == RequestModel.ServiceEvent)
            {
                key = request.ServiceUrl;
            }
            else
            {
                key = string.Format("Publish://{0}/{1}", request.ServiceName, request.MethodName);
            }

            if (dict.ContainsKey(key))
            {
                return(dict[key]);
            }
            else
            {
                lock (_syncLock)
                {
                    if (dict.ContainsKey(key))
                    {
                        return(dict[key]);
                    }
                    else
                    {
                        ServicePublisher pub = null;
                        if (request.RequestModel == RequestModel.ServiceEvent)
                        {
                            pub = new EventServicePublisher(key, context);
                        }
                        else
                        {
                            if (sessionRequired)
                            {
                                pub = new SessionServicePublisher(key);
                            }
                            else
                            {
                                pub = new NoneSessionServicePublisher(key);
                            }
                        }

                        dict[key] = pub;
                        return(pub);
                    }
                }
            }
        }
Пример #3
0
        /// <summary>
        /// 获取出版商,如果没有,则创建一个(享元模式)
        /// </summary>
        /// <param name="request">服务请求对象</param>
        /// <returns>出版商</returns>
        public ServicePublisher GetPublisher(ServiceContext context)
        {
            ServiceRequest   request         = context.Request;
            bool             sessionRequired = context.SessionRequired;
            ServicePublisher pub             = null;
            string           key             = request.ServiceUrl;

            //if (request.RequestModel == RequestModel.ServiceEvent)
            //    key = request.ServiceUrl;
            //else
            //    key = string.Format("Publish://{0}/{1}", request.ServiceName, request.MethodName);

            if (dict.ContainsKey(key))
            {
                pub = dict[key];
            }
            else
            {
                lock (_syncLock)
                {
                    if (dict.ContainsKey(key))
                    {
                        pub = dict[key];
                    }
                    else
                    {
                        if (request.RequestModel == RequestModel.ServiceEvent)
                        {
                            pub = new EventServicePublisher(key, context);
                        }
                        else
                        {
                            if (sessionRequired)
                            {
                                pub = new SessionServicePublisher(key);
                            }
                            else
                            {
                                pub = new NoneSessionServicePublisher(key);
                            }
                            pub.Context = context;
                        }
                        dict[key] = pub;
                    }
                }
            }
            pub.AddProcessedRequest(request);
            return(pub);
        }
Пример #4
0
        protected override void Process()
        {
            if (this.Message.StartsWith("[CMD]"))
            {
                string cmdString = this.Message.Substring("[CMD]".Length);
                switch (cmdString)
                {
                case "DeSubscribeService":
                    SubscriberInfo   objSubInfo;
                    ServicePublisher publisher = PublisherFactory.Instance.Find(this.SubscriberInfo, out objSubInfo);
                    if (publisher != null)
                    {
                        publisher.DeSubscribe(objSubInfo);
                    }

                    break;

                case "UpdateServiceHost":
                    string        tempPath           = System.IO.Path.GetTempPath();
                    DirectoryInfo info               = new DirectoryInfo(tempPath);
                    string        servicesTempFolder = Path.Combine(info.FullName, "_TartGetTempFolder_Services");

                    Console.WriteLine("接收到[服务升级]命令,准备调用批处理程序...");

                    System.Diagnostics.Process.Start(".\\UpdateService.bat", servicesTempFolder);
                    Console.WriteLine("批处理程序启动成功,主程序即将退出。");
                    Console.Out.Flush();
                    System.Environment.Exit(0);
                    break;

                case "RemoteConsoleOutput":    //远程控制台输出
                    MessageListener currLstn = MessageCenter.Instance.GetListener(this.SubscriberInfo.FromIP, this.SubscriberInfo.FromPort);
                    Program.RemoteConsoleListener = currLstn;
                    break;
                }
            }
            ////取消订阅的服务方法
            //if (this.Message.Substring("[CMD]".Length) == "DeSubscribeService")
            //{
            //    SubscriberInfo objSubInfo;
            //    ServicePublisher publisher = PublisherFactory.Instance.Find(this.SubscriberInfo, out objSubInfo);
            //    if (publisher != null)
            //        publisher.DeSubscribe(objSubInfo);
            //}
            ////UpdateServiceHost 升级服务器
        }
Пример #5
0
        /// <summary>
        /// 根据订阅者信息,查找它所在的发布者
        /// </summary>
        /// <param name="sourceSubInfo"></param>
        /// <returns></returns>
        public ServicePublisher Find(SubscriberInfo sourceSubInfo, out SubscriberInfo objSubInfo)
        {
            objSubInfo = null;

            foreach (string key in dict.Keys)
            {
                ServicePublisher item = dict[key];
                var tempSubinfo       = item.SubscriberInfoList.ToArray().FirstOrDefault(p => p.FromIP == sourceSubInfo.FromIP &&
                                                                                         p.FromPort == sourceSubInfo.FromPort &&
                                                                                         p.MessageID == sourceSubInfo.MessageID);
                if (tempSubinfo != null)
                {
                    objSubInfo = tempSubinfo;
                    return(item);
                }
            }
            return(null);
        }
Пример #6
0
        /// <summary>
        /// 为当前监听器开启一个工作线程,不断处理请求,并将处理结果送给监听器
        /// </summary>
        /// <param name="listener"></param>
        /// <param name="messageId"></param>
        /// <param name="context"></param>
        private void StartPublishWorker(ServiceContext context)
        {
            //ServiceRequest request = context.Request;
            //request.ClientIP = this.SubscriberInfo.FromIP;
            //request.ClientPort = this.SubscriberInfo.FromPort;
            //request.ClientIdentity = this.SubscriberInfo.Identity;
            this.SubscriberInfo.Request = context.Request;

            ServicePublisher publisher = PublisherFactory.Instance.GetPublisher(context);

            if (publisher.SubscriberInfoList.Count == 0)
            {
                publisher.PublisherErrorEvent += new EventHandler <ServiceErrorEventArgs>(publisher_PublisherErrorEvent);
            }
            publisher.Host            = context.Host;
            publisher.ParallelExecute = context.ParallelExecute;
            publisher.BatchInterval   = context.BatchInterval;

            publisher.SubscriberInfoList.Add(this.SubscriberInfo);//监听器可能存在端口复用的情况,因此需要及时释放SubscriberInfoList 的元素
            publisher.StartWork(context.Request.RequestModel == RequestModel.ServiceEvent);
        }
Пример #7
0
        protected override void Process()
        {
            string message  = this.Message;
            string identity = this.SubscriberInfo.Identity;

            string   processMesssage = string.Empty;
            DateTime beginTime       = DateTime.Now;

            processMesssage = string.Format("[{0}]正在处理服务请求--From: {1}:{2},Identity:{3}\r\n>>[PMID:{4}]{5}",
                                            beginTime.ToString("yyyy-MM-dd HH:mm:ss.fff"),
                                            this.SubscriberInfo.FromIP, this.SubscriberInfo.FromPort, identity,
                                            this.SubscriberInfo.MessageID,
                                            this.Message.Length > 256 ? this.Message.Substring(0, 256) : this.Message);
            Console.WriteLine(processMesssage);

            int msgId = this.SubscriberInfo.MessageID;//执行完服务方法后,MessageID 可能被另外一个线程改变
            //执行服务方法的时候,由服务方法指名是否需要维持会话状态
            ServiceContext context = new ServiceContext(message);

            //如果当前请求是 发布-订阅模式,多个订阅端使用一个发布对象实例
            if (context.Request.RequestModel == RequestModel.Publish || context.Request.RequestModel == RequestModel.ServiceEvent)
            {
                if (PublisherFactory.Instance.Contains(context))  //已经订阅过
                {
                    ServicePublisher publisher = PublisherFactory.Instance.GetPublisher(context);
                    if (publisher.TaskIsRunning)
                    {
                        publisher.SubscriberInfoList.Add(this.SubscriberInfo);
                        processMesssage = string.Format("\r\n[{0}]当前监听器已经加入消息发布线程, {1}:{2},Identity:{3}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), this.SubscriberInfo.FromIP, this.SubscriberInfo.FromPort, this.SubscriberInfo.Identity);
                        Console.WriteLine(processMesssage);
                        return;
                    }
                }
            }

            context.Host = Program.Host;
            context.ServiceErrorEvent     += new EventHandler <ServiceErrorEventArgs>(context_ServiceErrorEvent);
            context.Request.ClientIP       = this.SubscriberInfo.FromIP;
            context.Request.ClientPort     = this.SubscriberInfo.FromPort;
            context.Request.ClientIdentity = this.SubscriberInfo.Identity;

            context.User = MessageProcessBase.GetServiceIdentity(this.SubscriberInfo._innerListener);

            context.GetMessageFun = strPara =>
            {
                MessageListener currLst = MessageCenter.Instance.GetListener(this.SubscriberInfo.FromIP, this.SubscriberInfo.FromPort);
                if (currLst == null)
                {
                    throw new NullReferenceException("监听器不存在!");
                }
                return(currLst.CallBackFunction(msgId, strPara));
            };

            context.PreGetMessageFun = strPara =>
            {
                MessageListener currLst = MessageCenter.Instance.GetListener(this.SubscriberInfo.FromIP, this.SubscriberInfo.FromPort);
                if (currLst == null)
                {
                    throw new NullReferenceException("监听器不存在!");
                }
                return(currLst.PreCallBackFunction(msgId, strPara));
            };

            string result   = string.Empty;
            bool   noResult = false;

            context.InitRequestParameters();
            if (!context.HasError)
            {
                //Console.WriteLine("Process Service begin...");
                context.ProcessService(this.SubscriberInfo.SessionID);
                //Console.WriteLine("Process Service ok...");
                result   = context.Response.AllText;
                noResult = context.NoResultRecord(result);
            }
            else
            {
                result = ServiceConst.CreateServiceErrorMessage(context.ErrorMessage);
                //base.OnServiceError(context, new ServiceErrorEventArgs(context.ErrorMessage));
            }

            DateTime endTime = DateTime.Now;

            processMesssage = string.Format("[{0}]请求处理完毕({1}ms)--To: {2}:{3},Identity:{4}\r\n>>[PMID:{5}]消息长度:{6} -------",
                                            endTime.ToString("yyyy-MM-dd HH:mm:ss.fff"),
                                            endTime.Subtract(beginTime).TotalMilliseconds,
                                            this.SubscriberInfo.FromIP, this.SubscriberInfo.FromPort, identity,
                                            this.SubscriberInfo.MessageID,
                                            noResult ? "[Empty Result]" : result.Length.ToString("###,###") + "字节");
            Console.WriteLine(processMesssage);
            //此处内容可能很大,不能全程输出
            if (context.Response.ResultType == typeof(byte[]))
            {
                Console.WriteLine("[byte Content]");
            }
            else
            {
                Console.WriteLine("result:{0}", result.Length > 100 ? result.Substring(0, 100) + " ..." : result);
            }

            MessageListener currLstn = MessageCenter.Instance.GetListener(this.SubscriberInfo.FromIP, this.SubscriberInfo.FromPort);

            if (currLstn == null)
            {
                processMesssage = "Error:监听器未找到,已取消发送消息。请求源:" + this.SubscriberInfo.Message;
                Console.WriteLine(processMesssage);
                return;
            }
            if (context.Request.RequestModel == RequestModel.GetService)
            {
                //对于请求-响应模式,处理完服务以后,始终会回调客户端的方法(如果提供的话)
                if (MessageCenter.Instance.ResponseMessage(currLstn, msgId, result))
                {
                    Console.WriteLine("Reponse Message OK.");
                }
            }
            else
            {
                //订阅模式,仅在服务处理有结果的情况下,才给客户端发布数据。

                if (!noResult)
                {
                    if (MessageCenter.Instance.NotifyOneMessage(currLstn, msgId, result))
                    {
                        Console.WriteLine("Publish Message OK.");
                    }
                    else
                    {
                        Console.WriteLine("Publish no result.");
                    }
                }
                if (!context.HasError)
                {
                    StartPublishWorker(context);//把Host传递进去
                    processMesssage = string.Format("\r\n[{0}]当前监听器已经加入工作线程, {1}:{2},Identity:{3}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), this.SubscriberInfo.FromIP, this.SubscriberInfo.FromPort, this.SubscriberInfo.Identity);
                    Console.WriteLine(processMesssage);
                }
            }
        }