в настоящее время у меня есть требование сделать асинхронную задачу для синхронизации в завершаемом будущем. Например. Задача A и Задача B вполне достижимы в будущем. Задача B выполняется, когда задача A завершена. Это прекрасно работает в течение одного раза. Предположим, если я сделаю это для запуска в цикле foor, очевидно, он создаст n количество асинхронных вызовов для достижения результата. Из-за этого я получаю o / p, как показано ниже
A
B
A
A
B
B
A
B
A
A
A
Я хочу достичь, как
A
B
A
B
A
B
A
B
Вот код,
package com.demo.completable.combine;
import javax.xml.stream.Location;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class ThenCompose {
synchronized CompletableFuture<User> getUserDetails(String name) {
return CompletableFuture.supplyAsync(() -> {
return UserService.getUser(name);
});
}
synchronized CompletableFuture<Double> getRating(User user) {
return CompletableFuture.supplyAsync(() -> {
return CreditRating.getCreditRating(user);
});
}
synchronized CompletableFuture<String> getResult(Double rating) {
return CompletableFuture.supplyAsync(()-> {
return "welcome world";
});
}
public void main() throws InterruptedException, ExecutionException {
ThenCompose cc = new ThenCompose();
// then apply
CompletableFuture<CompletableFuture<Double>> result = cc.getUserDetails("kumaran").thenApply(user -> {
return cc.getRating(user);
});
// then compose
for (int i = 1; i <= 15; i++) {
CompletableFuture<Double> taskA = cc.getUserDetails("mike").thenCompose(user -> {
System.out.println("Task A --- " +Thread.currentThread().getName() + "--" + LocalTime.now());
return cc.getRating(user);
});
CompletableFuture<String> fileLocation =
taskA.thenCompose(ts -> {
System.out.println("Task B --- " +Thread.currentThread().getName() + "--- " + LocalTime.now());
return getResult(ts);
});
}
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
ThenCompose tc = new ThenCompose();
tc.main();
}
}
положив соединение и получить будет работать, но я не должен использовать как присоединиться и получить. Пожалуйста, предложите решение.
ниже приведен мой фрагмент кода использования,
CompletableFuture<HttpResponse<FileResponseModel>> createdFileResponse = null;
//assume contains 5 files in filesList
for (MyFile myFile : filesList) {
final MyFile myFileModel = myFile;
if(null == createdFileResponse) {
System.out.println("inside new if loop");
createdFileResponse = getFileToInsert(attributesList,
myFileModel.getProfile(), myFileModel.getFile()).
thenCompose(fileModelResponse->{
//below line will make a request to api
return fileFlow.createfileModelResponse(getLinks(), fileModelResponse,
authToken);
});
} else {
System.out.println("check new else loop ");
createdFileResponse = createdFileResponse.thenCompose(unused -> {
getFileToInsert(attributesList,
myfileModelResponse.getProfile(), myfileModelResponse.getFile(),UrlResponse,
myfileModelResponse.getHashPair(), startTimeCode, skipChecksForFile).
thenCompose(fileModelResponse->{
//below line will make a request to api
return fileFlow.createfileModelResponse(getLinks(), fileModelResponse,
authToken);
});
});
});
}