У меня он работает сейчас, используя следующую структуру (я извиняюсь за форматирование - это в основном псевдокод):
AsyncRequest объект: AsyncType (PickList: 'SMS на Twilio' является его сейчас), Params (длинная область текста: разделенный запятыми список идентификаторов)
объект Сообщение: К (телефон), С (телефона), сообщения (текст), Отправленные (булево), smsId (строка), Error (текст)
Сообщение триггера: передается триггер детали для метода CreateAsyncRequests().
CreateAsyncRequests: оценивать каждое новое/обновленное Message__c; если Sent == false для любых сообщений, мы создаем AsyncRequest, type = SMS для Twilio, Params + = ',' + message.Id.
// Создайте список, который необходимо вставить после обработки всех сообщений Список запросов = новый Список();
Как только мы достигнем 5 message.Ids в одном списке AsyncRequest.Params, добавьте его в запросы. Если все сообщения обработаны и есть запрос с < 5 Идентификаторами в Params, добавьте его также в запросы.
If requests.size() > 0 {
insert requests;
AsyncProcessor.StartBatch();
}
AsyncProcessor реализует .Batchable и .AllowsCallouts, и запрашивает ASyncRequest__c для любых запросов, которые должны быть обработаны, в данном случае будет наш список сообщений.
Метод execute() принимает список ASyncRequests, разбивает каждое значение Params на свои идентификаторы сообщений компонента и затем запрашивает объект Message для этих конкретных сообщений.
StartBatch() вызывает execute() с 1 записью за раз, так что каждый процесс execute() будет содержать менее 10 выносок.
Каждое сообщение обрабатывается в блоке try/catch, который вызывает SendMessage(), устанавливает Message.smsId = Twilio.smsId и устанавливает Message.Sent = true.
Если smsId не возвращается, сообщение не было отправлено, и я установил boolean bSidIsNull = true, указав, что (по крайней мере) одно сообщение не было отправлено.
** Если какое-либо сообщение не удалось, не smsIds не возвращаются ДАЖЕ ДЛЯ СООБЩЕНИЙ, которые оказались успешными **
После каждой партии сообщений обрабатывается, я проверяю bSidIsNull; если true, тогда я возвращаюсь к списку сообщений и помещаю любые, у которых нет smsId, в карту, индексированную номером Twilio, который я пытаюсь отправить им.
Поскольку я ограничен каждый AsyncRequest 5 сообщений, я до сих пор использование выноски для извлечения всех сообщений, отправленных из этого числа Twilio.From на текущую дату, используя
client.getAccount().getMessages('From' => fromNumber, 'DateSent' => currentDate)
Тогда я могу обновите Message.smsIds для всех успешных сообщений и добавьте сообщение об ошибке в Message.Error_on_Send__c для всех неудачных.
Я не вижу способ отправить неоднократное даже с одним сообщением; To, From и Message для каждой выноски - единственный метод, с которым я столкнулся. –
К сожалению, проблема снова решена, вы правы, мой опыт работы с twilio API немного устарел, и я вспомнил о возможности отправки групповых сообщений, но я был некорректен. На этом этапе единственным доступным решением было бы перенаправить данные на внешнюю службу, которая может отправлять вам сообщения без ограничений, налагаемых SFDC. –
@ DuncanStewart - Я сталкиваюсь с одной и той же проблемой более 10 сообщений, и я пытаюсь понять, как вызывать процесс асинхронно. Вы говорите, что даже с Асинчем это проблема? – Ditty