Salesforce 如何安排apex每30秒运行一次?

Salesforce 如何安排apex每30秒运行一次?,salesforce,apex-code,Salesforce,Apex Code,我们希望创建一个出站消息队列系统,该系统将单独处理请求,并将请求发送到任何外部web服务。处理这些请求的频率是可变的,但作为一个例子,我们可能希望该进程每30秒运行一次 在一小时内每30秒安排一次相同的作业120次是不可能的,也是不实际的 我最终决定的方法是链式调度apex(等待到预定时间,调用future方法并删除(中止)本身)->future调用(如果有,则处理请求并在30秒内重新调度类)->调度apex(在30秒内调用future方法,中止本身)->future调用(处理请求并重新调度)等

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

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

我最终决定的方法是链式调度apex(等待到预定时间,调用future方法并删除(中止)本身)->future调用(如果有,则处理请求并在30秒内重新调度类)->调度apex(在30秒内调用future方法,中止本身)->future调用(处理请求并重新调度)等等。最终结果已经在生产上运行了两个星期,但只是没有重新安排自己,我不明白为什么

我相信现在发生的事情是,我正在突破某种州长的限制,但我不明白怎么做。我在我的沙盒上经常遇到类似的问题,并且收到一个限制异常,说明已超过未来请求的限制

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

即便如此,Salesforce表示,我们允许每24小时执行250000次apex异步执行,所以我不明白发生了什么。有没有人有过以这种方式链接计划作业的经验?有没有更好的方法来实现这一点?是否存在我不知道的限制,或者我是否以错误的方式度量异步执行


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

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


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

您的评论正在等待审核

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

在查询的末尾加上“limit9999”。如果这样做有效,那么这就是你的问题。使用 executebatch(新的SyncCalendarsUpdates(),1); 2.请检查实例“数据存储”设置>>监视器>>系统概述(数据存储)
解决方案请删除一些数据或联系salesforce增加数据存储限制。

也许您可以试试运气。谢谢。我会在那里试试。