1

我们想创建一个出站消息队列系统,该系统将单独处理请求,以便处理任何外部 Web 服务。这些请求应该被处理的频率是可变的,但作为一个例子,我们可能希望进程每 30 秒运行一次。

在一小时内每 30 秒安排 120 次相同的作业是不可能或不切实际的。

我最终确定的方法是链接调度顶点(等到预定时间,调用未来方法并删除(中止)本身)-> 未来调用(如果有一个处理请求并重新安排类在 30 秒内重新运行)-> 调度apex(在 30 秒内调用未来方法,自行中止)-> 未来调用(处理请求和重新安排)等等无限期地。最终结果已经在生产中运行了 2 周,但未能自行重新安排,我不明白为什么。

我相信正在发生的事情是我违反了某种州长限制,但我不明白如何。我在我的沙盒上更频繁地遇到类似问题,并且收到了一个限制异常,指出已超出未来请求的限制。

从服务失败的那一刻起,我查询了前 24 小时内的所有异步作业(不仅仅是未来),它只返回 2200。我相信这个数字应该是 4400,因为我认为计划作业没有出现(预定的作业在调用 future 方法后会自行中止)。

即便如此,Salesforce 声明我们每 24 小时允许 250,000 次异步顶点执行,所以我不明白发生了什么。有没有人有任何尝试以这种方式链接预定作业的经验?有没有更好的方法来实现这一目标?是否有我不知道的限制,或者我以错误的方式测量异步执行?

任何帮助或建议将不胜感激。

4

2 回答 2

0

我曾经相当成功地让 Apex 以 5 分钟而不是 30 秒的时间间隔执行此操作,但无论如何,这种方法存在固有的脆弱性。@future 调用没有保证的运行时间,因此虽然它们通常在调用时立即运行,但它们可能会延迟。我在执行 @future 方法时经历了长达 20 分钟的延迟,因此这可以解释为什么您的计划运行次数比您想象的要少(尽管它恰好是您预期的一半,这令人费解)。

归根结底,至少在撰写本文时,Scheduled Apex 并不是真正为这个用例而设计的。就我而言,我最终使用Heroku Scheduler作为中介。我意识到这不是理想的解决方案(它是不同的平台、不同的语言,但仍然是 Force.com),但它更强大。

于 2013-06-19T20:20:50.320 回答
0

您的评论正在等待审核。

您好,请检查以下几点。1. 这是一个 DML 语句,其管理限制为 10,000。您是在最后更新批次,而不是在每次迭代时更新。

在查询的末尾加上“LIMIT 9999”。如果这可行,那么这是您的问题。使用 database.executebatch(new SyncCalendarsUpdates (), 1); 2. 请检查实例“数据存储”转到设置>>监控>>系统概述(数据存储)解决方案请删除一些数据或联系销售人员增加数据存储限制。

于 2015-04-28T11:16:58.797 回答