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);