/* * Copyright (C) 2007-2013, GoodData(R) Corporation. All rights reserved. */ package net.javacrumbs.demos.async; import net.javacrumbs.common.Utils; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import static java.util.concurrent.CompletableFuture.supplyAsync; import static net.javacrumbs.common.Utils.log; import static net.javacrumbs.common.Utils.sleep; public class CreditRatingService { public static void main(String[] args) throws ExecutionException, InterruptedException { int userId = 1; log("Start"); CompletableFuture.supplyAsync(() -> getUser(userId)) .thenApply(CreditRatingService::getCreditRatingFromSystem1) .thenAccept(Utils::log); log("End"); Thread.sleep(1000L); } private static User getUser(int id) { sleep(100); log("User loaded"); return new User(id); } private static CreditRating getCreditRatingFromSystem1(User user) { sleep(100); log("Rating 1 loaded"); // throw new IllegalStateException("Error"); return new CreditRating(user, 75); } private static CreditRating getCreditRatingFromSystem2(User user) { sleep(50); log("Rating 2 loaded"); return new CreditRating(user, 100); } public static class User { private final int id; public User(int id) { this.id = id; } @Override public String toString() { return "User{" + "id=" + id + '}'; } } public static class CreditRating { private final User user; private final int rating; public CreditRating(User user, int rating) { this.user = user; this.rating = rating; } public CreditRating combine(CreditRating other) { log("Combine"); return this.rating < other.rating ? this : other; } @Override public String toString() { return "CreditRating{" + "user=" + user + ", rating=" + rating + '}'; } } }