示例#1
0
        /// <summary>
        /// 移除索引的连接
        /// </summary>
        /// <param name="pluginname">插件名称</param>
        /// <param name="Index"></param>
        /// <returns></returns>
        public bool RemovePoolAt(string pluginname, int?Index)
        {
            bool flag = false;

            lock (lockhelper)
            {
                int len = poollist.Count;
                for (int i = 0; i < poollist.Count; i++)
                {
                    ClientLink obj = poollist[i];
                    if (Index == obj.Index && pluginname == obj.PluginName)
                    {
                        obj.Dispose();
                        poollist.Remove(obj);
                        if (countNumsDic.ContainsKey(obj.PluginName))
                        {
                            countNumsDic[obj.PluginName] = countNumsDic[obj.PluginName] == 0 ? 0 : countNumsDic[obj.PluginName] - 1;
                        }
                        if (usedNumsDic.ContainsKey(obj.PluginName))
                        {
                            usedNumsDic[obj.PluginName] = usedNumsDic[obj.PluginName] == 0 ? 0 : usedNumsDic[obj.PluginName] - 1;
                        }

                        flag = true;
                        i--;
                        break;
                    }
                }
            }

            return(flag);
        }
示例#2
0
        /// <summary>
        /// 处理连接池
        /// </summary>
        private void ReapPool()
        {
            lock (lockhelper)
            {
                //string content = "";
                for (int i = 0; i < poollist.Count; i++)
                {
                    ClientLink obj = poollist[i];
                    if ((!obj.IsUsed && DateTime.Now - obj.LastUsedTime > this.wcfFailureTime) || (obj.State != CommunicationState.Opened))
                    {
                        obj.Dispose();
                        poollist.Remove(obj);
                        if (countNumsDic.ContainsKey(obj.PluginName))
                        {
                            countNumsDic[obj.PluginName] = countNumsDic[obj.PluginName] == 0 ? 0 : countNumsDic[obj.PluginName] - 1;
                        }
                        if (usedNumsDic.ContainsKey(obj.PluginName))
                        {
                            usedNumsDic[obj.PluginName] = usedNumsDic[obj.PluginName] == 0 ? 0 : usedNumsDic[obj.PluginName] - 1;
                        }

                        i--;
                    }
                }
                //write("F:\\2.txt", content);
            }
        }
示例#3
0
        public static ClientLink CreateConnection(string wcfendpoint, string pluginname)
        {
            try
            {
                ClientLink link;
                lock (ClientLinkDic)
                {
                    if (ClientLinkDic.ContainsKey(pluginname))
                    {
                        return(ClientLinkDic[pluginname]);
                    }

                    link = new ClientLink(null, pluginname, wcfendpoint);
                    ClientLinkDic.Add(pluginname, link);
                }
                link.CreateConnection(null, ((ism, met) =>
                {
                    IsMessage = ism;
                    MessageTime = met;
                }));
                link.clientObj.Token = Token;//赋值令牌
                return(link);
            }
            catch (Exception err)
            {
                throw new Exception(err.Message);
            }
        }
示例#4
0
        /// <summary>
        /// 踢掉一个非当前契约的空闲连接
        /// </summary>
        /// <returns></returns>
        public bool RemovePoolOneNotAt(string pluginname, out ClientLink clientlink, out int?Index)
        {
            bool flag = false;

            Index      = null;
            clientlink = null;
            lock (lockhelper)
            {
                int len = poollist.Count;
                //如果池子满了,先踢出一个非当前创建契约的连接
                if (poollist.Count >= this.wcfMaxPoolSize)
                {
                    for (int i = 0; i < poollist.Count; i++)
                    {
                        ClientLink obj = poollist[i];
                        if (!obj.IsUsed && obj.PluginName != pluginname)
                        {
                            obj.Dispose();

                            poollist.Remove(obj);
                            if (countNumsDic.ContainsKey(obj.PluginName))
                            {
                                countNumsDic[obj.PluginName] = countNumsDic[obj.PluginName] == 0 ? 0 : countNumsDic[obj.PluginName] - 1;
                            }
                            if (usedNumsDic.ContainsKey(obj.PluginName))
                            {
                                usedNumsDic[obj.PluginName] = usedNumsDic[obj.PluginName] == 0 ? 0 : usedNumsDic[obj.PluginName] - 1;
                            }

                            flag = true;
                            i--;
                            break;
                        }
                    }
                }
                //增加一个连接到池子
                if (poollist.Count < this.wcfMaxPoolSize)
                {
                    clientlink = new ClientLink(pluginname);
                    clientlink.CreateConnection();
                    index                   = index >= Int32.MaxValue ? 1 : index + 1;
                    Index                   = index;
                    clientlink.Index        = index;
                    clientlink.UsedNums     = 1;
                    clientlink.CreatedTime  = DateTime.Now;
                    clientlink.LastUsedTime = DateTime.Now;
                    clientlink.IsUsed       = true;
                    //obj.Scope = new OperationContextScope(((IClientChannel)channel));
                    poollist.Add(clientlink);
                    countNumsDic[clientlink.PluginName] = countNumsDic.ContainsKey(clientlink.PluginName) ? countNumsDic[clientlink.PluginName] + 1 : 1;
                    usedNumsDic[clientlink.PluginName]  = usedNumsDic.ContainsKey(clientlink.PluginName) ? usedNumsDic[clientlink.PluginName] + 1 : 1;
                    flag = true;
                }
            }

            return(flag);
        }
