ClientChannelSharedSelector.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System;
  2. using System.Collections.Generic;
  3. using Taobao.Top.Link.Channel.WebSocket;
  4. using Top.Api;
  5. namespace Taobao.Top.Link.Channel
  6. {
  7. /// <summary>a channel pool that same uri sharing same channel
  8. /// </summary>
  9. public class ClientChannelSharedSelector : IClientChannelSelector
  10. {
  11. private static readonly int CONNECTTIMEOUT = 5000;
  12. private ITopLogger _logger;
  13. private Object _lockObject;
  14. private IDictionary<string, IClientChannel> _channels;
  15. /// <summary>get or set heartbeat interval time in milliseconds
  16. /// </summary>
  17. public int HeartbeatPeriod { get; set; }
  18. public ClientChannelSharedSelector() : this(Log.Instance) { }
  19. public ClientChannelSharedSelector(ITopLogger logger)
  20. {
  21. this._logger = logger;
  22. this._lockObject = new object();
  23. this._channels = new Dictionary<string, IClientChannel>();
  24. }
  25. public IClientChannel GetChannel(Uri uri)
  26. {
  27. if (!uri.Scheme.Equals("ws", StringComparison.InvariantCultureIgnoreCase))
  28. return null;
  29. var url = uri.ToString();
  30. if (!this.HaveChannel(url))
  31. lock (this._lockObject)
  32. if (!this.HaveChannel(url))
  33. this.AddChannel(url, this.WrapChannel(this.Connect(uri, CONNECTTIMEOUT)));
  34. return _channels[url];
  35. }
  36. public void ReturnChannel(IClientChannel channel) { }
  37. protected virtual IClientChannel Connect(Uri uri, int timeout)
  38. {
  39. return WebSocketClient.Connect(this._logger, uri, timeout);
  40. }
  41. private IClientChannel WrapChannel(IClientChannel channel)
  42. {
  43. if (this.HeartbeatPeriod > 0)
  44. channel.HeartbeatTimer = new ResetableTimer(this.HeartbeatPeriod);
  45. return channel;
  46. }
  47. private bool HaveChannel(string url)
  48. {
  49. return this._channels.ContainsKey(url) && this._channels[url].IsConnected;
  50. }
  51. private void AddChannel(string url, IClientChannel channel)
  52. {
  53. if (this._channels.ContainsKey(url))
  54. this._channels[url] = channel;
  55. else
  56. this._channels.Add(url, channel);
  57. }
  58. }
  59. }