Überwachen von asynchronem Apex
Lernziele
Mit Trail Together einem Dozenten folgen
Möchten Sie bei diesem Schritt einem Dozenten folgen? Schauen Sie sich dieses Video an, das Teil der Reihe "Trail Together" auf Trailhead Live ist.
(Dieser Clip beginnt bei Minute 01:25:18, für den Fall, dass Sie zurückspringen und den Anfang des Schritts noch einmal sehen möchten.)
Ü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 Jobs (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.
Wenn Sie viele Batchaufträge vorliegen haben, verwenden Sie die Seite "Batch Jobs (Batchaufträge)", um nur Batchaufträge anzuzeigen. Sie öffnen die Seite "Batch Jobs (Batchaufträge)", indem Sie oben auf der Seite "Apex Jobs (Apex-Aufträge)" auf den Link klicken. Wählen Sie mithilfe des Schiebereglers auf der Seite "Apex Batch Jobs (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 "Batch Jobs (Batchaufträge)" werden Aufträge nach Batch-Klasse gruppiert.
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 "More Info (Weitere Informationen)" angezeigt wird. In dieser Batch-Klasse gibt es zwei Aufträge, die erfolgreich ausgeführt wurden.
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 Jobs (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 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 "Holding (Halten)" in "Queued (In 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 Jobs (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.
public class DoAwesomeStuff implements Schedulable { public 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 direkt 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’