> ## Documentation Index
> Fetch the complete documentation index at: https://docs.plato.ae/llms.txt
> Use this file to discover all available pages before exploring further.

# File d'attente et Redis

> Files d'attente BullMQ, isolation de l'imprimante, persistance et modes Redis.

# 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:

```txt theme={null}
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 :

```txt theme={null}
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 :

```json theme={null}
{
  "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é :

```txt theme={null}
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é :

```txt theme={null}
--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 :

```json theme={null}
{
  "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.
