Salesforce @future(callout = true)方法永远不会运行

时间:2017-10-06 10:58:20

标签: salesforce apex

我正在尝试从salesforce拨打电话,大部分代码都是从另一个工作包中复制的。

有谁能告诉我为什么下面的呼出方法永远不会运行?

我在调用call out方法之前和之后保存到我的自定义表中,但是在调出方法中不会调用保存到我的自定义表中。

public class 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;


}

}

1 个答案:

答案 0 :(得分:1)

转到设置 - >监控 - > Apex工作。我的直觉是,你会看到很多“未提交的工作待定”错误。

当您进行任何DML(插入/更新/删除)时,您将使用数据库打开一个事务。如果你要做的下一件事就是一个标注(可以有120秒的最大超时时间),这意味着你要长时间锁定这条记录(甚至是整个表格)。 SF无法知道呼叫是成功还是必须回滚。所以他们立即禁止这些代码来保护这种情况;)

首先制作标注,然后制作DML。

或者制作DML,调用@future(这是目的,切换到另一个线程,分离上下文),如果callout返回错误 - 做任何清理你认为是回滚(删除记录?更新它到状态=同步失败?向用户发送电子邮件/为他插入一个稍后重试的任务?)