updated to try again when 5XX errors occur

This commit is contained in:
Tim Chamberlain
2022-08-23 10:23:15 -05:00
parent 84b1c6f610
commit ce3c9e9deb
2 changed files with 41 additions and 13 deletions

View File

@ -22,7 +22,7 @@
import React, {useEffect, useState, Fragment} from "react"; import React, {useEffect, useState, Fragment} from "react";
// formik components // formik components
import {Form, Formik, useFormikContext} from "formik"; import {Form, Formik} from "formik";
// @mui material components // @mui material components
import Grid from "@mui/material/Grid"; import Grid from "@mui/material/Grid";
@ -59,12 +59,17 @@ import Footer from "examples/Footer";
import {QProcessMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QProcessMetaData"; import {QProcessMetaData} from "@kingsrook/qqq-frontend-core/lib/model/metaData/QProcessMetaData";
import Navbar from "qqq/components/Navbar"; import Navbar from "qqq/components/Navbar";
import BaseLayout from "qqq/components/BaseLayout"; import BaseLayout from "qqq/components/BaseLayout";
import {QException} from "@kingsrook/qqq-frontend-core/lib/exceptions/QException";
interface Props interface Props
{ {
process?: QProcessMetaData; process?: QProcessMetaData;
} }
const INITIAL_RETRY_MILLIS = 1_500;
const RETRY_MAX_MILLIS = 12_000;
const BACKOFF_AMOUNT = 1.5;
function ProcessRun({process}: Props): JSX.Element function ProcessRun({process}: Props): JSX.Element
{ {
const processNameParam = useParams().processName; const processNameParam = useParams().processName;
@ -74,6 +79,7 @@ function ProcessRun({process}: Props): JSX.Element
// process state // // process state //
/////////////////// ///////////////////
const [processUUID, setProcessUUID] = useState(null as string); const [processUUID, setProcessUUID] = useState(null as string);
const [retryMillis, setRetryMillis] = useState(INITIAL_RETRY_MILLIS);
const [jobUUID, setJobUUID] = useState(null as string); const [jobUUID, setJobUUID] = useState(null as string);
const [qJobRunning, setQJobRunning] = useState(null as QJobRunning); const [qJobRunning, setQJobRunning] = useState(null as QJobRunning);
const [qJobRunningDate, setQJobRunningDate] = useState(null as Date); const [qJobRunningDate, setQJobRunningDate] = useState(null as Date);
@ -526,6 +532,8 @@ function ProcessRun({process}: Props): JSX.Element
if (lastProcessResponse) if (lastProcessResponse)
{ {
setLastProcessResponse(null); setLastProcessResponse(null);
setRetryMillis(INITIAL_RETRY_MILLIS);
setQJobRunning(null); setQJobRunning(null);
if (lastProcessResponse instanceof QJobComplete) if (lastProcessResponse instanceof QJobComplete)
@ -566,23 +574,47 @@ function ProcessRun({process}: Props): JSX.Element
if (needToCheckJobStatus) if (needToCheckJobStatus)
{ {
setNeedToCheckJobStatus(false); setNeedToCheckJobStatus(false);
if (jobUUID) (async () =>
{ {
(async () => setTimeout(async () =>
{ {
setTimeout(async () => try
{ {
console.log("OK");
const processResponse = await QClient.getInstance().processJobStatus( const processResponse = await QClient.getInstance().processJobStatus(
processName, processName,
processUUID, processUUID,
jobUUID, jobUUID,
); );
setLastProcessResponse(processResponse); setLastProcessResponse(processResponse);
}, 1500); }
})(); catch (e)
} {
if (e instanceof QException)
{
const qException = e as QException;
const status = Number(qException.status);
if (status !== undefined && !Number.isNaN(status) && status >= 500 && status <= 600)
{
if (retryMillis < RETRY_MAX_MILLIS)
{
console.log(`500 error, attempting to retry in ${retryMillis + retryMillis} millis`);
setRetryMillis(retryMillis * BACKOFF_AMOUNT);
setNeedToCheckJobStatus(true);
return;
}
console.log(`Retry millis [${retryMillis}] is greater or equal to the max retry limit [${RETRY_MAX_MILLIS}], giving up...`);
setProcessError("Could not connect to server");
}
}
throw (e);
}
}, retryMillis);
})();
} }
}, [needToCheckJobStatus]); }, [needToCheckJobStatus, retryMillis]);
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
// do the initial load of data for the process - that is, meta data, plus the init step // // do the initial load of data for the process - that is, meta data, plus the init step //

View File

@ -34,11 +34,7 @@ class QClient
private static handleException(exception: QException) private static handleException(exception: QException)
{ {
console.log(`Caught Exception: ${JSON.stringify(exception)}`); console.log(`Caught Exception: ${JSON.stringify(exception)}`);
const {logout} = useAuth0(); throw (exception);
if (exception.status === "401")
{
logout();
}
} }
public static getInstance() public static getInstance()