Gestion des Tasks
L'OIP Core gĂšre deux types de tasks, les tĂąches dont l'exĂ©cution est manuelle et celles dont l'exĂ©cution est programmĂ©e (CRON job). Une task standard peut ĂȘtre liĂ©e Ă une entitĂ© project ou non alors qu'une task programmĂ©e ne peut pas l'ĂȘtre.
Configuration des tĂąches
Exemple de configuration d'une tùche standard et d'une tùche programmée depuis le fichier de configuration OIP :
const magicCallback = async ({ taskHandler }) => {
const updateState = taskHandler.updateState;
// state update
updateState({
state: {
status: 'STARTED',
statusCode: 11
}
});
console.log('[MAGIC TASK] started');
await new Promise(res => setTimeout(res, 1500)); // heavy processing
// state update
updateState({
state: {
status: 'IN_PROGRESS',
statusCode: 21
}
});
console.log('[MAGIC TASK] in progress');
await new Promise(res => setTimeout(res, 4200)); // heavy processing
// state update
updateState({
state: {
status: 'COMPLETED',
statusCode: 42
}
});
};
const myCronTask = ({ taskHandler }) => {
const updateState = taskHandler.updateState;
console.log('[CRON TASK] executed');
updateState({
state: {
status: 'EXECUTED',
statusCode: 10
}
});
};
export default {
...config,
tasks: {
magicTask: {
callback: magicCallback
},
myCronTask: {
callback: myCronTask,
cron: '*/30 * * * * *' // triggered every 30 seconds
}
},
pubsub // required for task subscription
};Gestion des tĂąches depuis les vues
La gestion des tasks dans les vues est accessible grùce à processHandlers reçu dans les props du composant de la vue. Les méthodes exposées par processHandlers liées aux tasks sont les suivantes :
Le paramÚtre taskName des méthodes suivantes doit correspondre au nom d'une task définie dans le fichier de configuration OIP.
onRunTask
ParamĂštres : { projectId, taskName }
Permet de lancer l'exécution d'une task. projectId est optionnel. Si projectId est passé en paramÚtre, alors la task sera liée à l'entité project ciblée.
import withProcess from '@@app/withProcess';
const MyView = ({ context, processHandlers }) => {
const onRunTask = () => {
processHandlers.onRunTask({
projectId: context.projectId,
taskName: 'magicTask'
});
};
return (
<div>
<h2>My View</h2>
<div>
<button onClick={onRunTask}>RUN</button>
<div>
</div>
);
};
export default withProcess(MyView);getTask
ParamĂštres : { taskName, projectId }
Permet de récupérer la task souhaitée. projectId est optionnel. Si projectId est passé en paramÚtre, alors la task est recherchée par taskName et projectId.
import { useState } from 'react';
import withProcess from '@@app/withProcess';
const MyView = ({ context, processHandlers }) => {
const [task, setTask] = useState(null);
const onGetTask = async () => {
const _task = await processHandlers.getTask({
projectId: context.projectId,
taskName: 'magicTask',
});
setTask(_task);
};
return (
<div>
<h2>My View</h2>
<div>
<p>Task:</p>
<pre>{JSON.stringify(task, null, 2)}</pre>
</div>
<div>
<button onClick={onGetTask}>GET</button>
<div>
</div>
);
};
export default withProcess(MyView);onKillCronTask
ParamĂštres : { taskName }
Permet de kill une task cron souhaitée.
import withProcess from '@@app/withProcess';
const MyView = ({ context, processHandlers }) => {
const onKillTask = () => {
processHandlers.onKillCronTask({ taskName: 'myCronTask' });
};
return (
<div>
<h2>My View</h2>
<div>
<button onClick={onKillTask}>KILL</button>
<div>
</div>
);
};
export default withProcess(MyView);getTaskStatus
ParamĂštres : { taskName, projectId }
Permet de récupérer le status actuel d'une task. projectId est optionnel. Si projectId est passé en paramÚtre, alors la task est recherchée par taskName et projectId.
import { useState } from 'react';
import withProcess from '@@app/withProcess';
const MyView = ({ context, processHandlers }) => {
const [status, setStatus] = useState(null);
const onGetStatus = async () => {
const _status = await processHandlers.getTaskStatus({
projectId: context.projectId,
taskName: 'magicTask',
});
setStatus(_status);
};
return (
<div>
<h2>My View</h2>
<div>
<p>{`Task status: ${status}`}</p>
</div>
<div>
<button onClick={onGetStatus}>GET</button>
<div>
</div>
);
};
export default withProcess(MyView);getTaskStatusCode
ParamĂštres : { taskName, projectId }
Permet de récupérer le statusCode actuel d'une task. projectId est optionnel. Si projectId est passé en paramÚtre, alors la task est recherchée par taskName et projectId.
import { useState } from 'react';
import withProcess from '@@app/withProcess';
const MyView = ({ context, processHandlers }) => {
const [statusCode, setStatusCode] = useState(null);
const onGetStatusCode = async () => {
const _statusCode = await processHandlers.getTaskStatusCode({
projectId: context.projectId,
taskName: 'magicTask',
});
setStatusCode(_statusCode);
};
return (
<div>
<h2>My View</h2>
<div>
<p>{`Task status code: ${statusCode}`}</p>
</div>
<div>
<button onClick={onGetStatusCode}>GET</button>
<div>
</div>
);
};
export default withProcess(MyView);Task subscription
Exemple d'implémentation d'une souscription à l'état d'une task dans une vue :
import withProcess from '@@app/withProcess';
import { useTaskUpdateSubscription } from '@@viewCommonHooks/useTaskUpdateSubscription';
const MyView = ({ context, processHandlers }) => {
const { outputValue, errorValue } = useTaskUpdateSubscription({
taskName: 'magicTask',
projectId: context.projectId,
});
const onRunTask = () => {
processHandlers.onRunTask({
projectId: context.projectId,
taskName: 'magicTask'
});
};
return (
<div>
<h2>My View</h2>
<div>
<p>Task subscription:</p>
<pre>{JSON.stringify(outputValue, null, 2)}</pre>
<pre>{JSON.stringify(errorValue, null, 2)}</pre>
</div>
<div>
<button onClick={onRunTask}>RUN</button>
<div>
</div>
);
};
export default withProcess(MyView);