Erfassen Sie Ihre Fortschritte
Trailhead-Startseite
Trailhead-Startseite

Überwachen von asynchronem Apex

Lernziele

Nachdem Sie diese Lektion abgeschlossen haben, haben Sie Folgendes gelernt:
  • Überwachen verschiedener Arten von Aufträgen
  • Verwendung der flexiblen Warteschlange

Überwachen asynchroner Aufträge

Der Vorteil von asynchronen Aufträgen ist, dass sie unbemerkt im Hintergrund ablaufen. Dies ist aber gleichzeitig auch ein echter Nachteil. Glücklicherweise gibt es Möglichkeiten, die Abläufe im Zusammenhang mit Ihren hinter den Kulissen ausgeführten Aufträgen zu überwachen.

Sie können den Status aller Aufträge in der Salesforce-Benutzeroberfläche überwachen. Geben Sie unter Setup im Feld "Schnellsuche" den Text Aufträge ein und wählen Sie dann Apex-Aufträge aus.

Die Seite "Apex-Aufträge" zeigt alle asynchronen Apex-Aufträge mit Informationen über die Ausführung der einzelnen Aufträgen. Der folgende Screenshot zeigt einen Future-Methodenauftrag und zwei abgeschlossene Batchaufträge für dieselbe Batch-Apex-Klasse.

Apex-Aufträge

Wenn Sie viele Batchaufträge vorliegen haben, verwenden Sie die Seite "Batchaufträge", um nur Batchaufträge anzuzeigen. Sie öffnen die Seite "Apex-Batchaufträge", indem Sie oben auf der Seite "Apex-Aufträge" auf den Link klicken. Wählen Sie mithilfe des Schiebereglers auf der Seite "Apex-Batchaufträge" einen bestimmten Datumsbereich aus und grenzen Sie die Liste angezeigter Batchaufträge ein. Sie können vergangene Aufträge anzeigen, die noch nicht gelöscht wurden. Auf der Seite "Batchaufträge" werden Aufträge nach der Batch-Klasse gruppiert.

Apex-Batchaufträge

Klicken Sie neben einer für Sie interessanten Klassen-ID auf "Weitere Informationen", um Details über die Aufträge herauszufinden, die für diese Klasse ausgeführt wurden. Diese Abbildung zeigt das Popup-Fenster, das nach dem Klicken auf "Weitere Informationen" angezeigt wird. In dieser Batch-Klasse gibt es zwei Aufträge, die erfolgreich ausgeführt wurden.

Informationen über übergeordnete Aufträge

Sie können den Status von Apex-Aufträgen auch in der flexiblen Apex-Warteschlange überwachen und ihre Reihenfolge ändern, um zu steuern, welche Aufträge zuerst verarbeitet werden. Geben Sie unter Setup im Feld "Schnellsuche" den Text Aufträge ein und wählen Sie dann Flexible Apex-Warteschlange aus.

Überwachen von Future-Aufträgen

Future-Aufträge werden auf der Seite "Apex-Aufträge" wie andere Aufträge angezeigt. Sie sind derzeit jedoch noch nicht Teil der flexiblen Warteschlange.

Sie können AsyncApexJob abfragen, um nach Ihrem Future-Auftrag zu suchen, es gibt jedoch eine Einschränkung. Da beim Starten eines Future-Auftrags keine ID zurückgegeben wird, müssen Sie nach einem anderen Feld, z. B. nach MethodName oder JobType filtern, um Ihren Auftrag zu finden. Dieser Stack Exchange-Post enthält einige SOQL-Beispielabfragen, die ganz hilfreich sein können.

Überwachen in die Warteschlange gestellter Aufträge mit SOQL

Um Informationen zu Ihrem gesendeten Auftrag abzurufen, führen Sie eine SOQL-Abfrage über AsyncApexJob durch, indem Sie nach der Auftrags-ID filtern, die die System.enqueueJob-Methode zurückgegeben hat.

AsyncApexJob jobInfo = [SELECT Status, NumberOfErrors
    FROM AsyncApexJob WHERE Id = :jobID];

Überwachen in die Warteschlange gestellter Aufträge mit der flexiblen Warteschlange

