Exemple #1
0
        public MemcacheNode(EndPoint endPoint, MemcacheClientConfiguration configuration, IOngoingDispose clientDispose)
        {
            if (configuration == null)
            {
                throw new ArgumentException("Client config should not be null");
            }

            _configuration = configuration;
            _endPoint      = endPoint;
            _clientDispose = clientDispose;
            _tokenSource   = new CancellationTokenSource();
            _transportPool = new BlockingCollection <IMemcacheTransport>(new ConcurrentStack <IMemcacheTransport>());

            for (int i = 0; i < configuration.PoolSize; ++i)
            {
                var transport = (configuration.TransportFactory ?? MemcacheTransport.DefaultAllocator)
                                    (endPoint,
                                    configuration,
                                    RegisterEvents,
                                    TransportAvailable,
                                    false,
                                    clientDispose);
                TransportAvailable(transport);
            }
        }
        /// <summary>
        /// Ctor, intialize things ...
        /// </summary>
        /// <param name="endpoint" />
        /// <param name="clientConfig">The client configuration</param>
        /// <param name="registerEvents">Delegate to call to register the transport</param>
        /// <param name="tranportAvailable">Delegate to call when the transport is alive</param>
        /// <param name="planToConnect">If true, connect in a timer handler started immediately and call transportAvailable.
        ///                             Otherwise, the transport will connect synchronously at the first request</param>
        /// <param name="nodeDispose">Interface to check if the node is being disposed"</param>
        public MemcacheTransport(EndPoint endpoint, MemcacheClientConfiguration clientConfig, Action <IMemcacheTransport> registerEvents, Action <IMemcacheTransport> transportAvailable, bool planToConnect, IOngoingDispose nodeDispose)
        {
            if (clientConfig == null)
            {
                throw new ArgumentException("Client config should not be null");
            }

            IsAlive             = false;
            _endPoint           = endpoint;
            _clientConfig       = clientConfig;
            _registerEvents     = registerEvents;
            _transportAvailable = transportAvailable;
            _nodeDispose        = nodeDispose;

            _connectTimer = new Timer(TryConnect);
            _initialized  = false;

            _registerEvents(this);

            _pendingRequests = new ConcurrentQueue <IMemcacheRequest>();

            _sendAsynchEvtArgs            = new SocketAsyncEventArgs();
            _sendAsynchEvtArgs.Completed += OnSendRequestComplete;

            _receiveHeaderAsynchEvtArgs = new SocketAsyncEventArgs();
            _receiveHeaderAsynchEvtArgs.SetBuffer(new byte[MemcacheResponseHeader.SIZE], 0, MemcacheResponseHeader.SIZE);
            _receiveHeaderAsynchEvtArgs.Completed += new EventHandler <SocketAsyncEventArgs>(OnReceiveHeaderComplete);

            _receiveBodyAsynchEvtArgs            = new SocketAsyncEventArgs();
            _receiveBodyAsynchEvtArgs.Completed += OnReceiveBodyComplete;

            if (planToConnect)
            {
                _connectTimer.Change(0, Timeout.Infinite);
            }
        }
        public MemcacheTransportForTest(EndPoint endpoint, MemcacheClientConfiguration clientConfig, Action <IMemcacheTransport> registerEvents, Action <IMemcacheTransport> transportAvailable, bool planToConnect, IOngoingDispose nodeDispose, Action onCreate, Action onDispose)
            : base(endpoint, clientConfig, registerEvents, transportAvailable, planToConnect, nodeDispose)
        {
            if (onCreate != null)
            {
                onCreate();
            }

            OnDispose = onDispose;
        }