示例#5
0
        /// <summary>
        /// 从连接池中获取一个连接
        /// </summary>
        /// <returns></returns>
        public ClientLink GetClientLink(string pluginname)
        {
            //先做一次清理
            //ReapPool();

            ClientLink clientlink = null;

            if (GetFreePoolNums(pluginname) > 0)
            {
                lock (lockhelper)
                {
                    if (GetFreePoolNums(pluginname) > 0)
                    {
                        for (int i = 0; i < poollist.Count; i++)
                        {
                            ClientLink obj = poollist[i];
                            if (!obj.IsUsed && DateTime.Now - obj.LastUsedTime < this.wcfFailureTime && pluginname == obj.PluginName)
                            {
                                if (obj.State == CommunicationState.Opened)
                                {
                                    obj.IsUsed = true;
                                    obj.UsedNums++;
                                    obj.LastUsedTime            = DateTime.Now;
                                    usedNumsDic[obj.PluginName] = usedNumsDic.ContainsKey(obj.PluginName) ? usedNumsDic[obj.PluginName] + 1 : 1;

                                    clientlink = obj;
                                    break;
                                }
                                else//如果当前连接无效,则清理出连接池
                                {
                                    obj.Dispose();
                                    poollist.Remove(obj);
                                    if (countNumsDic.ContainsKey(obj.PluginName))
                                    {
                                        countNumsDic[obj.PluginName] = countNumsDic[obj.PluginName] == 0 ? 0 : countNumsDic[obj.PluginName] - 1;
                                    }
                                    if (usedNumsDic.ContainsKey(obj.PluginName))
                                    {
                                        usedNumsDic[obj.PluginName] = usedNumsDic[obj.PluginName] == 0 ? 0 : usedNumsDic[obj.PluginName] - 1;
                                    }
                                    i--;
                                }
                            }
                        }
                    }
                }
            }

            return(clientlink);
        }
示例#6
0
        /// <summary>
        /// 加入连接池
        /// </summary>
        /// <param name="clientlink">连接</param>
        /// <param name="Index">返回的连接池索引</param>
        /// <returns></returns>
        public bool AddPool(string pluginname, string endpoint, out ClientLink clientlink, out int?Index)
        {
            //做一次清理
            //if (isReap)
            //    ReapPool();

            bool flag = false;

            Index      = null;
            clientlink = null;

            if (poollist.Count < this.wcfMaxPoolSize)
            {
                lock (lockhelper)
                {
                    OpeningNumDic[pluginname] = OpeningNumDic.ContainsKey(pluginname) ? OpeningNumDic[pluginname] + 1 : 0;

                    if (poollist.Count < this.wcfMaxPoolSize)
                    {
                        if (string.IsNullOrEmpty(endpoint))
                        {
                            clientlink = new ClientLink(pluginname);
                        }
                        else
                        {
                            clientlink = new ClientLink(null, pluginname, endpoint, null, null);
                        }

                        index                   = index >= Int32.MaxValue ? 1 : index + 1;
                        Index                   = index;
                        clientlink.Index        = index;
                        clientlink.UsedNums     = 1;
                        clientlink.CreatedTime  = DateTime.Now;
                        clientlink.LastUsedTime = DateTime.Now;
                        clientlink.IsUsed       = true;
                        //obj.Scope = new OperationContextScope(((IClientChannel)channel));
                        poollist.Add(clientlink);
                        countNumsDic[clientlink.PluginName] = countNumsDic.ContainsKey(clientlink.PluginName) ? countNumsDic[clientlink.PluginName] + 1 : 1;
                        usedNumsDic[clientlink.PluginName]  = usedNumsDic.ContainsKey(clientlink.PluginName) ? usedNumsDic[clientlink.PluginName] + 1 : 1;
                        flag = true;
                        clientlink.CreateConnection();
                    }

                    OpeningNumDic[pluginname] = OpeningNumDic.ContainsKey(pluginname) ? OpeningNumDic[pluginname] - 1 : 0;
                }
            }
            return(flag);
        }
示例#7
0
        /// <summary>
        /// 创建wcf服务连接
        /// </summary>
        public static ClientLink CreateConnection(string pluginname)
        {
            try
            {
                if (ClientLinkDic.ContainsKey(pluginname))
                {
                    return(ClientLinkDic[pluginname]);
                }

                ClientLink link = new ClientLink(null, pluginname, ((ism, met) =>
                {
                    IsMessage = ism;
                    MessageTime = met;
                }));
                link.CreateConnection();
                link.mConn.Token = Token;//赋值令牌
                ClientLinkDic.Add(pluginname, link);
                return(link);
            }
            catch (Exception err)
            {
                throw new Exception(err.Message);
            }
        }
示例#8
0
        /// <summary>
        /// 创建wcf服务连接,此方式一个服务只有一个连接
        /// </summary>
        public static ClientLink CreateConnection(string pluginname)
        {
            try
            {
                ClientLink link;
                lock (ClientLinkDic)
                {
                    if (ClientLinkDic.ContainsKey(pluginname))
                    {
                        return(ClientLinkDic[pluginname]);
                    }

                    link = new ClientLink(null, pluginname, null);
                    ClientLinkDic.Add(pluginname, link);
                }
                link.CreateConnection();
                //link.clientObj.Token = Token;//赋值令牌
                return(link);
            }
            catch (Exception err)
            {
                throw new Exception(err.Message);
            }
        }