Пример #1
0
        /// <summary>
        /// Recover abandoned objects which have been checked out but
        /// not used since longer than the removeAbandonedTimeout.
        /// </summary>
        /// <param name="ac"></param>
        private void RemoveAbandoned(AbandonedConfig ac)
        {
            long now     = DateTime.Now.CurrentTimeMillis();
            long timeout = now - ac.getRemoveAbandonedTimeout() * 1000L;
            List <IPooledObject <T> >        remove = new List <IPooledObject <T> >();
            IEnumerator <IPooledObject <T> > it     = _allObjects.Values.GetEnumerator();

            do
            {
                IPooledObject <T> pooledObject = it.Current;
                lock (pooledObject)
                {
                    if (pooledObject.GetState() == PooledObjectState.Allocated &&
                        pooledObject.GetLastUsedTime() <= timeout)
                    {
                        pooledObject.MarkAbandoned();
                        remove.Add(pooledObject);
                    }
                }
            } while (it.MoveNext());

            // Now remove the abandoned objects
            IEnumerator <IPooledObject <T> > itr = remove.GetEnumerator();

            do
            {
                IPooledObject <T> pooledObject = itr.Current;
                try
                {
                    InvalidateObject(pooledObject.GetObject());
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            } while (itr.MoveNext());
        }