公開コールバックに関するベストプラクティス
SObjectType.newSObject で作成された同じイベントオブジェクトを再公開しない
SObjectType.newSObject(recordTypeId, loadDefaults) Apex メソッドを使用してイベントオブジェクトを作成する場合は、同じイベントオブジェクトを複数回公開しないことをお勧めします。このイベントオブジェクトには EventUuid 値が設定されるため、イベントオブジェクトを複数回公開すると、一意ではない EventUuid 値がコールバックで追跡されることになります。EventUuid 値が重複すると、予期しない結果が生じる場合があります。API 参照名 Event_Name__e event = new Event_Name__e() を使用して作成するイベントについては、この動作は該当しません。
コールバックを使用して個々のイベントではなくイベントのリストを公開する
EventBus.publish コールでコールバックを使用している場合、複数のイベントを公開するときは、イベントのリストを作成し、それらのイベントを 1 回の EventBus.publish コールで公開することをお勧めします。すべてのイベントに対して EventBus.publish コールを 1 回使用する方が、イベントごとにコールを実行するよりも効率的です。これは、公開コールで使用される Apex ガバナ制限が減少するためです。また、システムでは、イベントのリストへのコールバック実行を一括処理することが試みられます。
次の例では、イベントのリストが作成され、次にそのリストがイベント変数を介して EventBus.publish コールに渡されます。このスニペットでは、コールバックインスタンスを使用して、publish メソッドが 1 回コールされます。
1// BEST PRACTICE
2FailureCallback cb = new FailureCallback();
3List<Order_Event__e> events = new List<Order_Event__e)();
4
5// Create events in a loop
6for(Integer i = 0;i<10;i++) {
7 events.add((Order_Event__e)Order_Event__e.sObjectType.newSObject(null, true));
8}
9
10// Pass the list of events to the publish call
11EventBus.publish(events, cb);一方、次の例は、避けるべき処理を示しています。この例では、コールバックを使用して公開メソッドを 10 回コール、つまりイベントごとにコールを実行しており非効率です。複数のイベントを 1 回の公開コールで一括処理する場合よりも多くのコールバック実行が後で発生する可能性があります。
1// !! NOT RECOMMENDED !!
2FailureCallback cb = new FailureCallback();
3
4// Create events individually and pass each event to the publish call
5for(Integer i = 0;i<10;i++) {
6 EventBus.publish((Order_Event__e)Order_Event__e.sObjectType.newSObject(null, true),
7 cb);
8}コールバックを使用して特定のプラットフォームイベント種別のイベントのリストを公開する
API 参照名を使用してイベントを作成する場合、コールバックを使用してイベントのリストを公開できるのは、特定のプラットフォームイベント種別でリストを定義した場合に限られます。汎用の sObject 種別はサポートされていません。たとえば、イベントのリストは次のように定義できます。
1List<Order_Event__e> events = new List<Order_Event__e>();次のようには定義できません。
1List<SObject> events = new List<SObject>();こうして、コールバックを使用してイベントを公開できます。
1events.add(new Order_Event__e());
2EventBus.publish(events, myCallback);