From 2c9a41653e44119bffeb93523bb6825b671faa34 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 30 Jun 2022 20:54:45 -0500 Subject: [PATCH] QQQ-14 first cut at switching processInit method to run async --- pom.xml | 2 +- .../javalin/QJavalinImplementation.java | 48 ++++++++++++++----- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index f446376b..9e2930b1 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ com.kingsrook.qqq qqq-backend-core - 0.0.0-20220628.161829-14 + 0.0.0-20220701.014218-17 com.kingsrook.qqq diff --git a/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java b/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java index bfd94268..6c68564d 100644 --- a/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java +++ b/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java @@ -29,6 +29,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import com.kingsrook.qqq.backend.core.actions.DeleteAction; import com.kingsrook.qqq.backend.core.actions.InsertAction; import com.kingsrook.qqq.backend.core.actions.MetaDataAction; @@ -507,21 +511,41 @@ public class QJavalinImplementation try { - /////////////////////////////////////////////////////// - // run the process // - // todo - async? some "job id" to return to caller? // - /////////////////////////////////////////////////////// - LOG.info("Running process [" + runProcessRequest.getProcessName() + "]"); - RunProcessResult runProcessResult = new RunProcessAction().execute(runProcessRequest); - LOG.info("Process result error? " + runProcessResult.getError()); - for(QFieldMetaData outputField : qInstance.getProcess(runProcessRequest.getProcessName()).getOutputFields()) + //////////////////////////////////////////////// + // run the process // + // todo - some "job id" to return to caller? // + //////////////////////////////////////////////// + CompletableFuture future = CompletableFuture.supplyAsync(() -> { - LOG.info("Process result output value: " + outputField.getName() + ": " + runProcessResult.getValues().get(outputField.getName())); - } + try + { + LOG.info("Running process [" + runProcessRequest.getProcessName() + "]"); + RunProcessResult runProcessResult = new RunProcessAction().execute(runProcessRequest); + LOG.info("Process result error? " + runProcessResult.getError()); + for(QFieldMetaData outputField : qInstance.getProcess(runProcessRequest.getProcessName()).getOutputFields()) + { + LOG.info("Process result output value: " + outputField.getName() + ": " + runProcessResult.getValues().get(outputField.getName())); + } + return (runProcessResult); + } + catch(Exception e) + { + LOG.error("Error running future for process", e); + throw (new CompletionException(e)); + } + }); Map resultForCaller = new HashMap<>(); - resultForCaller.put("error", runProcessResult.getError()); - resultForCaller.put("values", runProcessResult.getValues()); + try + { + RunProcessResult runProcessResult = future.get(3, TimeUnit.SECONDS); + resultForCaller.put("error", runProcessResult.getError()); + resultForCaller.put("values", runProcessResult.getValues()); + } + catch(TimeoutException te) + { + resultForCaller.put("jobId", "Job is running asynchronously... job id available in a later version."); + } context.result(JsonUtils.toJson(resultForCaller)); } catch(Exception e)