mirror of
https://github.com/Kingsrook/qqq-frontend-material-dashboard.git
synced 2025-07-18 05:10:45 +00:00
updated to try again when 5XX errors occur
This commit is contained in:
@ -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 //
|
||||||
|
@ -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()
|
||||||
|
Reference in New Issue
Block a user