Search the FirstSpirit Knowledge Base
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
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
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
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