Apex-异步

Apex 异步(6)监视异步

学习目标

完成这个单位后,你会知道:

  • 如何监控不同类型的工作。
  • 如何使用弹性队列。

监视异步作业

异步工作的好处是他们在后台默默地工作。异步工作的难点在于他们在后台默默工作。幸运的是,有几种方法可以监视你的工作内容。

您可以监视Salesforce用户界面中所有作业的状态。从安装程序中,在快速查找框中输入作业,然后选择Apex作业。

Apex Jobs页面显示所有异步Apex作业,其中包含有关每个作业执行的信息。以下屏幕截图显示了同一个Batch Apex类的一个未来方法作业和两个已完成的批处理作业。

Apex Jobs

如果您有许多批处理作业,请使用“批处理作业”页面仅查看批处理作业。要打开“Apex批处理作业”页面,请单击“Apex作业”页面顶部的链接。使用“Apex批处理作业”页面中的滑块选择特定的日期范围,并缩小显示的批处理作业的列表。您可以查看过去尚未删除的作业。 “批处理作业”页面按批处理类别对作业进行分组。

Apex Batch Jobs

点击您感兴趣的课程ID旁边的“更多信息”,查找有关为该课程执行的作业的详细信息。此图像显示单击“更多信息”后显示的弹出窗口。这个批次类有两个成功执行的作业。

information about parent jobs

您还可以监视Apex Flex队列中Apex作业的状态,并对其进行重新排序以控制首先处理哪些作业。从“设置”中,在“快速查找”框中输入作业,然后选择 Apex Flex Queue.

监测Future Jobs

Future jobs就像任何其他工作一样出现在Apex工作页面上。但是,未来的工作目前不属于灵活队列的一部分。

你可以查询AsyncApexJob找到你未来的工作,但有一个警告。由于启动未来作业不会返回ID,因此您必须过滤其他字段(如MethodName或JobType)以查找您的作业。在这个Stack Exchange文章中有几个示例SOQL查询可能会有所帮助。

使用SOQL监视Queued Jobs

要查询有关您提交的作业的信息,请通过筛选System.enqueueJob方法返回的作业ID,在AsyncApexJob上执行SOQL查询。

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

使用Flex队列监视Queue Jobs

Apex Flex队列使您能够提交多达100个批处理作业执行。任何提交执行的作业都处于保持状态,并放置在Apex Flex队列中。最多可以有100个批处理作业处于保持状态。

按照先进先出的顺序处理作业。您可以查看当前的队列顺序并将其排列,以便将重要的工作移到前面,或者将重要的工作移到后面。

当系统资源可用时,系统从Apex Flex队列的顶部选取下一个作业,并将其移至批处理作业队列。系统可以为每个组织同时处理最多五个排队或活动作业。这些已移动作业的状态从“保持”更改为“已排队”。排队的作业在系统准备好处理新作业时被执行。像其他作业一样,您可以在Apex Jobs页面中监控排队的作业。

监视Scheduled Jobs

在计划完Apex作业之后,您可以通过在CronTrigger上运行SOQL查询来获得更多关于它的信息。以下示例查询作业运行的次数以及计划再次运行作业的日期和时间。它使用从System.schedule方法返回的jobID变量。

CronTrigger ct = [SELECT TimesTriggered, NextFireTime FROM CronTrigger WHERE Id = :jobID];
如果您在可调度类的execute方法内部执行此查询,则可以通过调用SchedulableContext参数变量上的getTriggerId来获取当前作业的ID。
global class DoAwesomeStuff implements Schedulable {

    global void execute(SchedulableContext sc) {
        // 一些很棒的代码
        CronTrigger ct = [SELECT TimesTriggered, NextFireTime FROM CronTrigger WHERE Id = :sc.getTriggerId()];
    }
    
}
您还可以从与CronTrigger记录关联的CronJobDetail记录中获取作业的名称和作业的类型。为此,请在CronTrigger上执行查询时使用CronJobDetail关系。本示例使用CronJobDetail中的作业名称和类型来检索最新的CronTrigger记录。
CronTrigger job = [SELECT Id, CronJobDetail.Id, CronJobDetail.Name, CronJobDetail.JobType FROM CronTrigger ORDER BY CreatedDate DESC LIMIT 1];
或者,您可以直接查询CronJobDetail以获取作业的名称和类型。 以下示例获取上例中查询的CronTrigger记录的作业名称和类型。 相应的CronJobDetail记录标识由CronTrigger记录上的CronJobDetail.Id表达式获取。
CronJobDetail ctd = [SELECT Id, Name, JobType FROM CronJobDetail WHERE Id = :job.CronJobDetail.Id];
最后,要获取所有Apex计划作业的总计数(不包括所有其他计划作业类型),请执行以下查询。 请注意,值“7”是为作业类型指定的,该作业类型对应于预定的Apex作业类型。 请参阅参考资料部分中的CronJobDetail,了解所有类型的列表。
SELECT COUNT() FROM CronTrigger WHERE CronJobDetail.JobType = '7

你可能也会喜欢...