2017-10-06 6 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

これは本当にありがとうございました:) 私は "apex jobs monitoring"について知りませんでした。すべてのDMLロジックを削除した後、私は無許可のURLにデータを投稿していました。 –

+0

ハハ:)クール。だから、明らかにするだけです。 「デバッグログ」を使用するか、「@ future」を試している間にデベロッパーコンソールを開いてもらうと、「メインのもの」とは別のエントリとしてデバッグログに表示されます。ユーザーが何か失敗した(または夜間のバッチジョブが終了した)ことを報告した場合、デバッグログはありませんでした.Apexジョブに行くことは、死後の問題をレビューする方法です。 – eyescream

関連する問題