public WebQItem Enqueue(string environment) { if (string.IsNullOrWhiteSpace(environment)) { _eventLog.WriteEntry("Environment argument is null or empty.", EventLogEntryType.Error); return(null); } List <WebQItem> env; if (_environments.ContainsKey(environment.ToLower())) { env = _environments[environment.ToLower()]; } else { env = new List <WebQItem>(); _environments.Add(environment.ToLower(), env); } var item = new WebQItem { Id = Guid.NewGuid().ToString(), Environment = environment, CreatedTime = DateTime.Now }; env.Add(item); item.Position = env.IndexOf(item); Save(); return(item); }
public WebQItem Peek(WebQItem item) { try { var request = WebRequest.Create(new Uri(_webQAddress, item.Environment + "/" + item.Id)); request.Method = "GET"; request.ContentLength = 0; using (var response = request.GetResponse()) { var serializer = new DataContractJsonSerializer(typeof(WebQItem)); using (var stream = response.GetResponseStream()) { if (stream != null) { return(serializer.ReadObject(stream) as WebQItem); } return(item); } } } catch (WebException webEx) { if (webEx.Status == WebExceptionStatus.ProtocolError && webEx.Response != null) { var exResponse = (HttpWebResponse)webEx.Response; if (exResponse.StatusCode == HttpStatusCode.NotFound) { throw new WebQItemNoLongerInQueueException(); } } throw; } }
public static HttpStatusCode Created(HttpListenerContext context, WebQItem item) { var serializer = new DataContractJsonSerializer(item.GetType()); serializer.WriteObject(context.Response.OutputStream, item); return(HttpStatusCode.Created); }
public void WaitInQueue(TimeSpan timeout) { const string positionMessage = "Waiting in deployment queue. There are {0} deployment(s) ahead of you."; var timeForTimeout = DateTime.Now + timeout; _item = _client.Enqueue(_environment); OnWebQueuePositionUpdate(this, new WebQueueEventArgs(string.Format(positionMessage, _item.Position), _item)); if (_item.Position == 0) { _client.SetAsStarted(_item); return; } var currentPosition = _item.Position; do { Thread.Sleep(_refreshInterval); _item = _client.Peek(_item); if (currentPosition != _item.Position) { currentPosition = _item.Position; if (currentPosition == 0) { break; } OnWebQueuePositionUpdate(this, new WebQueueEventArgs(string.Format(positionMessage, currentPosition), _item)); } if (DateTime.Now > timeForTimeout) { try { _client.Dequeue(_item); } catch { throw new TimeoutException("ConDep timed out waiting in queue and failed to remove itself from the queue."); } throw new TimeoutException("ConDep timed out waiting in queue."); } OnWebQueueTimeoutUpdate(this, new WebQueueEventArgs( string.Format("Will wait in queue for {0} minutes before timing out.", (timeForTimeout - DateTime.Now).ToString(@"hh\:mm\:ss", CultureInfo.CurrentCulture)), _item)); } while (true); _item = _client.SetAsStarted(_item); }
public void Dequeue(WebQItem item) { if (!_waitingInQueue.HasValue) { return; } if (!_waitingInQueue.Value) { return; } var request = WebRequest.Create(new Uri(_webQAddress, item.Environment + "/" + item.Id)); request.Method = "DELETE"; request.ContentLength = 0; using (request.GetResponse()) _waitingInQueue = false; }
public WebQItem SetAsStarted(WebQItem item) { var request = WebRequest.Create(new Uri(_webQAddress, item.Environment + "/" + item.Id)); request.Method = "POST"; request.ContentLength = 0; using (var response = request.GetResponse()) { var serializer = new DataContractJsonSerializer(typeof(WebQItem)); using (var stream = response.GetResponseStream()) { if (stream != null) { return(serializer.ReadObject(stream) as WebQItem); } return(item); } } }
public WebQueueEventArgs(string message, WebQItem item) { Message = message; Item = item; }
public WebQItem SetAsStarted(WebQItem item) { item.StartTime = DateTime.Now; return item; }
public WebQItem Peek(WebQItem item) { item.Position--; return item; }
public void Dequeue(WebQItem item) { }