diff --git a/azkaban-execserver/src/main/java/azkaban/execapp/JobRunner.java b/azkaban-execserver/src/main/java/azkaban/execapp/JobRunner.java
index 3d9a0b1..63e139c 100644
--- a/azkaban-execserver/src/main/java/azkaban/execapp/JobRunner.java
+++ b/azkaban-execserver/src/main/java/azkaban/execapp/JobRunner.java
@@ -174,7 +174,7 @@ public class JobRunner extends EventHandler implements Runnable {
/**
* Returns a list of jobs that this JobRunner will wait upon to finish before
* starting. It is only relevant if pipeline is turned on.
- *
+ *
* @return
*/
public Set<String> getPipelineWatchedJobs() {
@@ -253,7 +253,7 @@ public class JobRunner extends EventHandler implements Runnable {
/**
* Used to handle non-ready and special status's (i.e. KILLED). Returns true
* if they handled anything.
- *
+ *
* @return
*/
private boolean handleNonReadyStatus() {
@@ -401,7 +401,6 @@ public class JobRunner extends EventHandler implements Runnable {
/**
* The main run thread.
- *
*/
@Override
public void run() {
@@ -528,7 +527,7 @@ public class JobRunner extends EventHandler implements Runnable {
private void insertLinks() {
Props azkProps = AzkabanExecutorServer.getApp().getAzkabanProps();
String baseURL = azkProps.get("azkaban.webserver.url");
- if (baseURL == null){
+ if (baseURL == null) {
return;
}
@@ -540,7 +539,8 @@ public class JobRunner extends EventHandler implements Runnable {
props.put(CommonJobProperties.JOBEXEC_LINK, String.format(
"%s/executor?execid=%d&job=%s", baseURL, executionId, jobId));
props.put(CommonJobProperties.ATTEMPT_LINK, String.format(
- "%s/executor?execid=%d&job=%s&attempt=%d", baseURL, executionId, jobId, node.getAttempt()));
+ "%s/executor?execid=%d&job=%s&attempt=%d", baseURL, executionId, jobId,
+ node.getAttempt()));
props.put(CommonJobProperties.WORKFLOW_LINK, String.format(
"%s/manager?project=%s&flow=%s", baseURL, projectName, flowName));
props.put(CommonJobProperties.JOB_LINK, String.format(
@@ -551,17 +551,16 @@ public class JobRunner extends EventHandler implements Runnable {
private void runJob() {
try {
job.run();
- } catch (Exception e) {
- e.printStackTrace();
+ } catch (Throwable e) {
if (props.getBoolean("job.succeed.on.failure", false)) {
changeStatus(Status.FAILED_SUCCEEDED);
logError("Job run failed, but will treat it like success.");
- logError(e.getMessage() + e.getCause());
+ logError(e.getMessage() + " cause: " + e.getCause(), e);
} else {
changeStatus(Status.FAILED);
- logError("Job run failed!");
- logError(e.getMessage() + e.getCause());
+ logError("Job run failed!", e);
+ logError(e.getMessage() + " cause: " + e.getCause());
}
}
@@ -643,6 +642,12 @@ public class JobRunner extends EventHandler implements Runnable {
}
}
+ private void logError(String message, Throwable t) {
+ if (logger != null) {
+ logger.error(message, t);
+ }
+ }
+
private void logInfo(String message) {
if (logger != null) {
logger.info(message);
@@ -700,4 +705,4 @@ public class JobRunner extends EventHandler implements Runnable {
return attempt > 0 ? "_job." + executionId + "." + attempt + "." + jobId
+ ".attach" : "_job." + executionId + "." + jobId + ".attach";
}
-}
+}
\ No newline at end of file
diff --git a/azkaban-webserver/src/main/java/azkaban/webapp/servlet/HistoryServlet.java b/azkaban-webserver/src/main/java/azkaban/webapp/servlet/HistoryServlet.java
index 3a91f6e..a61ff06 100644
--- a/azkaban-webserver/src/main/java/azkaban/webapp/servlet/HistoryServlet.java
+++ b/azkaban-webserver/src/main/java/azkaban/webapp/servlet/HistoryServlet.java
@@ -17,7 +17,6 @@
package azkaban.webapp.servlet;
import java.io.IOException;
-
import java.util.HashMap;
import java.util.List;
@@ -38,6 +37,7 @@ import azkaban.webapp.AzkabanWebServer;
public class HistoryServlet extends LoginAbstractAzkabanServlet {
+ private static final String FILTER_BY_DATE_PATTERN = "MM/dd/yyyy hh:mm aa";
private static final long serialVersionUID = 1L;
private ExecutorManagerAdapter executorManager;
private ProjectManager projectManager;
@@ -106,12 +106,14 @@ public class HistoryServlet extends LoginAbstractAzkabanServlet {
String userContain = getParam(req, "usercontain");
int status = getIntParam(req, "status");
String begin = getParam(req, "begin");
+
long beginTime =
- begin == "" ? -1 : DateTimeFormat.forPattern("MM/dd/yyyy-HH:mm")
+ begin == "" ? -1 : DateTimeFormat.forPattern(FILTER_BY_DATE_PATTERN)
.parseDateTime(begin).getMillis();
String end = getParam(req, "end");
+
long endTime =
- end == "" ? -1 : DateTimeFormat.forPattern("MM/dd/yyyy-HH:mm")
+ end == "" ? -1 : DateTimeFormat.forPattern(FILTER_BY_DATE_PATTERN)
.parseDateTime(end).getMillis();
try {
history =