次の構造を使用して現在動作しています(フォーマットについてはお詫び申し上げます-ほとんどが疑似コードです):
ASyncRequest オブジェクト: AsyncType (選択リスト: 今のところ「SMS to Twilio」)、Params (長いテキスト エリア: ID のコンマ区切りリスト)
メッセージ オブジェクト: To (電話)、From (電話)、Message (テキスト)、Sent (ブール値)、smsId (文字列)、Error (テキスト)
メッセージ トリガー: トリガーの詳細を CreateAsyncRequests() メソッドに渡します。
CreateAsyncRequests: 新規/更新された各 Message__c を評価します。いずれかのメッセージに対して Sent == false の場合、AsyncRequest、type=SMS to Twilio、Params += ',' + message.Id を作成します。
// すべてのメッセージが処理された後に挿入されるリストを作成します List requests = new List();
1 つの AsyncRequest.Params リストで 5 つの message.Ids に達したら、それをリクエストに追加します。すべてのメッセージが処理され、Params の ID が 5 つ未満のリクエストがある場合は、それもリクエストに追加します。
If requests.size() > 0 {
insert requests;
AsyncProcessor.StartBatch();
}
AsyncProcessor は .Batchable と .allowsCallouts を実装し、処理が必要なすべての要求 (この場合は Messages リスト) について ASyncRequest__c をクエリします。
execute() メソッドは、ASyncRequests のリストを取得し、各 Params 値をコンポーネントのメッセージ ID に分割してから、それらの特定のメッセージについてメッセージ オブジェクトをクエリします。
StartBatch() は、一度に 1 つのレコードで execute() を呼び出します。そのため、各 execute() プロセスには最大 10 個のコールアウトよりも少ない数のコールアウトが含まれます。
各メッセージは、SendMessage() を呼び出し、Message.smsId = Twilio.smsId を設定し、Message.Sent = true を設定する try/catch ブロックで処理されます。
smsId が返されない場合、メッセージは送信されていません。ブール値 bSidIsNull = true を設定して、(少なくとも) 1 つのメッセージが送信されなかったことを示します。
** いずれかのメッセージが失敗した場合、成功したメッセージであっても smsIds は返されません **
メッセージの各バッチが処理された後、bSidIsNull をチェックします。true の場合、メッセージのリストに戻り、smsId を持たないメッセージを、送信元の Twilio 番号でインデックス付けされたマップに配置します。
各 ASyncRequest を 5 メッセージに制限したので、コールアウトを使用して、現在の日付の Twilio.From 番号から送信されたすべてのメッセージを取得できます。
client.getAccount().getMessages('From' => fromNumber, 'DateSent' => currentDate)
次に、成功したすべてのメッセージの Message.smsIds を更新し、失敗したメッセージの Message.Error_on_Send__c にエラー メッセージを追加します。