2017-10-06 574 views
0

我試圖從salesforce撥出大部分代碼是從另一個工作包複製的。Salesforce @future(callout = true)方法永遠不會運行

有誰能告訴我爲什麼下面的調出方法永遠不會運行?

我在調用調出方法之前和之後保存到自定義表中,但在調出方法中未保存到我的自定義表中。

公共類AutoSyncConnector {

public AutoSyncConnector() 
{ 

} 

public void Fire(string jsonToPost) 
{ 
    // 1. Authentication send the current session id so that request can be validated 
    String sessionId = UserInfo.getSessionId(); 

    // 2. warp the request and post it to the configured end point 
    // This is how to get settings out for custom settings list 
    String connectorUrl = ASEndPoints__c.getValues('MainUrlEndPoint').autosync__MainSiteUrl__c; 

    CastlesMessageLog__c cd = new CastlesMessageLog__c(); 
    cd.SentJson__c = 'before call out this is called'; 
    insert cd; 

    AutoSyncConnector.CallOut(jsonToPost, connectorUrl); 

    CastlesMessageLog__c cd2 = new CastlesMessageLog__c(); 
    cd2.SentJson__c = 'after call out this is called'; 
    insert cd2; 
} 


public static void CallOut(String jsonToPost, String connectorUrl) 
{ 
    MakeCallout(jsonToPost,connectorUrl); 
} 

@future(callout=true) 
public static void MakeCallout(String jsonToPost, String connectorUrl){ 

    CastlesMessageLog__c cd = new CastlesMessageLog__c(); 
    cd.SentJson__c = 'start inside before call out this is never called'; 
    insert cd; 

    Http h = new Http(); 
    HttpRequest req = new HttpRequest(); 
    req.setTimeout(120000); 
    // string authorizationHeader = 'Check I can add stuff to the header'; 
    String sfdcConnectorUrl = connectorUrl + '/api/autosyncwebhook'; 
    req.setEndpoint(sfdcConnectorUrl); 
    //req.setHeader('Authorization', authorizationHeader); 
    req.setMethod('POST'); 
    req.setHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    req.setBody(jsonToPost); 
    h.send(req); 

    CastlesMessageLog__c cd2 = new CastlesMessageLog__c(); 
    cd2.SentJson__c = 'end inside before call out this is never called'; 
    insert cd2; 


} 

}

+0

你也可以在[salesforce.stackexchange.com](https://salesforce.stackexchange.com/ ),它是與Salesforce相關的問題的平臺。 –

回答

0

進入設置 - >監控 - >頂點的工作。我的直覺是你會在那裏看到很多「未落實的工作待處理」錯誤。

當您進行任何DML(插入/更新/刪除)時,您將在數據庫中打開一個事務。如果接下來你要做的是一個標註(最大超時時間爲120秒),這意味着你在這個記錄(甚至整個表格)上持續很長時間的鎖定。 SF無法知道該呼叫是成功還是必須回滾。所以他們通過立即禁止這樣的代碼來保護情況;)

先做出標註,然後是你的DML。

或者讓DML調用@future(這是爲了切換到另一個線程,分離上下文),如果標註返回錯誤 - 做任何清理你會考慮回滾(刪除記錄?更新它的狀態=同步失敗?發送電子郵件給用戶/爲他插入一個任務稍後重試?)

+0

這真的幫了我很多謝謝:) 我不知道「頂點作業監控」,並刪除所有我的DML邏輯後,我可以看到,我發佈數據到一個未經授權的URL許多經驗教訓在這裏。 –

+0

哈哈:)很酷。所以,要清楚。如果您將使用「調試日誌」或在嘗試使用「@ future」時打開開發者控制檯 - 您將在調試日誌中看到它們,因爲它與您的「主要版本」分開。只是如果用戶報告失敗的事情(或每晚的批處理作業死掉),那麼您沒有調試日誌 - 去Apex作業是一種查看事後驗證問題的方法。 – eyescream