Apex Batch和Apex Scheduler-定時批處理大量數據

2021-03-02 Salesforce課堂

我們在處理大規模數據時,經常會發生各種限制。但是使用Apex Batch會將需要處理的數據,分割開來執行。

也就是進行異步處理數據,而不會超出平臺的限制。

同步和異步的概念:

生活中,同步就是表示兩件事請同時做,比如一邊聽歌一邊學習寫作業。這兩件事是同時進行。

生活中,異步就是表示兩件事請有先後順序,只能是先聽歌,聽完歌之後再學習寫作業。這兩件事是有順序的進行。

軟體程序中,完全是相反的,也就是同步是有順序經進行,異步是同時進行。

同步:每個程序處理都是有順序的,不能跨越執行,比如用戶必須先註冊,然後才可以登錄,這個流程不能變。

異步:程序只是發送調用的指令,不用等待被調用的方法完全執行完,而是會繼續執行下一個程序。就像打開一個頁面,是邊加載邊顯示在頁面上。

同步是需要等待,異步不需要等待。

看一下英文表示,同步:Synchronize,異步:Asynchronous

 

批處理Apex語法

 

實現 :Database.Batchable 接口

和三個方法:

start()

global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContext bc) {}

Apex Batch開始,在Apex批處理作業的開始處被調用一次,收集並返回處理的對象或記錄。

使用QueryLocator對象時,將忽略SOQL查詢檢索到的記錄總數的限制條件限制,並且最多可以查詢5000萬條記錄。

使用Iterable對象時,SOQL查詢檢索的記錄總數的限制條件限制仍然適用。

execute()

global void execute(Database.BatchableContext BC, list<P>){}

接收start()傳過來的對象或記錄,默認批處理大小為200條記錄。200條執行一次。

批處理記錄開始它們傾向於按照從方法中接收到的順序執行。但是,執行記錄批處理的順序取決於各種因素。無法保證執行順序。

finish ()

global void finish(Database.BatchableContext BC){}

用於執行後處理操作(例如發送郵件,日誌登錄,調用其他Batch等),並且在處理完所有批次後調用一次。

 

批處理Apex類的框架如下:

global class MyBatchClass implements Database.Batchable<sObject> {
global (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContext bc) {
// collect the batches of records or objects to be passed to execute
}
global void execute(Database.BatchableContext bc, List<P> records){
// process each batch of records
}
global void finish(Database.BatchableContext bc){
// execute any post-processing operations
}
}

 

調用批處理類

MyBatchClass myBatchObject = new MyBatchClass();

Id batchId = Database.executeBatch(myBatchObject,200);

 

每次調用Batch Apex時,都會創建一個AsyncApexJob記錄,以便跟蹤工作進度。可以通過SOQL查看進度並管理Apex作業隊列中的作業。

AsyncApexJob job = [SELECT Id, Status, JobItemsProcessed, TotalJobItems, NumberOfErrors FROM AsyncApexJob WHERE ID = :batchId ];

 

下面看一個具體的例子,

當環境中有許多操作在一個對象上時,例如PB,Flow,Trigger等,我們對這個對象進行數據移行,需要更新等操作時,需要更加小心,

因為有可能會觸發【Apex CPU time limit exceeded】,導致比如用dataloader更新,需要設置batch size為50,20,甚至為1,這樣執行時間會大大加大。

Code more efficiently to avoid 『Apex CPU time limit exceeded』

https://help.salesforce.com/articleView?id=000339361&language=ja&type=1&mode=1

Salesforce Developer Limits and Allocations Quick Reference

https://developer.salesforce.com/docs/atlas.ja-jp.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_apexgov.htm

Maximum CPU time on the Salesforce servers510,000 milliseconds60,000 millisecondsMaximum execution time for each Apex transaction10 minutes

 

數據移行時,有些Object需要直接更新,什麼操作都不用,只是更新,為了讓其他的PB等生效,設置上其相應的值。

也就是所謂的空更新,用dataloader做一個欄位更新也可以實現,這裡用Apex Batch來完成。

 

首先在Account對象上創建一個【空更新Flag】CheckBox欄位。

 


