static void Main(string[] args) { var serverUrlEnvVar = Environment.GetEnvironmentVariable(ENV_P_PRO_SERVER_URL); String serverUrl; if (serverUrlEnvVar == null) { Console.WriteLine("Server URL not set via the {0} environment variable, using default ({1}).", ENV_P_PRO_SERVER_URL, DEFAULT_SERVER_URL); serverUrl = DEFAULT_SERVER_URL; } else { serverUrl = serverUrlEnvVar; } var random = new Random(); var jobInstanceBlackList = new HashSet<Guid>(); using (IRestProxy restProxy = new RestProxy(serverUrl)) { while (true) { JobInstance[] unassignedJobInstance; try { unassignedJobInstance = restProxy.Query<JobInstance>("AgentId".Eq(Guid.Empty.ToString())).Result.ToArray(); } catch (RestProxyException e) { Console.Error.WriteLine("HTTP error while trying to query for unassigned jobs: " + e.Message); Console.Error.WriteLine("Trying again in a few seconds..."); Thread.Sleep(TimeSpan.FromSeconds(5)); continue; } foreach (var jobInstance in unassignedJobInstance) { if (jobInstanceBlackList.Contains(jobInstance.Id)) continue; JobDescription jobDescription; try { jobDescription = restProxy.Get<JobDescription>(jobInstance.JobDescriptionId).Result; } catch (RestProxyException e) { if (e.StatusCode == HttpStatusCode.NotFound) { restProxy.Create(new JobInstanceLogEntry() { Id = Guid.NewGuid(), JobInstanceId = jobInstance.Id, LocalTimeStamp = DateTime.UtcNow, Text = "" }); Console.Error.WriteLine("Encountered invalid job instance: " + jobInstance.Id); Console.Error.WriteLine("=> JobDescription not found."); jobInstanceBlackList.Add(jobInstance.Id); } else { Console.Error.WriteLine("HTTP error while trying to retrieve job description for job instance: " + e.Message); } continue; } Agent[] agents = null; while (agents == null) { try { agents = restProxy.GetAll<Agent>() .Result .Where(a => AgentMatchesJobRequirements(a, jobDescription)) .ToArray(); } catch (RestProxyException e) { Console.Error.WriteLine("HTTP error while trying to retrieve agent list: " + e.Message); Console.Error.WriteLine("Retrying in a moment..."); Thread.Sleep(TimeSpan.FromSeconds(10)); } } var selectedAgentId = agents[random.Next(0, agents.Length)].Id; jobInstance.AgentId = selectedAgentId; while(true) try { restProxy.Update(jobInstance); break; } catch (RestProxyException e) { if (e.StatusCode == HttpStatusCode.NotFound) { Console.Error.WriteLine("Could not find job instance with id " + jobInstance.Id + " again. May have been deleted."); break; } else { Console.Error.WriteLine("HTTP error while trying to update job instance: " + e.Message); Console.Error.WriteLine("Retrying in a moment..."); Thread.Sleep(TimeSpan.FromSeconds(10)); } } } Thread.Sleep(TimeSpan.FromSeconds(5)); } } }