public virtual void TryProcessNext()
        {
            long currentTime = SystemUtil.GetRelativeTimeMillis();

            if (currentTime - lastProcessedTime.Get() > waitTime.GetTime())
            {
                lastProcessedTime.Set(SystemUtil.GetRelativeTimeMillis());
                V data;
                lock (cache) {
                    data = cache.RetrieveNext();
                }
                if (data != null)
                {
                    bool successful;
                    lock (processLock) {
                        successful = TryProcess(data);
                    }
                    if (successful)
                    {
                        OnSuccess(data);
                    }
                    else
                    {
                        lock (cache) {
                            cache.Put(data);
                        }
                        OnFailure(data);
                    }
                }
            }
        }
        public virtual void IncreaseWaitTime()
        {
            WaitTime local = waitTime;

            waitTime = new WaitTime(local.GetInitial(), local.GetMaximum(), Math.Min(local.GetTime() * 2, local.GetMaximum
                                                                                         ()));
        }