- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Anzahl der Fehler eines Generierungstasks auslesen
Hallo zusammen,
ich mรถchte gerne in einem Auftragsscript die Anzahl der Warnungen / Fehler eines vorherigen Generierungstasks herausbekommen, um diese dann unserem Monitoring zukommen zu lassen. Es gibt ja sowohl in ScheduleContext als auch in TaskResult passende Accessors, leider sieht es so aus, als kรคme ich aus dem nachgelagerten Auftragsscript nicht an den passenden Kontext heran, oder habe ich etwas รผbersehen?
Gibt es eine andere Mรถglichkeit an die Werte heranzukommen, auรer dem Parsing der fs-schedule-Files? Wie sieht es mit JMX aus?
Viele Grรผรe,
Martin
- Labels:
-
Developers
- Tags:
- generierug
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Martin,
das ist tatsรคchlich nicht ganz so einfach - ich musste ein wenig basteln ๐
Den ScheduleContext hast Du ja schon im Auftragsscript - einfach als Variable "context". Allerdings gibt z.B. context.getErrorCount() nur die Anzahl der Fehler des jeweils laufenden Tasks im Auftrag aus - also genau die des Script-Tasks selbst. Das ist in Deinem Fall nicht wirklich hilfreich ๐
Um an das TaskResult zu kommen, muss man ein wenig suchen - hier hilft es, in der API beim TaskResult รผber "Use" zu gehen und sich damit dann immer weiter hochzuhangeln.
Letztlich kommt dabei heraus, dass man ein ScheduleEntryControl braucht...
Versuch es mal mit dem Code unten. Zum schnellen Testen als Script irgendwo hinter einen Generierungstask hรคngen - wenn es klappt, sollte das natรผrlich in ein Executable eines Moduls verpackt werden.
Der Code sucht den letzten aktiven Generierungstask vor seinem eigenen Script-Task (d.h. da dรผrften auch noch andere Sachen dazwischen sein) und liest dessen Ergebnisse aus.
Wenn Du vor hast es fรผr ein Monitoring zu nutzen, macht es ggf. Sinn, nicht beim ersten "rรผckwรคrts" gefundenen Generierungs-Task aufzuhรถren, sondern einfach alle abzugrasen - dann kรถnntest Du auch einfach vorwรคrts iterieren.
// find the schedule entry control for THIS running entry
// only works if this schedule entry is NOT allowed to run with multiple instances in parallel,
// which should be the case for generation schedules
ScheduleEntryControl thisScheduleEntryControl = null;
List<ScheduleEntryControl> scheduleEntryControls = context.getTask().getScheduleEntry().getRunningEntries();
for (ScheduleEntryControl scheduleEntryControl : scheduleEntryControls) {
if (scheduleEntryControl.isRunning()) {
thisScheduleEntryControl = scheduleEntryControl;
break;
}
}
// search for the task index of the last ACTIVE generation before this script task
//
// if you are sure the generation task is directly before the script task,
// you can also directly use
// taskIndex = context.getTaskIndex() -1;
for (int taskIndex = context.getTaskIndex() - 1; taskIndex >= 0; taskIndex--) {
ScheduleTask scheduleTask = context.getTasks().get(taskIndex);
if ((scheduleTask instanceof GenerateTask) && scheduleTask.isActive()) {
// found last generation task BEFORE this script
ScheduleEntryState state = thisScheduleEntryControl.getState();
List<TaskResult> taskResults = state.getTaskResults();
TaskResult result = taskResults.get(taskIndex);
// Do something with these values, in this case just log...
String message = String.format("State of generation task %s: %s. It had %d warnings and %d errors.",
// task name
scheduleTask.getName(),
// One of: NOT_STARTED, RUNNING, ABORTED, ERROR, SUCCESS, FINISHED_WITH_ERRORS
// where NOT_STARTED or RUNNING should not be possible in this case
result.getState().name(),
//warnings
result.getWarningCount(),
//errors
result.getErrorCount()
);
context.logInfo(message);
//stop after first found here
break;
}
}
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Martin,
das ist tatsรคchlich nicht ganz so einfach - ich musste ein wenig basteln ๐
Den ScheduleContext hast Du ja schon im Auftragsscript - einfach als Variable "context". Allerdings gibt z.B. context.getErrorCount() nur die Anzahl der Fehler des jeweils laufenden Tasks im Auftrag aus - also genau die des Script-Tasks selbst. Das ist in Deinem Fall nicht wirklich hilfreich ๐
Um an das TaskResult zu kommen, muss man ein wenig suchen - hier hilft es, in der API beim TaskResult รผber "Use" zu gehen und sich damit dann immer weiter hochzuhangeln.
Letztlich kommt dabei heraus, dass man ein ScheduleEntryControl braucht...
Versuch es mal mit dem Code unten. Zum schnellen Testen als Script irgendwo hinter einen Generierungstask hรคngen - wenn es klappt, sollte das natรผrlich in ein Executable eines Moduls verpackt werden.
Der Code sucht den letzten aktiven Generierungstask vor seinem eigenen Script-Task (d.h. da dรผrften auch noch andere Sachen dazwischen sein) und liest dessen Ergebnisse aus.
Wenn Du vor hast es fรผr ein Monitoring zu nutzen, macht es ggf. Sinn, nicht beim ersten "rรผckwรคrts" gefundenen Generierungs-Task aufzuhรถren, sondern einfach alle abzugrasen - dann kรถnntest Du auch einfach vorwรคrts iterieren.
// find the schedule entry control for THIS running entry
// only works if this schedule entry is NOT allowed to run with multiple instances in parallel,
// which should be the case for generation schedules
ScheduleEntryControl thisScheduleEntryControl = null;
List<ScheduleEntryControl> scheduleEntryControls = context.getTask().getScheduleEntry().getRunningEntries();
for (ScheduleEntryControl scheduleEntryControl : scheduleEntryControls) {
if (scheduleEntryControl.isRunning()) {
thisScheduleEntryControl = scheduleEntryControl;
break;
}
}
// search for the task index of the last ACTIVE generation before this script task
//
// if you are sure the generation task is directly before the script task,
// you can also directly use
// taskIndex = context.getTaskIndex() -1;
for (int taskIndex = context.getTaskIndex() - 1; taskIndex >= 0; taskIndex--) {
ScheduleTask scheduleTask = context.getTasks().get(taskIndex);
if ((scheduleTask instanceof GenerateTask) && scheduleTask.isActive()) {
// found last generation task BEFORE this script
ScheduleEntryState state = thisScheduleEntryControl.getState();
List<TaskResult> taskResults = state.getTaskResults();
TaskResult result = taskResults.get(taskIndex);
// Do something with these values, in this case just log...
String message = String.format("State of generation task %s: %s. It had %d warnings and %d errors.",
// task name
scheduleTask.getName(),
// One of: NOT_STARTED, RUNNING, ABORTED, ERROR, SUCCESS, FINISHED_WITH_ERRORS
// where NOT_STARTED or RUNNING should not be possible in this case
result.getState().name(),
//warnings
result.getWarningCount(),
//errors
result.getErrorCount()
);
context.logInfo(message);
//stop after first found here
break;
}
}
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Genau, den (falschen) ScheduleContext hatte ich auch gefunden, aber dass ich รผber den ScheduleEntryControl an die der anderen Tasks komme hatte ich nicht gesehen.
Danke fรผr das Snippet - es hat auf Anhieb funktioniert.
Viele Grรผรe,
Martin

