Example #1
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);
                    }
                }
            }
        }
Example #2
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);
        }
Example #3
0
        /// <summary>
        /// 事件模式
        /// </summary>
        void DoEvent()
        {
            EventServicePublisher self = (EventServicePublisher)this;

            self.Ready();

            while (true)
            {
                //检查超期
                if (!self.CheckActiveLife())
                {
                    self.Close();
                    PublisherFactory.Instance.RemovePublisher(self.TaskName);
                    Console.WriteLine("\r\n[{0}]当前任务已检验到事件源对象为非活动状态,工作线程退出--Task Name: {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), this.GetShortTaskName(255));
                    batchIndex = 0;
                    StopPublish();
                    break;
                }

                string workMessage = "\r\n----publisher DoEvent------------------\r\n";
                //等待服务对象触发事件,等待30秒
                if (resetEvent.WaitOne(30 * 1000))
                {
                    this.Publish(ref workMessage);
                    if (workMessage.Length > 0)
                    {
                        Console.WriteLine(workMessage);
                    }
                    //推送完成,触发业务线程状态,允许业务线程继续
                    self.SetWorkEvent();
                }
                else
                {
                    int count = GetListeners().Length;
                    if (count == 0)
                    {
                        Console.WriteLine("[{0}]当前任务已经没有监听器,但事件源对象仍然活动,可接受再次订阅--Task Name: {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), this.GetShortTaskName(255));
                    }
                    else
                    {
                        Console.WriteLine("[{0}]当前工作线程有{1}个相关的监听器,Task Name:{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), count, this.GetShortTaskName(255));
                    }
                }
            }
            isRunning = false;
            //清理服务对象
            ClearServiceObjectCache();
        }