global class AccountUpdateBatch implements Database.batchable<sObject> {

    global AccountUpdateBatch() {

    }

    global Database.QueryLocator start(Database.BatchableContext BC) {

        String query = 'select Id, Name, karakousin_Flag__c from Account';

        //return Database.getQueryLocator([select Id, Name, karakousin_Flag__c from Account]);

        return Database.getQueryLocator(query);

    }

    global void execute(Database.BatchableContext BC, List<sObject> scope) {

        List<Account> accountList = new List<Account>();

        Account acc = new Account();

        for (sObject s : scope) {

            acc = new Account();

            acc = (Account)s;

            acc.karakousin_Flag__c = true;

            accountList.add(acc);

        }

        if (accountList.size() > 0) update accountList;

    }

    global void finish(Database.BatchableContext BC) {

           // Get the ID of the AsyncApexJob representing this batch job

           // from Database.BatchableContext.

           // Query the AsyncApexJob object to retrieve the current job's information.

           AsyncApexJob a = [SELECT Id, Status, NumberOfErrors, JobItemsProcessed,

              TotalJobItems, CreatedBy.Email

              FROM AsyncApexJob WHERE Id =

              :BC.getJobId()];

           // Send an email to the Apex job's submitter notifying of job completion.

           Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();

           String[] toAddresses = new String[] {a.CreatedBy.Email};

           mail.setToAddresses(toAddresses);

           mail.setSubject('Apex Sharing Recalculation ' + a.Status);

           mail.setPlainTextBody

           ('The batch Apex job processed ' + a.TotalJobItems +

           ' batches with '+ a.NumberOfErrors + ' failures.');

           Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });

  }

}

 

確認一下空更新Flag 欄位。

 

通過匿名窗口執行,Apex Batch

 

回到頁面 在確認空更新Flag 欄位。

 

 

 

 

如果Batch類同時實現Database.Stateful,

可以指定保留這些事務之間的狀態。Database.Stateful使用時,僅實例成員變量在事務之間保存值。

靜態成員變量不會在事務之間保留其值,而是會重置。當您要計數或匯總正在處理的記錄時,保持狀態很有用。

例如,工作處理機會記錄。執行 可以定義一個方法來匯總已處理的交易總數。

Database.Stateful 如果未指定,則所有靜態成員變量和實例成員變量都將還原為其原始值。

 

第一種情況:Database.Stateful 未指定

上面加上

private Integer AUB_Count = 0;

global void execute(Database.BatchableContext BC, List<sObject> scope) {
AUB_Count += scope.size();
system.debug(『AUB_Count = 『 + AUB_Count);

}

打開 Debug logs,新建 User Trace Flags,

 

 

 

 

然後在執行Apex Batch,

先看一下 環境中有多少個 Account記錄,

 

執行Batch後,

 

AccountUpdateBatch batch = new AccountUpdateBatch();
database.executeBatch(batch,40);

 

 

看 AUB_Count 處理記錄數量

 

 

總共100條,第一次 40,第二次 40,第三次 20,不會加上之前的。

 

 

 

第二種情況:Database.Stateful 指定

 

global class AccountUpdateBatch implements Database.batchable<sObject>, Database.stateful{}

 

其他一樣,

 

執行Batch後,一樣的Batch Size=40,

 

 

 

總共100條,第一次 40,第二次 80,第三次 100,會加上之前的。

 

Apex Scheduler

上面是手動執行批處理,現在用Apex Scheduler可以在特定的時間執行Apex Batch。

 

實現Schedulable接口

 

Apex Scheduler語法

global class scheduledBatchable implements Schedulable {

global void execute(SchedulableContext sc) {

 batchable b = new batchable();

 database.executebatch(b);

}

}

 

scheduledBatchable reminder = new scheduledBatchable ();

// Seconds Minutes Hours Day_of_month Month Day_of_week optional_year

String sch = 』17 30 00 1 9 ? 2020′;

String jobID = System.schedule(『Owners』, sch, reminder);

 

對上面的Batch操作。


global class AccountScheduled implements Schedulable {

global void execute(SchedulableContext sc) {

AccountUpdateBatch aub = new AccountUpdateBatch();

database.executebatch(aub);

}

}



AccountScheduled accsch = new AccountScheduled();

String sch = '00 31 16 1 9 ? 2020'; //表示 2020年9月1日,16:31:00

String jobID = system.schedule('Account Job1', sch, accsch);


1,通過匿名窗口執行

Apex Jobs

 

Scheduled Jobs

 

2,通過Schedule Apex執行。

 

 

 

 

設置為每周二的下午五點執行。

 

為了測試我設置為下午四點看效果。

 

Apex Jobs

 

Scheduled Jobs


這次只是簡單的空更新Batch,更複雜的業務邏輯,都可以根據需要更改。

