завершаемое будущее runasync в цикле foreach - PullRequest
0 голосов
/ 04 апреля 2019

Я определил завершенную будущую задачу runasync () в цикле foreach.

У меня есть требование вставлять записи в nosql db, и мне нужно обновить те же вставленные записи, что и «обработанные» в sql db (перенос данных изsqldb DB2 для nosql mongodb).

Чтобы добиться этого, я определил процесс вставки монго в runasyn () и функцию обновления данных, обрабатываемых в db2, в thenAccept () (после проверки фрагмента кода)

Итак, проблема в том,после каждой вставки записи в монго я сохраняю вставленную запись в списке и пытаюсь обновить весь список в db2 за один снимок, но это не так, для каждой вставки в монго она нажимает db2 для каждого обновления записи, но это неосуществимый подходпри обработке тысяч записей.Я ожидаю, что первым получу список вставленных в монго записей и обновлю этот список как обработанный в db2 за один раз.Есть ли возможность для такого подхода?(Я знаю, что и вставка Монго, и обновление db2 определены в цикле foreach, но я хочу, чтобы Монго завершил вставку для всех записей, затем необходимо обновить db2 для всего списка вставленных Монго за один раз) или если я смог вернуть список вставленных записей из mongoProcess по крайней мере.

Фрагмент кода:

unprocessedList.foreach(entry-> {
Completablefuture <Void> cf= Completablefuture.runAsync(() -> {
mongoHelper.processInMongo(entry, getObj(entry)) } , executor). thenAccept ( 
updateInDb2 ( entryList)) });

1 Ответ

0 голосов
/ 04 апреля 2019

Если я вас правильно понял, вы хотите закончить все вставки и только потом сделать одно обновление. вы можете изменить свой код, чтобы использовать обещания (я сам не слишком знаком с java), так что вот «базовая» схема решения вашей проблемы.

обратите внимание, что вы должны использовать atomicInterger для переменной счетчика, поскольку ++ не является атомарным и не будет работать 100% времени, в противном случае

function x (count, expected) {
 if(count == expected) {
    updateInDb2 ( entryList)) 
   }
}

counter = 0:

unprocessedList.foreach(entry-> {
    Completablefuture <Void> cf= Completablefuture.runAsync(() -> {
    mongoHelper.processInMongo(entry, getObj(entry)) } , executor).thenAccept(
   counter++;
   x(counter, unprocessedList.length);
 });

как я уже сказал, я не слишком знаком с обещаниями Java, но лучшее решение будет в виде:

дождаться обещания = вставить все монго документы обещание выполнено, обновите список

...