Manipuler les tâches
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.
Documentation OIP Core sur les tâches ici
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 :
import { getPubSub } from '@fasstech/oip-starter-utils/server';
const magicCallback = async ({ taskHandler }) => {
const { updateState } = taskHandler;
// 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;
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: getPubSub() // required for task subscription
};Gestion des tâches depuis les vues
La gestion des tâches dans les vues est possible grâce aux handlers exposés par processHandlers récupéré grâce au hook useProcess
Se référer à ce chapitre pour l'utilisation des handlers liés à la gestion des tâches.
Comment passer de la metadata lors de l'exécution d'une tâche
Depuis un composant d'une vue, vous pouvez passer en paramètre un objet metadata au handler onRunTask :
import { useProcess } from '@fasstech/oip-starter-utils/app';
const Demo = () => {
const { context, processHandlers } = useProcess();
const onRunTask = () => {
processHandlers.onRunTask({
taskName: 'magicTask',
// task metadata
metadata: { something: 'That\'s all Folks!' }
});
};
return (
<div>
<h2>DEMO</h2>
<button onClick={onRunTask}>RUN TASK</button>
</div>
);
};
export default Demo;La callback de la tâche reçoit alors en paramètre taskHandler et metadata (si elle existe). Dans votre logique de la callback, vous pouvez :
- utiliser cette metadata dans la logique du corps de la callback comme variable
- enregistrer un objet metadata lors de la mise à jour de l'état de la tâche
Exemple :
const magicCallback = async ({ metadata, taskHandler }) => {
const { updateState } = taskHandler;
// some logic ..
// state update
updateState({
state: {
status: 'SOMETHING',
statusCode: 42,
// save metadata
metadata: {
...metadata,
somethingElse: 'Looney Tunes'
}
}
});
}Si metadata est défini lors de l'appel à updateState dans la callback de la tâche, alors metadata fera partie de la réponse de l'appel au handler onGetTask (appelé depuis le composant d'une vue) cf. onGetTask
Task subscription
Exemple d'implémentation d'une souscription à l'état d'une tâche depuis une vue :
- importer le hook useSubscription depuis views/_common/client
- importer la query TaskSubscription depuis views/_common/client
import { useProcess } from '@fasstech/oip-starter-utils/app';
import { TaskSubscription } from '@@views/_common/client/graphql/subscriptions/TaskSubscription.js';
import { useSubscription } from '@@views/_common/client/hooks/useSubscription';
const Demo = () => {
const { context, processHandlers } = useProcess();
// task subscription
const { data, error } = useSubscription(TaskSubscription, {
projectId: context.projectId,
taskName: 'magicTask'
});
// trigger task exec
const onRunTask = () => {
processHandlers.onRunTask({ taskName: 'magicTask' });
};
return (
<div>
<h2>DEMO</h2>
<div>
<p>Task subscription:</p>
<pre>{JSON.stringify(data, null, 2)}</pre>
<pre>{JSON.stringify(error, null, 2)}</pre>
</div>
<div>
<button onClick={onRunTask}>RUN TASK</button>
<div>
</div>
);
};