0

我需要有关设计问题的帮助以及 Batch Apex 中发生的情况。

这是我们的场景:我们有一个区域对象,然后当您更新单个字段时需要更新多达数百个联系人上的字段。为此,我正在使用 Batch Apex。并在更新之前在区域记录上调用它。

问题:

  1. 假设用户将区域从 A 更新到 B,然后单击保存。这会导致大量联系人更新并需要一段时间。然后,他将 B 更改为 C。我们是否保证所有受影响记录的最终更新都是 C?怎么会?

  2. 或者,有没有办法安排你的批处理作业?我正在研究 asyncApexJob 并将其用作框架……</p>

  3. 有更好的设计吗?

4

2 回答 2

1
  1. Batch Apex 的工作方式与触发器的工作方式不同。问题 1 中描述的情况发生的唯一方法是,如果您要从触发器调用/执行批处理,我强烈建议您避免这种情况,如果可能的话。
  2. (和 3.)批次通常使用Apex Scheduler 安排在夜间或下班时间运行。这是推荐的解决方案。
于 2012-06-15T19:36:34.663 回答
0

首先,您需要将逻辑放在 Territory 对象的 AFTER UPDATE 触发器中,而不是 BEFORE UPDATE 部分。作为一般规则,如果您需要更新触发器操作所针对的记录/对象上的字段或值(即在您的情况下为 Territory 对象),那么您使用 BEFORE UPDATE 或 BEFORE INSERT 部分,如果您想创建/更新/删除其他记录/对象(即您的情况下的联系人),您使用更新后或插入后部分。

其次,我认为从触发器启动批处理顶点过程没有任何问题。

例如,假设您有一个名为“BatchUpdateContactsBasedOnTerritory”的批处理类。该课程具有三 (3) 个关键功能:

  1. 除了“Database.Batchable”之外,它还实现了“Database.Stateful”
  2. 它有一个构造方法,该方法将地区列表作为参数/参数
  3. 它有一个成员变量来保存传入的地区列表

您的批处理课程的一部分

global list<Territory> TerritoryList;

global BatchUpdateContactsBasedOnTerritory(list<Territory> updatedTerritories){
    TerritoryList = updatedTerritories;
}

你的触发器

trigger TerritoryTrigger on Territory (after delete, after insert, after undelete, after update, before delete, before insert, before update)
{
    if(trigger.isInsert)
    {
        if(Trigger.isBefore){
            // before insert event not implemented 
        }
        else if(Trigger.isAfter){
            // after insert event not implemented 
        }
    }else if(trigger.isUpdate){
        if(Trigger.isBefore){
            // before update event not implemented 
        }
        else if(Trigger.isAfter){
            // after update event - call batch class to process 1000 records at a time
            Database.ExecuteBatch(new BatchUpdateContactsBasedOnTerritory(trigger.new),1000);
        }
    }else if(trigger.isDelete){
        if(Trigger.isBefore){
            // before delete event not implemented 
        }
        else if(Trigger.isAfter){ 
            // after delete event not implemented 
        }
    }
    else if(Trigger.isUnDelete){ 
        // undelete event not implemented
    }
}
于 2012-06-16T17:42:02.003 回答