/* $Id$ */ package com.linkedin.parseq.example.domain; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import com.linkedin.parseq.Engine; import com.linkedin.parseq.Task; import com.linkedin.parseq.Tasks; import com.linkedin.parseq.example.common.ExampleUtil; import com.linkedin.parseq.function.Tuple2; /** * @author Jaroslaw Odzga (jodzga@linkedin.com) */ public class Examples extends AbstractDomainExample { public static void main(String[] args) throws Exception { new Examples(false).runExample(); } public Examples(boolean useBatching) { super(useBatching); } //--------------------------------------------------------------- //create summary for a person: "<first name> <last name>" Task<String> createSummary(int id) { return fetchPerson(id).map("shortSummary", this::shortSummary); } String shortSummary(Person p) { return p.getFirstName() + " " + p.getLastName(); } //--------------------------------------------------------------- //handles failures delivering degraded experience Task<String> createResilientSummary(int id) { return fetchPerson(id).map(this::shortSummary).recover(e -> "Member " + id); } //--------------------------------------------------------------- //handles failures delivering degraded experience in timely fashion Task<String> createResponsiveSummary(int id) { return fetchPerson(id).withTimeout(100, TimeUnit.MILLISECONDS).map(this::shortSummary).recover(e -> "Member " + id); } //--------------------------------------------------------------- /** Tasks composition */ //create extended summary for a person: "<first name> <last name> working at <company name>" Task<String> createExtendedSummary(int id) { return fetchPerson(id) .flatMap("createExtendedSummary", this::createExtendedSummary); } Task<String> createExtendedSummary(final Person p) { return fetchCompany(p.getCompanyId()) .map("summary", company -> shortSummary(p) + " working at " + company.getName()); } //--------------------------------------------------------------- //create mailbox summary for a person: "<first name> <last name> has <X> messages" Task<String> createMailboxSummary(int id) { return Task.par(createExtendedSummary(id), fetchMailbox(id)) .map("createMailboxSummary", (summary, mailbox) -> summary + " has " + mailbox.size() + " messages"); } //create list of summaries, one per each connection Task<List<String>> createConnectionsSummaries(int id) { return fetchPerson(id).flatMap("createConnectionsSummaries", person -> createConnectionsSummaries(person.getConnections())); } Task<List<String>> createConnectionsSummaries(List<Integer> connections) { return Tasks.par(createConnectionsSummariesTasks(connections)); } List<Task<String>> createConnectionsSummariesTasks(List<Integer> connections) { return connections.stream().map(this::createExtendedSummary).collect(Collectors.toList()); } //--------------------------------------------------------------- Task<Tuple2<String, List<String>>> createFullSummary(int id) { return Task.par(createMailboxSummary(id), createConnectionsSummaries(id)); } //--------------------------------------------------------------- /** Task collections */ //--------------------------------------------------------------- @Override protected void doRunExample(final Engine engine) throws Exception { Task<?> task = createExtendedSummary(1); // Task<?> task = Task.par(createExtendedSummary(1), createExtendedSummary(2)); engine.run(task); runTaskAndPrintResults(engine, task); } private void runTaskAndPrintResults(final Engine engine, Task<?> task) throws InterruptedException { engine.run(task); task.await(); System.out.println(task.get()); ExampleUtil.printTracingResults(task); } }