/// <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); }
/// <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); } }
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); } }
/// <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); }
/// <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); }
/// <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); }
/// <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); } }
/// <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); } }