Passer au contenu principal

File d’attente et Redis

Le pilote utilise Redis et BullMQ afin que les tâches d’impression survivent aux erreurs de processus et aux pannes d’imprimante.

Files d’attente par imprimante

Chaque ip_address:port unique reçoit un PrinterStore dédié. Par exemple:
192.168.1.50:9100 -> pc-printer_192_168_1_50_9100
192.168.1.51:9100 -> pc-printer_192_168_1_51_9100
Chaque magasin possède :
  • Une file d’attente BullMQ.
  • Un travailleur BullMQ.
  • Un écouteur d’événements de file d’attente.
  • Un cache d’état de l’imprimante.
  • Un contrôleur de cycle de vie de socket.
La simultanéité des travailleurs est 1, donc une imprimante ne reçoit jamais deux tâches en même temps. Différentes imprimantes peuvent traiter en parallèle car chaque imprimante a son propre opérateur.

Registre des imprimantes

Les imprimantes connues sont stockées dans l’ensemble Redis :
pc-printer:printers
Au démarrage, restorePersistedStores() lit l’ensemble, recrée les magasins et réessaye les tâches ayant échoué.

Comportement de nouvelle tentative

Options de file d’attente par défaut :
{
  "attempts": 2147483647,
  "backoff": {
    "type": "fixed",
    "delay": 5000
  },
  "removeOnComplete": true,
  "removeOnFail": false
}
Cela signifie:
  • Les tâches terminées sont supprimées.
  • Les tâches ayant échoué sont conservées.
  • Les tâches ayant échoué, réessayez avec un délai d’attente fixe.
  • Le maxAttempts par défaut réessaye effectivement pour toujours.

Travaux planifiés

POST /print accepte runAt. Si runAt est dans le futur, le pilote ajoute le travail avec un délai BullMQ. Si une tâche retardée a été créée pour une planification future, la logique de récupération ne la favorise pas plus tôt. Formulaires runAt acceptés :
  • Numéro d’horodatage en millisecondes.
  • Chaîne numérique.
  • Chaîne de date que Date.parse() peut analyser.

Statut de la file d’attente

GET /queue-status regroupe tous les magasins connus :
  • waiting
  • active
  • delayed
  • failed
  • completed
  • totalPending
  • isProcessing
totalPending est waiting + delayed dans tous les magasins.

Redis intégré

Le mode intégré démarre de Redis à redis-memory-server. Sous Windows, le pilote vérifie ou télécharge le binaire Redis demandé :
redis-binaries/<version>/Redis-<version>-Windows-x64-msys2/redis-server.exe
La version actuelle de Redis est vérifiée après le démarrage. Si la version détectée n’est pas égale à config.redis.version, le démarrage est interrompu.

Synchronisation de disque

Lorsque redis.diskSync est vrai, Redis démarre avec les paramètres d’instantané :
--save <snapshotIntervalSec> 1
--appendonly no
--dir <app-root>
--dbfilename dump.rdb
Lors d’un arrêt progressif, le pilote tente un Redis SAVE. Utilisez la synchronisation de disque lorsque vous avez besoin de files d’attente et d’imprimantes connues pour survivre aux redémarrages.

Externe Redis

Le mode externe ne démarre ni n’arrête Redis. Le pilote utilise :
{
  "mode": "external",
  "host": "127.0.0.1",
  "port": 6379,
  "db": 0,
  "username": "",
  "password": ""
}
Utilisez Redis externe lorsqu’un magasin a déjà géré Redis ou lorsque plusieurs processus de pilote nécessitent un état de file d’attente partagé. Évitez de pointer deux pilotes actifs vers les mêmes imprimantes physiques, sauf si le modèle opérationnel est explicite.