Мой ответ по сути тот же. То, что я делаю, это готовит пользовательский объект очереди со всеми соответствующими идентификаторами (Пользователь / Контакт / Ведущий / и т. Д.) Вместе с моими пользовательскими данными, которые затем обрабатываются из вызова @Future. Это помогает с ограничениями регулятора, поскольку вы можете извлекать из очереди только то, что ваши вызовы и будущие ограничения позволят вам обработать в одном потоке. Например, для Facebook вы можете получить до 20 обновлений профиля за одну выноску. Каждый @Future допускает 10 вызовов, а каждый поток разрешает 10 вызовов @Future, что равняется 2000 отдельным обновлениям профиля Facebook - ЕСЛИ вы правильно обрабатываете свои партии и ЕСЛИ у вас достаточно мест в Salesforce, чтобы разрешить такое количество вызовов @Future. Это 200 @ будущих звонков на пользователя в сутки, когда я последний раз проверял.
Дорога становится узкой, когда вы выполняете инициируемые выноски, что, как я полагаю, вы пытаетесь сделать, исходя из вашей потребности вызывать вызов в методе @Future в первую очередь. Если вы не находитесь в триггере, то вы сможете обрабатывать свои выноски до тех пор, пока вы делаете их перед обработкой любого DML. Другими словами, откладывайте сохранение данных в каком-либо конкретном потоке до тех пор, пока вы не закончите вызывать.
Но так как это звучит так, как будто вам нужно вызывать из триггера, пакетирование его в sObjects - действительно верный путь. Это немного трудоемко, но, по сути, сериализация существующих данных кучи - это путь, по которому нужно путешествовать. Также подумайте о том, чтобы сделать это с помощью ежечасного запланированного вызова Batch Apex, так как с подходом очереди вы сможете в конечном итоге обработать все ваши выноски. Если вы столкнетесь с ограничениями регулятора (или, скорее, избежите их попадания) в определенном потоке, он проснется через час и завершит работу, оставленную в вашей очереди. Запуск этого процесса выглядит примерно так:
String jobId = System.schedule('YourScheduleName', '0 0 0-23 * * ?', new ScheduleableClass());
Это будет создавать экземпляр ScheduleableClass один раз в час, который будет извлекать работу из объекта очереди и обрабатывать максимальное количество обратных вызовов.
Удачи и прости за разочарование.