Salesforce fetchSize = 100を設定しましたが、クエリのために100の要素をフェッチしません。したがって、ConsumerIteratorからの単一の結果をリストに集めて、バッチプロセスに100のセットで渡すことができるようにしたいと考えています。以下のコードがあります。これは正しい方法ですか?私はそれを正しく行う方法に関する提案を感謝します。すべてのConsumerIterator要素を50のバッチで処理したいと思います。そのバッチが50未満の場合、そのバッチを処理したいと思います。私の試みは、Salesforceのクエリでスレッドセーフな方法でコレクションを繰り返しながらリスト内の要素を集める
ConsumerIterator<HashMap<String,Object>> iter=
(ConsumerIterator<HashMap<String,Object>>)obj;
List<HashMap<String,Object>> l=new CopyOnWriteArrayList<>();
while(iter.hasNext()){
Object payload=iter.next();
if(l.size()<50){
l.add((HashMap<String,Object>)payload);
}else{
write(l);
}
public int [] write(List<HashMap<String,Object> list)
{
synchronized(list)
{
ArrayList newList=copy(list);
save(newList);
}
+
投稿されたコードでは、 'l'は他のスレッドには見られません。したがって、' CopyOnWriteArrayList'を使用せず、 'synchronized(list)'を使うことも本当に必要です。対照的に、コードスニペットからは、 'obj'かその基礎となるデータソースがスレッド間で共有されているかどうかわからないので、それを反復するのが正しいかどうかは言うことができません。それに加えて、ジェネリック型、生の型、不要な型情報の削除は、既知の型を持つ項目を 'Object'に割り当て、それに続いて避けることのできないキャストを渡します。あなたはそのコードをクリーンアップする必要があります... – Holger