File d'attente
Une file FIFO durable avec visibilité différée, reprises automatiques et état de lettres mortes, via le SDK loopback à /__bext/sdk/queue/*. Un worker enregistré est simplement une route HTTP à laquelle bext envoie chaque message par POST — ici /api/queue/jobs, qui met le texte en majuscules & l'inverse et écrit le résultat dans le KV. Cette page interroge un endpoint de statut JSON (~1,2s) pour mettre à jour les compteurs et le tableau des résultats en place, et notifier chaque job terminé — sans rechargement.
Astuce
Un message qui dépasse maxAttempts atterrit dans la dead-letter queue (DLQ) — il ne bloque pas le reste. Consultez /__bext/sdk/queue/dead/list pour inspecter les messages morts et les rejouer avec /dead/retry.
Profondeur de la file
0
en attente
0
en cours
0
morts
0
résultats
Mettre un travail en file
Résultats traités (0)
| entrée | sortie | tentatives | traité |
|---|---|---|---|
rien de traité — poussez un job ci-dessus. | |||
// src/app/api/queue/status/route.ts — JSON snapshot the page polls:
export async function GET() {
const stats = await queueStats(APP, "demo-jobs");
const results = await kvEntries(APP, "result:", 12);
return Response.json({ stats, results });
}
// page client — poll every 1.2s, update DOM + toast completed jobs:
var seen = {};
setInterval(async function () {
var d = await (await fetch("/api/queue/status")).json();
renderStats(d.stats);
renderResults(d.results);
d.results.forEach(function (r) {
if (!seen[r.id]) { seen[r.id] = true; bextToast("done: " + r.output, "success"); }
});
}, 1200);
// pushing a job is a fetch (no reload); the next poll shows it complete:
form.addEventListener("submit", async function (ev) {
ev.preventDefault();
await fetch(location.pathname, {
method: "POST",
body: new FormData(form),
headers: { accept: "application/json" },
});
bextToast("job queued", "info");
});