Mit der flexiblen Apex-Warteschlange können Sie bis zu 100 Batchaufträge zur Ausführung senden. Alle Aufträge, die zur Ausführung übermittelt werden, befinden sich im Status "Halten" und werden in die flexible Apex-Warteschlange gestellt. Bis zu 100 Batchaufträge können den Status "Halten" aufweisen.

Aufträge werden in der Reihenfolge verarbeitet, in der sie übermittelt wurden. Sie können die aktuelle Warteschlangenreihenfolge anzeigen und die Reihenfolge der Aufträge ändern, um beispielsweise einen wichtigeren Auftrag weiter vorne und weniger wichtige Aufträge weiter hinten zu platzieren.

Wenn Systemressourcen verfügbar werden, ruft das System den nächsten Auftrag oben aus der flexiblen Apex-Warteschlange ab und verschiebt ihn in die Batchauftragswarteschlange. Das System kann für jede Organisation bis zu fünf Aufträge in der Warteschlange oder aktive Aufträge gleichzeitig ausführen. Der Status dieser verschobenen Aufträge wird von "Halten" in "In der Warteschlange" geändert. In die Warteschlange gestellte Aufträge werden ausgeführt, wenn das System zum Bearbeiten neuer Aufträge bereit ist. Genau wie andere Aufträge können Sie auch in der Warteschlange befindliche Aufträge auf der Seite "Apex-Aufträge" überwachen.

Überwachen geplanter Aufträge

Wenn ein Apex-Auftrag geplant wurde, können Sie mehr Informationen zu diesem Auftrag abrufen, indem Sie eine SOQL-Abfrage zu CronTrigger ausführen. Im folgenden Beispiel wird abgefragt, wie oft der Auftrag ausgeführt wurde und, wann die erneute Ausführung des Auftrags geplant ist (Datum und Uhrzeit). Dazu wird eine jobID-Variable verwendet, die von der System.schedule-Methode zurückgegeben wird.

CronTrigger ct = [SELECT TimesTriggered, NextFireTime FROM CronTrigger WHERE Id = :jobID];

Wenn Sie diese Abfrage innerhalb der execute-Methode Ihrer Schedulable-Klasse ausführen, können Sie die ID des aktuellen Auftrags abrufen, indem Sie getTriggerId für die SchedulableContext-Argumentvariable aufrufen.

global class DoAwesomeStuff implements Schedulable {

    global void execute(SchedulableContext sc) {
        // some awesome code
        CronTrigger ct = [SELECT TimesTriggered, NextFireTime FROM CronTrigger WHERE Id = :sc.getTriggerId()];
    }
    
}

Sie können den Namen und den Typ des Auftrags auch aus dem CronJobDetail-Datensatz abrufen, der mit dem CronTrigger-Datensatz verknüpft ist. Dazu verwenden Sie die CronJobDetail-Beziehung beim Ausführen einer CronTrigger-Abfrage. In diesem Beispiel wird der neueste CronTrigger-Datensatz mit dem Namen und Typ des Auftrags aus CronJobDetail abgerufen.

CronTrigger job = [SELECT Id, CronJobDetail.Id, CronJobDetail.Name, CronJobDetail.JobType FROM CronTrigger ORDER BY CreatedDate DESC LIMIT 1];

Alternativ können Sie CronJobDetail direkt abfragen, um den Namen und den Typ des Auftrags abzurufen. Im folgenden Beispiel werden der Name und der Typ für den CronTrigger-Datensatz abgerufen, der im vorherigen Beispiel abgefragt wurde. Die entsprechende CronJobDetail-Datensatz-ID wird über den Ausdruck CronJobDetail.Id im CronTrigger-Datensatz abgerufen.

CronJobDetail ctd = [SELECT Id, Name, JobType FROM CronJobDetail WHERE Id = :job.CronJobDetail.Id];

Wenn Sie schließlich die Gesamtzahl aller geplanten Apex-Aufträge, ausgenommen aller anderen geplanten Auftragstypen, abrufen möchten, führen Sie folgende Abfrage aus. Beachten Sie, dass hier der Wert '7' für den Auftragstyp angegeben wird, was dem geplanten Apex-Auftragstyp entspricht. Eine Liste aller Typen finden Sie unter dem Link "CronJobDetail" im Abschnitt "Ressourcen".

SELECT COUNT() FROM CronTrigger WHERE CronJobDetail.JobType = '7’

Ressourcen