lumnik. / scénarios Tous les scénarios · English

Micronaut: les pièces du magasin lues en trois requêtes

Objectif Lire toutes les pièces détachées d'un service Micronaut par son API, même quand le magasin y travaille.

Un vrai Micronaut 4.7 et 130 pièces fictives, rendues par la Page du repository.

manifests/lab-docker-compose.yml
# A hand-written Micronaut 4 controller returning the repository's Page, Micronaut Data JDBC on H2.name: lumnik-micronaut-partsservices:  parts:    build: ../run/parts-app    ports: ["127.0.0.1:${PARTS_PORT:-9380}:8080"]   # this machine only
manifests/10-parts.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-micronaut-a  connector_type: rest-generic  scopes: [magasin]spec:  base_url: http://host.docker.internal:9380  endpoints:    - id: parts      path: /parts      method: GET      pagination: { kind: micronaut, size: 50 }        # ?page=0&size=50, reads $.content, checks $.totalSize      target:        kind: hybrid        table: ext.scenario_micronaut_a        unique_key: $.ref        promote:          - { name: label, path: $.label, type: text }          - { name: supplier, path: $.supplier, type: text }          - { name: stock, path: $.stock, type: integer }
manifests/20-parts-watched.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-micronaut-watched-a  connector_type: rest-generic  scopes: [magasin]spec:  base_url: http://host.docker.internal:9380  default_rate_limit: 1/s                              # a gentle reader: fourteen pages take fourteen seconds  endpoints:    - id: parts      path: /parts      method: GET      pagination: { kind: micronaut, size: 10 }      target:        kind: hybrid        table: ext.scenario_micronaut_watched_a        unique_key: $.ref        promote:          - { name: label, path: $.label, type: text }          - { name: supplier, path: $.supplier, type: text }          - { name: stock, path: $.stock, type: integer }

Limites

  • Micronaut sert au plus 100 lignes par page: une size plus grande est réduite sans le dire. Déclarer une size de 100 ou moins.
  • Une pièce supprimée reste dans la table du hub: une lecture complète ajoute et met à jour, elle n'efface pas.
  • La relecture compte deux fois les lignes lues deux fois dans IN; l'upsert n'en garde qu'une.
  • 130 pièces fictives, écrites au démarrage du service.

Magasin · pièces

Les pièces sont dans un service Micronaut.

Il faut toutes les lire, par son API.

Micronaut 4.7, 130 pièces

Le problème

L'API rend la liste par pages.

  • Une Page de Micronaut Data.
  • Le magasin travaille pendant la lecture.

Ce qui n'est pas modifié

Le service reste tel quel.

  • Son contrôleur rend la Page telle quelle.
  • Aucun module, aucun réglage.

Le piège

Micronaut 4 ne donne pas le nombre de pages.

  • Chaque page porte totalSize: 130.
  • totalPages est absent.

Ce qu'il a fallu écrire

pagination: { kind: micronaut, size: 50 }

Une ligne.

  • Le hub s'arrête quand il a lu totalSize.
  • Trois requêtes pour 130 pièces.
  • Un connecteur de 22 lignes.

Pendant la lecture

Une pièce supprimée: la liste est relue.

  • Le total passe de 130 à 129.
  • Les 129 restantes sont toutes là.

Ce qui a été corrigé

Deux trous trouvés, deux corrections.

  • Le total vérifié sur chaque page (#1796).
  • Plus de page vide en fin de lecture (#1800).

Essayer

Le scénario se rejoue en local.

Chaque étape est publiée avec sa sortie.

Ce scénario tourne sur lumnik Open, gratuit et open source.

Essayer lumnik Open →