Skip to content
This repository has been archived by the owner on May 23, 2019. It is now read-only.

Commit

Permalink
Update #159 display Job statuses: error stacktrace and verbose mode.
Browse files Browse the repository at this point in the history
  • Loading branch information
hdsdi3g committed Dec 20, 2015
1 parent aa25608 commit f52fa1a
Show file tree
Hide file tree
Showing 5 changed files with 239 additions and 90 deletions.
6 changes: 6 additions & 0 deletions app/hd3gtv/mydmam/manager/debug/DebugWorker.java
Expand Up @@ -19,6 +19,7 @@
import java.io.File;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;

import org.apache.commons.io.FileUtils;

Expand Down Expand Up @@ -103,8 +104,13 @@ protected void workerProcessJob(JobProgression progression, JobContext context)
job.setUrgent();
Thread.sleep(random.nextInt(2000) + 1);
}
job.setExpirationTime(1, TimeUnit.DAYS).setMaxExecutionTime(10, TimeUnit.MINUTES);
progression.update("...create the next job");
job.publish();

if (random.nextBoolean()) {
throw new Exception("Test exception !");
}
}

protected void forceStopProcess() throws Exception {
Expand Down
202 changes: 122 additions & 80 deletions app/react/mydmam/async/broker/joblist.jsx
Expand Up @@ -184,6 +184,14 @@ broker.JobListCartridges = React.createClass({
selected_jobs = selected_jobs.sort(function (a, b) {
return a.create_date - b.create_date;
});
} else if (selected_tab == broker.status.DONE.tab) {
selected_jobs = selected_jobs.sort(function (a, b) {
return a.end_date - b.end_date;
});
} else if (selected_tab == broker.status.PROCESSING.tab) {
selected_jobs = selected_jobs.sort(function (a, b) {
return a.start_date - b.start_date;
});
} else {
selected_jobs = selected_jobs.sort(function (a, b) {
return b.update_date - a.update_date;
Expand Down Expand Up @@ -227,33 +235,6 @@ broker.displayKey = function(key, react_return) {
}
};

broker.getStacktrace = function(processing_error) {
var content = '';
content = content + processing_error["class"] + ': ' + processing_error.message + "\n";
for (var pos = 0; pos < processing_error.stacktrace.length; pos++) {
var trace = processing_error.stacktrace[pos];
content = content + String.fromCharCode(160) + 'at' + String.fromCharCode(160) + trace["class"] + '.' + trace.method;
if (trace.line === -2) {
content = content + '(Native Method)';
} else if (trace.file) {
if (trace.line >= 0) {
content = content + '(' + trace.file + ':' + trace.line + ')';
} else {
content = content + '(' + trace.file + ')';
}
} else {
content = content + '(Unknown Source)';
}
content = content + "\n";
}

if (processing_error.cause) {
content = content + 'Caused by: ';
content = content + broker.getStacktrace(processing_error.cause);
}
return content;
};

broker.JobProgression = React.createClass({
render: function() {
var job = this.props.job;
Expand Down Expand Up @@ -325,6 +306,13 @@ broker.JobProgression = React.createClass({
});

broker.JobCartridgeActionButtons = React.createClass({
onClickButton_hipriority: function(e) { e.stopPropagation(); this.props.onActionButtonClick("hipriority"); },
onClickButton_postponed: function(e) { e.stopPropagation(); this.props.onActionButtonClick("postponed"); },
onClickButton_cancel: function(e) { e.stopPropagation(); this.props.onActionButtonClick("cancel"); },
onClickButton_noexpiration: function(e) { e.stopPropagation(); this.props.onActionButtonClick("noexpiration"); },
onClickButton_delete: function(e) { e.stopPropagation(); this.props.onActionButtonClick("delete"); },
onClickButton_stop: function(e) { e.stopPropagation(); this.props.onActionButtonClick("stop"); },
onClickButton_setinwait: function(e) { e.stopPropagation(); this.props.onActionButtonClick("setinwait"); },
render: function() {
var status = this.props.status;
var stacked = this.props.stacked;
Expand All @@ -334,6 +322,7 @@ broker.JobCartridgeActionButtons = React.createClass({
for (var pos in button_names_for_status) {
var name = button_names_for_status[pos];


var label = null;
var btn_style = null;
if (stacked) {
Expand All @@ -342,21 +331,23 @@ broker.JobCartridgeActionButtons = React.createClass({
}

var btn_class = classNames("btn", "btn-mini", {
"btn-warning": name == "hipriority",
"btn-success": name == "postponed",
"btn-info": name == "cancel" | name == "noexpiration",
"btn-danger": name == "delete" | name == "stop",
"btn-primary": name == "setinwait",
"btn-block": stacked,
});

if (name == "hipriority") { buttons.push(<button key={name} className={btn_class} style={btn_style}> <i className="icon-warning-sign icon-white"></i>{label}</button>); }
if (name == "postponed") { buttons.push(<button key={name} className={btn_class} style={btn_style}> <i className="icon-step-forward icon-white"></i>{label}</button>); }
if (name == "cancel") { buttons.push(<button key={name} className={btn_class} style={btn_style}> <i className="icon-off icon-white"></i>{label}</button>); }
if (name == "noexpiration") { buttons.push(<button key={name} className={btn_class} style={btn_style}> <i className="icon-calendar icon-white"></i>{label}</button>); }
if (name == "delete") { buttons.push(<button key={name} className={btn_class} style={btn_style}> <i className="icon-trash icon-white"></i>{label}</button>); }
if (name == "stop") { buttons.push(<button key={name} className={btn_class} style={btn_style}> <i className="icon-stop icon-white"></i>{label}</button>); }
if (name == "setinwait") { buttons.push(<button key={name} className={btn_class} style={btn_style}> <i className="icon-inbox icon-white"></i>{label}</button>); }
if (name == "hipriority") {
buttons.push(<button key={name} className={btn_class} style={btn_style} onClick={this.onClickButton_hipriority}> <i className="icon-warning-sign"></i>{label}</button>); }
if (name == "postponed") {
buttons.push(<button key={name} className={btn_class} style={btn_style} onClick={this.onClickButton_postponed}> <i className="icon-step-forward"></i>{label}</button>); }
if (name == "cancel") {
buttons.push(<button key={name} className={btn_class} style={btn_style} onClick={this.onClickButton_cancel}> <i className="icon-off"></i>{label}</button>); }
if (name == "noexpiration") {
buttons.push(<button key={name} className={btn_class} style={btn_style} onClick={this.onClickButton_noexpiration}> <i className="icon-calendar"></i>{label}</button>); }
if (name == "delete") {
buttons.push(<button key={name} className={btn_class} style={btn_style} onClick={this.onClickButton_delete}> <i className="icon-trash"></i>{label}</button>); }
if (name == "stop") {
buttons.push(<button key={name} className={btn_class} style={btn_style} onClick={this.onClickButton_stop}> <i className="icon-stop"></i>{label}</button>); }
if (name == "setinwait") {
buttons.push(<button key={name} className={btn_class} style={btn_style} onClick={this.onClickButton_setinwait}> <i className="icon-inbox"></i>{label}</button>); }
}

if (buttons.length == 0) {
Expand All @@ -377,46 +368,106 @@ broker.JobCartridgeActionButtons = React.createClass({
},
});

/*
var btndelete = createBtn('', 'icon-trash', 'manager.jobs.btn.delete', 'delete');
var btnstop = createBtn('', 'icon-stop ', 'manager.jobs.btn.stop', 'stop');
var btnsetinwait = createBtn('', 'icon-inbox', 'manager.jobs.btn.setinwait', 'setinwait');
var btncancel = createBtn('', 'icon-off', 'manager.jobs.btn.cancel', 'cancel');
var btnhipriority = createBtn('', 'icon-warning-sign', 'manager.jobs.btn.hipriority', 'hipriority');
var btnpostponed = createBtn('', 'icon-step-forward', 'manager.jobs.btn.postponed', 'postponed');
var btnnoexpiration = '';
if ((job.expiration_date - job.create_date) < mydmam.manager.jobs.default_max_expiration_time) {
btnnoexpiration = createBtn('', 'icon-calendar', 'manager.jobs.btn.noexpiration', 'noexpiration');
}
*/
broker.JobCartridge = React.createClass({
getInitialState: function() {
return {
stacked: false,
};
},
onToogleCartridgeSize: function(e) {
e.preventDefault();
this.setState({stacked: !this.state.stacked});
},
onActionButtonClick: function(action_name) {
console.log(this.props.job, action_name);
/*hipriority") postponed"); cancel"); noexpiration delete"); stop"); },setinwait"); TODO btns*/
},
render: function() {
var job = this.props.job;
var required_jobs = this.props.required_jobs;

// TODO job.context
// TODO required_jobs

var creator = null;
var dates_start_end = null;
var processing_error = null;
var worker_ref = null;

if (this.state.stacked) {
var max_execution_time = null;
if (job.max_execution_time < (1000 * 3600 * 24)) {
if (job.max_execution_time > (3600 * 1000)) {
max_execution_time = (<span className="label">{i18n('manager.jobs.max_execution_time_hrs', Math.round((job.max_execution_time / (3600 * 1000))))}</span>);
} else {
max_execution_time = (<span className="label">{i18n('manager.jobs.max_execution_time_sec', (job.max_execution_time / 1000))}</span>);
}
}

creator = (<div>
<div style={{marginTop: 5}}>
<mydmam.async.pathindex.reactDate i18nlabel="create_date" date={job.create_date} style={{marginLeft: 0}} />
</div>
<div style={{marginTop: 4}}>
<span className="label label-info"><i className="icon-cog icon-white"></i> Created by {job.instance_status_creator_key}</span>
</div>
<div style={{marginTop: 4}}>
Class creator: <mydmam.async.JavaClassNameLink javaclass={job.creator} version={this.props.version} />
</div>
<div style={{marginTop: 4, marginBottom: 8}}>
{max_execution_time}
</div>
</div>);

var dates_start_end_content = [];
if (job.start_date > 0) {
dates_start_end_content.push(<div style={{marginTop: 5}} key="sdate">
<mydmam.async.pathindex.reactDate i18nlabel="start_date" date={job.start_date} />
</div>);
if (job.end_date > 0) {
dates_start_end_content.push(<div style={{marginTop: 5}} key="edate">
<mydmam.async.pathindex.reactDate i18nlabel="end_date" date={job.end_date} />
</div>);
dates_start_end_content.push(<div style={{marginTop: 5}} key="deltadate">
<span className="label" style={{marginLeft: 5}}>
<i className="icon-time icon-white"></i>&nbsp;{(job.end_date - job.start_date) / 1000 + " sec."}
</span>
</div>);
dates_start_end_content.push(<div style={{marginTop: 5}} key="sinceedate">
<mydmam.async.pathindex.reactSinceDate i18nlabel="end_date" date={job.end_date} />
</div>);
}
}
dates_start_end = (<div>{dates_start_end_content}</div>);

processing_error = (<mydmam.async.JavaStackTrace processing_error={job.processing_error} version={this.props.version} />);

var job_ref = (<div style={{marginTop: 5}}>
Job ref: <span>{broker.displayKey(job.key, true)}</span>
</div>);

if (job.worker_reference != null & job.worker_class != null) {
worker_ref = (<div className="span7">
<div style={{marginTop: 5}}>
Worker ref: <span>{broker.displayKey(job.worker_reference, true)}</span>
</div>
<div style={{marginTop: 5}}>
Class executor: <mydmam.async.JavaClassNameLink javaclass={job.worker_class} version={this.props.version} />
</div>
{job_ref}
</div>);
} else {
worker_ref = (<div className="span7">
{job_ref}
</div>);
}
}

var delete_after_completed = null;
if (job.delete_after_completed) {
delete_after_completed = (<span className="label label-inverse">{i18n("manager.jobs.delete_after_completed")}</span>);
}

var max_execution_time = null;
if (job.max_execution_time < (1000 * 3600 * 24)) {
if (job.max_execution_time > (3600 * 1000)) {
max_execution_time = (<span className="label">{i18n('manager.jobs.max_execution_time_hrs', Math.round((job.max_execution_time / (3600 * 1000))))}</span>);
} else {
max_execution_time = (<span className="label">{i18n('manager.jobs.max_execution_time_sec', (job.max_execution_time / 1000))}</span>);
}
}

var priority = null;
if (job.priority > 0) {
var urgent = null;
Expand All @@ -428,11 +479,6 @@ broker.JobCartridge = React.createClass({
</span>);
}

var processing_error = null;
if (job.processing_error) {
processing_error = (<code className="json">{broker.getStacktrace(job.processing_error)}</code>);
}

var div_3rd_zone = null;
if (job.status === 'WAITING' | job.status === 'TOO_OLD') {
div_3rd_zone = (<mydmam.async.pathindex.reactDate i18nlabel="expiration_date" date={job.expiration_date} />);
Expand All @@ -455,33 +501,29 @@ broker.JobCartridge = React.createClass({
}
}

return (<div className="row-fluid hover-focus">
var main_div_classname = classNames("row-fluid", "hover-focus", {
"stacked": this.state.stacked,
});

return (<div className={main_div_classname} onClick={this.onToogleCartridgeSize}>
<div className="span3 nomargin">
<strong>{job.name}</strong>
{creator}
</div>
<div className="span3 nomargin">
<mydmam.async.pathindex.reactSinceDate i18nlabel="update_date" date={job.update_date} /> {delete_after_completed} {priority}
{dates_start_end}
</div>
<div className="span3 nomargin">
{div_3rd_zone}
{processing_error}
</div>
<div className="span3 nomargin">
{instance_status_executor_key}
<broker.JobCartridgeActionButtons status={job.status} stacked={this.state.stacked} />
{worker_ref}
<broker.JobCartridgeActionButtons status={job.status} stacked={this.state.stacked} onActionButtonClick={this.onActionButtonClick} />
</div>
</div>);

/*
<hr />
<mydmam.async.JavaClassNameLink javaclass={job.creator} version={this.props.version} />
<mydmam.async.JavaClassNameLink javaclass={job.worker_class} version={this.props.version} />
<mydmam.async.pathindex.reactDate i18nlabel="create_date" date={job.create_date} />
<mydmam.async.pathindex.reactDate i18nlabel="start_date" date={job.start_date} />
<mydmam.async.pathindex.reactDate i18nlabel="end_date" date={job.end_date} />
{max_execution_time}
<span>{broker.displayKey(job.worker_reference, true)}</span><br />
<span className="label label-info"><i className="icon-cog icon-white"></i> Created by {job.instance_status_creator_key}</span><br />
{processing_error}
*/
},
});

0 comments on commit f52fa1a

Please sign in to comment.