private static JobEndNotifier.JobEndStatusInfo CreateNotification(JobConf conf, JobStatus status) { JobEndNotifier.JobEndStatusInfo notification = null; string uri = conf.GetJobEndNotificationURI(); if (uri != null) { int retryAttempts = conf.GetInt(JobContext.MrJobEndRetryAttempts, 0); long retryInterval = conf.GetInt(JobContext.MrJobEndRetryInterval, 30000); int timeout = conf.GetInt(JobContext.MrJobEndNotificationTimeout, JobContext.DefaultMrJobEndNotificationTimeout ); if (uri.Contains("$jobId")) { uri = uri.Replace("$jobId", ((JobID)status.GetJobID()).ToString()); } if (uri.Contains("$jobStatus")) { string statusStr = (status.GetRunState() == JobStatus.Succeeded) ? "SUCCEEDED" : (status.GetRunState() == JobStatus.Failed) ? "FAILED" : "KILLED"; uri = uri.Replace("$jobStatus", statusStr); } notification = new JobEndNotifier.JobEndStatusInfo(uri, retryAttempts, retryInterval , timeout); } return(notification); }
// for use by the LocalJobRunner, without using a thread&queue, // simple synchronous way public static void LocalRunnerNotification(JobConf conf, JobStatus status) { JobEndNotifier.JobEndStatusInfo notification = CreateNotification(conf, status); if (notification != null) { do { try { int code = HttpNotification(notification.GetUri(), notification.GetTimeout()); if (code != 200) { throw new IOException("Invalid response status code: " + code); } else { break; } } catch (IOException ioex) { Log.Error("Notification error [" + notification.GetUri() + "]", ioex); } catch (Exception ex) { Log.Error("Notification error [" + notification.GetUri() + "]", ex); } try { Sharpen.Thread.Sleep(notification.GetRetryInterval()); } catch (Exception iex) { Log.Error("Notification retry error [" + notification + "]", iex); } }while (notification.ConfigureForRetry()); } }