正常執行了,有問題或者建議可以評論區留言。

 

參考下面的連結。

Use Batch Apex Thrilhead

https://trailhead.salesforce.com/en/content/learn/modules/asynchronous_apex/async_apex_batch

Using Batch Apex

https://developer.salesforce.com/docs/atlas.en-us.226.0.apexcode.meta/apexcode/apex_batch_interface.htm

Schedule Jobs Using the Apex Scheduler

https://trailhead.salesforce.com/en/content/learn/modules/asynchronous_apex/async_apex_scheduled

Apex Scheduler

https://developer.salesforce.com/docs/atlas.en-us.224.0.apexcode.meta/apexcode/apex_scheduler.htm

 

我在故我思,我思故我在。

相關焦點

  • apex英雄什麼步槍最好用 apex英雄步槍詳細介紹
    apex英雄什麼步槍最好用 apex英雄步槍詳細介紹 鬥玩網(douwan.com)報導:apex英雄什麼步槍最好用?
  • apex英雄DPI設置方法推薦
    apex英雄作為一款射擊遊戲,滑鼠靈敏度和DPI是各位玩家繞不過去的一個話題,那麼apex英雄DPI設置多少好,又該怎麼設置DPI呢?下面18183小編就為大家帶來apex英雄DPI設置方法推薦。 apex英雄作為一款射擊遊戲,滑鼠靈敏度和DPI是各位玩家繞不過去的一個話題
  • Oracle 21c新特性之番外篇——APEX簡介及配置
    例如數據加載、批量數據上傳,數據填報、數據可視化等等。官網地址為:https://apex.oracle.com/zh-cn/platform/。APEX當前最新版本為20.2,下載地址為:https://www.oracle.com/tools/downloads/apex-downloads.html。
  • 在Salesforce Apex 中使用欄位集
    通過在Apex中使用動態SOQL查詢,並在visualforce和Apex代碼中使用fielset。我們的代碼將變得動態,然後我們可以在欄位集中添加,刪除或重新排序欄位。這樣,我們的代碼將變得動態。當我們對欄位集進行任何更改時,無需修改代碼。
  • APEX英雄哪個平臺可以下載?APEX英雄官網地址在哪?
    【apex英雄官網地址】https://www.ea.com/zh-tw/games/apex-legends/about   以上就是apex的官網,因為是境外網站,所以國內小夥伴打開的時候比較慢,可以連接VPN打開,在官網裡可以看到APEX的英雄介紹、遊戲資訊等信息。   以上就是APEX英雄下載和官網介紹,你都了解了嗎?想了解更多遊戲資訊嗎?
  • apex上steam後橘子平臺用戶怎麼辦 apex steam鎖國區解決方法及...
    apex上steam後橘子平臺用戶怎麼辦?apexsteam鎖國區怎麼玩?apexsteam怎麼下載?小編給大家介紹下具體的情況介紹,有需要的建議一起來了下吧~ apexsteam鎖國區解決方法及下載介紹 《Apex英雄》Steam版將於11月5日正式上線,目前已經開啟了Steam預下載,不過本次上線的Steam版是鎖國區的,對於國內玩家非常不友好。但是經過玩家們的研究,發現了Steam國區同樣也是可以遊玩《Apex英雄》的。
  • apex英雄一直準備中怎麼辦?apex主界面加載不進去
    apex英雄因為是境外遊戲,又是新公測的遊戲,所以大家在啟動運行的時候會遇到各種問題,比如最近有小夥伴反應進入後在主界面一直轉圈圈,加載不了,以下是該問題解決辦法匯總,一起來了解一下吧。
  • Apex英雄官網地址 apex官網配置要求一覽
    怎麼在官網下載apex英雄?官方配置是多少?以下是關於APEX英雄下載和配置說明,一起來了解一下吧。   【APEX英雄官網下載】   1、首先在瀏覽器中輸入「APEX英雄官網」,點擊進入後綴是「EA官方網站」的那一項。   2、如果進入官網很慢或者一直加載不進去的話,建議連結VPN或者使用谷歌瀏覽器。
  • apex英雄萬聖節限時活動預告 apex萬聖節限時全新飾品系列裝載
    apex英雄萬聖節限時活動預告 apex萬聖節限時全新飾品系列裝載。EA近日正式公布最新的萬聖節限時活動「Fight or Fright」,同時將迎來全新模式,趕緊來看看吧! apex英雄萬聖節限時活動預告 apex萬聖節限時全新飾品系列裝載。
  • 《apex英雄》第五賽季什麼時候 奇遊加速器全速支持
    儘管第五賽季的通行證價格還沒有曝光,但根據此前幾個賽季的價格推測,《apex英雄》第五賽季通行證價格極有可能維持在950Apex硬幣。新角色「洛瓦」如果你認真看過《apex英雄》第四賽季的宣傳片,你應該還記得裡面的小女孩,父母被復仇者殺害從此成為了遺孤。
  • Pytorch中的Distributed Data Parallel與混合精度訓練(Apex)
    因為它花了大量的篇幅講 nn.DistributedDataParallel 中的複製功能(數據是怎麼複製的)。然而,他並沒有在高層邏輯上總結一下都在扯啥,甚至沒說這個DistributedDataParallel是咋用的?這裡還有一個Pytorch關於入門分布式數據並行的(Distributed data parallel)教程。
  • apex英雄熱氣球無限飛行bug操作方法介紹
    在apex英雄中熱氣球經過一些特殊操縱就可以無限飛行,那麼apex英雄熱氣球怎麼無限飛行呢?下面18183小編就為大家介紹apex英雄熱氣球無限飛行bug操作方法。 在apex英雄中熱氣球經過一些特殊操縱就可以無限飛行,那麼apex英雄熱氣球怎麼無限飛行呢?
  • 《apex英雄》新武器浩劫怎麼樣 浩劫武器玩法技巧
    ,小編整理了最新的資料和大家分享下吧!apex英雄新武器浩劫好用嗎? 新武器... apex英雄的浩劫是最近即將推出的新武器,這個浩劫武器的外觀很霸氣,而且威力也是非常巨大的,另外這款武器還有特殊的配件,小編整理了最新的資料和大家分享下吧! apex英雄新武器浩劫好用嗎?
  • 《apex英雄》twitch探路者皮膚如何領取 twitch探路者皮膚領取方法
    導 讀 apex英雄聯合twitch推出一款特殊twitch探路者皮膚。
  • apex:國外玩家無意發現EA秘密,比神仙還厲害,每局都吃雞!
    apex英雄這款遊戲的上線,迅速的分流了絕地求生的玩家,這樣的戰果足以說明這款遊戲的成功,據不完全統計,apex英雄的玩家裡有90%的玩家都玩過絕地求生,這樣的成就想必EA公司應該很開心!大家都知道,EA遊戲公司可是全網公認的全美最爛遊戲公司,但是隨叫人家有個超棒的引擎呢!
  • apex英雄怎麼買東西?apex英雄怎麼充值金幣?
    【apex英雄怎麼充值金幣】   1、首先要有銀行卡,先註冊paypal然後綁定銀行卡,也可以用信用卡,先確認卡裡有充足的餘額。   2、下載有外服節點的梯子,自己百度搜索一下就有了,然後打開橘子平臺客戶端,在我的遊戲庫中選擇APEX英雄。
  • 《apex英雄》一直轉圈怎麼辦 遊戲一轉圈無法進入解決方法分享
    導 讀 apex英雄界面一直轉圈怎麼解決?
  • apex英雄封禁50萬人 奇遊加速玩美港澳服
    apex英雄封禁50萬人 奇遊加速玩美港澳服  奇遊客戶端最新版本5.1.11更新上線《apex英雄》區服節點選擇功能    隨著3月20日《apex英雄》第1賽季「狂野邊境」的正式更新,開發商在更新報告中表示:遊戲內外掛舉報功能已正式添加
  • Apex英雄:你會兔子跳嗎?4個必學的操作技巧,大大提高實力
    但是由於這項技術的存在,在apex中也可以達到極佳的效果,前提是你可以熟練掌握。兔子跳原理上很簡單但是需要大量的練習和時間來完成,對於兔子跳需要啟動C滑鏟,然後跳躍,每當即將著落地面時要立即跳躍起來。這時可以切換槍械,並在想要的方向移動或者掃射。
  • Apex英雄官網下載地址 apex英雄官網下載不了?
    Apex英雄上線已經一個月了,這款新遊的首月表現超出預期,銷量和評價直逼絕地求生,就目前來看,APEX英雄的熱度在未來幾個月,甚至整個2019年都會持續火熱,那麼這款遊戲真有那麼好玩嗎?怎麼下載?一起來了解一下吧。   一、APEX英雄好玩嗎?