데이터베이스를 사용하는 방법. Salesforce의 Batch Apex에서 상태 저장

게시 됨: 2023-11-21

먼저 Batch Apex를 사용하려면 Salesforce에서 제공하는 인터페이스 Database를 구현하는 Apex 클래스를 작성해야 한다는 점을 이해해야 합니다. 배치 가능하고 프로그래밍 방식으로 클래스를 호출합니다. 일괄 Apex 작업 실행을 모니터링하거나 중지하려면 설정에서 빠른 찾기 상자에 Apex 작업을 입력한 후 Apex 작업을 선택합니다.

이번 글에서는 데이터베이스의 강력한 기능을 살펴보겠습니다. Batch Apex의 상태 저장. 데이터베이스 이해. 상태 저장은 배치 작업 실행 전반에 걸쳐 상태를 유지하는 데 필수적이므로 개발자는 인스턴스 변수를 보존하고 보다 정교한 상태 인식 배치 프로세스를 만들 수 있습니다.

배치 구문:

 전역 클래스 BatchName이 Database.Batchable을 구현합니다.{}

배치 클래스 방법:

 전역(Database.QueryLocator | Iterable) 시작(Database.BatchableContext bc) {
 //여기서 쿼리를 추가하고 결과를 실행 메소드에 반환합니다.
}

전역 무효 실행(Database.BatchableContext BC, list<P>){
 //로직이 여기에 있어야 합니다.
}

전역 무효 완료(Database.BatchableContext BC){
 //모든 배치를 처리한 후 이 메서드가 호출됩니다. 그 안에 어떤 코드라도 작성할 수 있습니다. 실행 메소드에서 생성되거나 업데이트된 모든 레코드에 이메일을 보내고 싶은 경우와 같습니다.
}

또한 읽어 보세요: Salesforce에서 사용자 정의 보고서 유형을 만드는 방법은 무엇입니까?

Database.Batchable 인터페이스 구현

예:

 전역 클래스 BatchAccountUpdate는 Database.Batchable을 구현합니다.{
    문자열 쿼리 = '계정 WHERE 이름에서 이름을 선택하세요! = null AND (이름 = \'Virendra 회사\' OR 이름 = \'Virendra Sharma\') ';
    전역 Database.QueryLocator 시작(Database.BatchableContext bc) {
        // 실행을 위해 전달할 레코드나 객체의 배치를 수집합니다.
        return Database.getQueryLocator(쿼리);
    }
    
    전역 무효 실행(Database.BatchableContext bc, 목록 레코드) {
        // 각 레코드 배치를 처리합니다.
        for (계정 계정: 레코드){
            acc.Name = acc.Name + ' 업데이트됨';
        }
        기록 업데이트;
    }
    
    전역 무효 완료(Database.BatchableContext bc){
        // 후처리 작업을 실행합니다. 배치 클래스를 호출합니다.
        BatchUpdateAccountRelatedContacts b = new BatchUpdateAccountRelatedContacts();
        Database.executeBatch(b, 200);
    }    
}
데이터베이스 상태 저장

데이터베이스.상태 저장

다음 샘플 클래스는 QueryLocator를 사용하여 start() 메서드에 의해 전달된 모든 계정 레코드를 찾고 계정의 우편 주소로 연결된 연락처를 업데이트합니다. 마지막으로 대량 작업 결과가 포함된 이메일을 보냅니다. Database.Stateful을 사용하여 상태를 추적하므로 업데이트된 레코드 수가 있습니다.

데이터베이스 상태 저장 코드
데이터베이스 상태 저장 코드

예:

Salesforce 개발자를 고용하세요

데이터베이스.허용콜아웃

Batch의 Database.AllowsCallout은 Salesforce를 외부 서버와 통합하는 데 도움이 됩니다. 배치 Apex에서 콜아웃을 사용하려면 배치 클래스의 클래스 정의에서 Database.AllowsCallouts 인터페이스를 사용해야 합니다.

통사론:

 전역 클래스 SearchAndReplace는 Database.Batchable, Database.AllowsCallouts를 구현합니다.{}

예:
여기에서는 Opportunity 개체를 Razorsync.com과 통합하고 있습니다.
/*
razorsync에서 서비스 요청을 받아 Salesforce에 업데이트하세요.
*/

 전역 클래스 Batch_SR_RazorSyncAPI는 Database.Batchable, Database.AllowsCallouts를 구현합니다.
    전역 Database.QueryLocator 시작(Database.BatchableContext BC){
        문자열 쿼리 = 'Razorsync_Service_Request_Id__c != null AND Razorsync_Job_Status__c != \'작업 완료\' AND RazorSync_Status__c = \'성공\''의 기회에서 Razorsync_Service_Request_Id__c 선택;
        return Database.getQueryLocator(쿼리);
    }
   
    전역 무효 실행(Database.BatchableContext BC, 목록 범위){
        문자열 상태;
        for(기회: 범위){
            //서비스 요청 받기
            System.debug(s.Id);
            HTTP http1 = 새로운 Http();
            HttpRequest 요청1 = 새로운 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('호스트', 'DomainName.0.razorsync.com');
            request1.setHeader('콘텐츠 길이', '0');
            request1.setHeader('연결', '연결 유지');
            request1.setHeader('ServerName', 'DomainServerName');
            request1.setHeader('토큰', 'XXXXXXXXXXXXXXXXXXXXXXX');
            
            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 = 파서.getText();
                    }
                }
                System.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에서 복잡한 상태 종속 일괄 처리를 위한 강력한 도구가 됩니다.

Salesforce 프로젝트에 대한 추가 지원을 받으려면 당사를 Salesforce 컨설턴트로 고용하여 혜택을 누리십시오.