2014-05-19 4 views
2

ApexController 클래스에서 webservice에 대한 콜 아웃을 수행해야합니다. 이렇게하려면 @future (callout = true) 특성을 가진 asycn 메서드가 있습니다. 웹 서비스 호출은 VF 페이지에서 저장 호출로 채워지는 객체를 수정해야합니다.SFDC Apex 코드 : "Future"메소드의 클래스 레벨 정적 변수에 액세스

정적 (미래) 호출이 메서드 인수로 전달되는 모든 개체가 아니기 때문에 정적 데이터에 데이터를 추가하고 정적 메서드에서 액세스하여 웹 서비스 호출을 수행 할 계획이었습니다. 그러나 정적 Map 객체는 다시 초기화되고 static 메소드에서는 null입니다.

누군가가이 문제를 해결하는 방법에 대한 몇 가지 pointeres를 줄 수 있다면 정말 감사하겠습니다. 감사합니다. 여기

코드가 잘린이다

 private static Map<String, WidgetModels.LeadInformation> leadsMap; 

     .... 
     ...... 
     public PageReference save() { 

     if(leadsMap == null){ 
      leadsMap = new Map<String, WidgetModels.LeadInformation>(); 
     } 
     leadsMap.put(guid,widgetLead); 

     } 
     //make async call to Widegt Webservice 
     saveWidgetCallInformation(guid) 

     //async call to widge webserivce 
     @future (callout=true) 
     public static void saveWidgetCallInformation(String guid) { 
     WidgetModels.LeadInformation cachedLeadInfo = 
     (WidgetModels.LeadInformation)leadsMap.get(guid); 
     ..... 
     //call websevice 

     } 

답변

4

@future 완전히 별도의 실행 컨텍스트이다. 호출 된 방식의 모든 기록에 액세스 할 수 없습니다 (모든 정적 변수가 재설정됨을 의미합니다. 사용자가 시작한 새 작업과 같이 새로운 조정자 한도로 시작).

"알 수있는 것"은 전달 된 메서드 매개 변수뿐입니다. 그리고 당신은 전체 객체를 전달할 수 없으며, 원시 (Integer, String, DateTime 등) 또는 프리미티브 (List, Set, Map) 컬렉션을 전달해야합니다.

데이터베이스에서 필요한 모든 정보에 액세스 할 수 있다면 - 예를 들어 List<Id>을 전달하고 쿼리하십시오.

할 수 없다면 - 객체를 직렬화하고 List<String>으로 전달하여 속일 수 있습니다.


사이드 노트 - 당신은 당신의 흐름을 재고 할 수 있습니다 JSON 클래스 주위의 문서 또는이 두 편리하게 게시물을 확인? 시작 지점이 Visualforce이면 @future 단계를 건너 뛸 수 있습니다. 설명 선을 먼저 수행 한 다음 DML을 수행하십시오 (필요한 경우). 그렇게하면 일반적인 "보류되지 않은 작업 보류 중"오류가 발생하지 않습니다. 이 점은 개발자를 괴롭히는 것 뿐만이 아닙니다.) 디자인을 다시 생각하게 해줄 수 있습니다. 응용 프로그램에 열린 트랜잭션 &을 최대 2 분 동안 테이블에 잠그도록 요청하고 있습니다. 그리고 추가 작업을하고 있습니다. 삽입이 제대로되었지만 콜 아웃에 실패하면 변경 사항을 올바르게 롤백합니까?

작업 순서를 뒤집어서 (간단히 설명하면 DML) 간단하게 만듭니다. DB에 저장 시도가 없었으므로 저장에 실패하면 롤백 할 수 없습니다.

+0

안녕하세요. 보내 주신 의견에 감사드립니다. 불행히도 Saleforce 리드 ID가 내 웹 서비스에 전달되어야하므로 먼저 DML을 수행 한 다음 전화를해야합니다. 다른 제안이 있으면 감사하겠습니다. 난 그냥 직렬화 접근 방식을 시도하고 JSON 문자열로 개체 데이터를 전달하고 그 트릭에해야합니다. 귀하의 제안에 감사드립니다. – user899849

+0

"master"로 간주되는 데이터베이스 - SF 또는이 내선. 체계? 먼저 시스템을 호출하여 해당 시스템에서 생성 한 리드 ID ("ABC000123")를 반환 한 다음 리드를 삽입하여이를 해결할 수 있습니다. 그런 다음 해당 시스템은 리드의 '외부 ID'필드 (최상의 결과를 위해 고유해야 함)로 이러한 리드를 참조 할 수 있습니다. 예를 들어 실제 SF ID가 업데이트를 보내거나 관련 데이터를 삽입 할 필요가 없습니다. – eyescream

+0

안녕하세요, 마스터 시스템이 SF입니다. 담당자가 발신자로부터 리드 정보를 수집하는 사용자 정의 VF 페이지 (CTI 팝업을 통해 열림)가 있습니다. 제출 된 페이지에서 SF 리드 객체가 생성되어 저장됩니다. SF Lead Id는 일부 맞춤 정보 (SF에 저장되지 않지만 VF 페이지에서 캡처 됨)와 함께 외부 시스템에 전송되어야합니다. 안타깝게도 비즈니스 제약 조건 (요구 사항)으로 인해 SFDC에이 추가 데이터를 저장하거나 표준 리드 오브젝트를 수정하기위한 맞춤 테이블을 생성 할 수 없습니다. 귀하의 제안과 피드백에 다시 한 번 감사드립니다. 정말 감사합니다!! – user899849