如何使用資料庫。 Salesforce 中的批次 Apex 狀態化
已發表: 2023-11-21首先,我們必須明白,如果我們想要使用Batch Apex,我們必須編寫一個Apex類別來實作Salesforce提供的介面Database。 可批次處理,然後以程式設計方式呼叫該類別。 若要監控或停止批次 Apex 作業的執行,請從「設定」中,在快速尋找方塊中輸入 Apex 作業,然後選擇 Apex 作業。
在本文中,我們將深入探討資料庫的強大功能。 Batch Apex 中有狀態。 了解資料庫。 有狀態對於跨批次作業執行維護狀態至關重要,它允許開發人員保留實例變數並創建更複雜的、狀態感知的批次過程。
批次語法:
全域類別 BatchName 實作 Database.Batchable{}
Batch類別的方法:
全域(Database.QueryLocator | Iterable)開始(Database.BatchableContext bc){ //這裡我們將新增查詢並將結果傳回execute方法 } 全域無效執行(Database.BatchableContext BC,列表<P>){ //邏輯必須在這裡 } 全域無效完成(Database.BatchableContext BC){ //處理完所有批次後,將會呼叫此方法。 我們可以在裡面編寫任何程式碼。 就像如果想要向在執行方法中建立或更新的所有記錄發送電子郵件一樣。 }
另請閱讀:如何在 Salesforce 中建立自訂報表類型?
實作Database.Batchable介面
例子:
全域類別 BatchAccountUpdate 實作 Database.Batchable{ 字串查詢 = '從帳戶 WHERE 名稱選擇名稱! = null AND (Name = \'Virendra Company\' OR Name = \'Virendra Sharma\') '; 全域 Database.QueryLocator 開始 (Database.BatchableContext bc) { // 收集要傳遞執行的批次記錄或對象 返回Database.getQueryLocator(查詢); } 全域無效執行(Database.BatchableContext bc,清單記錄){ // 處理每批記錄 for(帳戶帳戶:記錄){ acc.Name = acc.Name + ' 已更新'; } 更新記錄; } 全域無效完成(Database.BatchableContext bc){ // 執行任何後處理操作,呼叫批次類別。 BatchUpdateAccountRelatedContacts b = new BatchUpdateAccountRelatedContacts(); 資料庫.executeBatch(b, 200); } }
資料庫.有狀態
以下範例類別使用 QueryLocator 尋找 start() 方法傳入的所有帳戶記錄,並使用其帳戶的郵寄地址更新關聯的聯絡人。 最後,它會發送一封電子郵件,其中包含批量作業的結果,並且由於我們使用 Database.Stateful 來追蹤狀態和更新的記錄數。
例子:
Database.AllowsCallout
批次中的 Database.AllowsCallout 有助於將 Salesforce 與外部伺服器整合。 要在批次 Apex 中使用標註,我們必須在批次類別的類別定義中使用 Database.AllowsCallouts 介面。
句法:
全域類別 SearchAndReplace 實作 Database.Batchable、Database.AllowsCallouts{}
例子:
在這裡,我將 Opportunity 物件與 Razorsync.com 集成
/*
從 razorsync 獲取服務請求並將其更新到銷售人員中
*/
全域類別 Batch_SR_RazorSyncAPI 實作 Database.Batchable、Database.AllowsCallouts{ 全域Database.QueryLocator開始(Database.BatchableContext BC){ 字串查詢 = 'SELECT Id, Razorsync_Service_Request_Id__c FROM Opportunity WHERE Razorsync_Service_Request_Id__c != null AND Razorsync_Job_Status__c != \'作業完成\' AND RazorSync_Status__c = \'成功\; 返回Database.getQueryLocator(查詢); } 全域無效執行(Database.BatchableContext BC,清單範圍){ 字串狀態; for (機會 s : 範圍){ //取得服務請求 System.debug(s.Id); Http http1 = new Http(); HttpRequest 請求1 = new HttpRequest(); request1.setEndpoint('https://DomainName.0.razorsync.com/ApiService.svc/ServiceRequest/'+ s.Razorsync_Service_Request_Id__c); request1.setMethod('GET'); request1.setHeader('Content-Type', 'application/json'); request1.setHeader('Host', 'DomainName.0.razorsync.com'); request1.setHeader('內容長度', '0'); request1.setHeader('連接', '保持活動'); request1.setHeader('伺服器名稱', '網域名稱伺服器名稱'); request1.setHeader('Token', 'XXXXXXXXXXXXXXXXXXXXXXXX'); HttpResponse 回應1 = http1.send(request1); if(response1.getStatusCode() == 200) { 地位; JSONParser 解析器 = JSON.createParser(response1.getBody()); while(parser.nextToken() != null) { if( (parser.getCurrentToken() == JSONToken.FIELD_NAME) && (parser.getText() == 'StatusId') || Test.isRunningTest()) { 解析器.nextToken(); StatusId = parser.getText(); } } 系統.debug(StatusId); if(StatusId == String.valueOf(1) || Test.isRunningTest()){ s.Razorsync_Job_Status__c = '工作完成'; s.StageName = '已結束'; }別的{ s.Razorsync_Job_Status__c = '工作'; } } } 更新範圍; } 全域無效完成(Database.BatchableContext BC){ } }
另請閱讀:Salesforce Commerce Cloud 的優勢以及如何在 Salesforce 中從 Apex 呼叫流程
結論
在 Salesforce 內的 Batch Apex 中使用Database.Stateful允許在批次作業中跨不同執行方法保留狀態。 這對於需要複雜資料處理並且必須在批次之間保留狀態的場景至關重要。
透過實作Database.Stateful ,開發人員可以確保資料一致性並有效管理大型資料集。 但是,明智地使用此功能很重要,以避免過多的記憶體消耗和潛在的效能問題。
最佳實踐包括保持狀態變數最少並專注於基本數據,從而使Database.Stateful成為 Salesforce 中複雜的、依賴狀態的批次的強大工具。
如需銷售人員專案的進一步協助,請聘請我們擔任您的銷售人員顧問並獲得收益。