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

Spring Slice: un article supprimé pendant la lecture n'est sur aucune page

Objectif Lire tous les articles d'un catalogue Spring Boot par son API, et savoir quand un article peut manquer.

Un contrôleur Spring Boot qui rend la Slice du repository, et 130 articles.

manifests/lab-docker-compose.yml
# A hand-written Spring Boot 3.4 controller returning the repository's Slice (and its Page, for comparison).name: lumnik-spring-sliceservices:  catalog:    build: ../run/catalog-app    ports: ["127.0.0.1:${CATALOG_PORT:-9370}:8080"]   # this machine only
manifests/10-articles.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-slice-a  connector_type: rest-generic  scopes: [catalogue]spec:  base_url: http://host.docker.internal:9370  endpoints:    - id: articles      path: /api/articles/slice      method: GET      pagination: { kind: spring-slice }                    # ?page=0&size=50, reads $.content, stops on $.last      target:        kind: hybrid        table: ext.scenario_slice_a        unique_key: $.ref        promote:          - { name: label, path: $.label, type: text }          - { name: family, path: $.family, type: text }
manifests/20-articles-5000.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-slice-big-a  connector_type: rest-generic  scopes: [catalogue]spec:  base_url: http://host.docker.internal:9370  endpoints:    - id: articles      path: /api/articles/slice      method: GET      pagination: { kind: spring-slice, size: 5000 }        # Spring Data caps a page at 2000      target:        kind: hybrid        table: ext.scenario_slice_big_a        unique_key: $.ref        promote:          - { name: label, path: $.label, type: text }          - { name: family, path: $.family, type: text }
manifests/30-articles-watched.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-slice-watched-a  connector_type: rest-generic  scopes: [catalogue]spec:  base_url: http://host.docker.internal:9370  default_rate_limit: 1/s                              # a gentle reader: fourteen pages take fourteen seconds  endpoints:    - id: articles      path: /api/articles/slice      method: GET      pagination: { kind: spring-slice, size: 10 }      target:        kind: hybrid        table: ext.scenario_slice_watched_a        unique_key: $.ref        promote:          - { name: label, path: $.label, type: text }          - { name: family, path: $.family, type: text }
manifests/40-articles-page-watched.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-slice-page-a  connector_type: rest-generic  scopes: [catalogue]spec:  base_url: http://host.docker.internal:9370  default_rate_limit: 1/s                              # a gentle reader: fourteen pages take fourteen seconds  endpoints:    - id: articles      path: /api/articles      method: GET      pagination: { kind: spring-page, size: 10 }                # checks $.totalElements on every page (#1796)      target:        kind: hybrid        table: ext.scenario_slice_page_a        unique_key: $.ref        promote:          - { name: label, path: $.label, type: text }          - { name: family, path: $.family, type: text }

Limites

  • Une Slice ne donne aucun total: lumnik ne peut pas voir un article perdu pendant la lecture.
  • Un article supprimé reste dans la table du hub: une lecture complète ajoute et met à jour, elle n'efface pas.
  • 130 articles fictifs.

Catalogue · articles

Les articles sont dans un service Spring Boot.

Il faut tous les lire par son API.

Spring Boot 3.4, 130 articles

Le problème

L'API rend une Slice.

  • Pas de comptage sur une grosse table.
  • Seulement: y a-t-il une page suivante?

Ce qui n'est pas modifié

Le service reste tel quel.

  • Son API, en lecture.
  • Aucun module, aucun réglage.

Ce qu'il a fallu écrire

pagination: { kind: spring-slice }

Une ligne.

  • Le hub s'arrête sur $.last.
  • Un connecteur de 21 lignes.

Le plafond de Spring

5000 demandés, 2000 servis.

  • Spring coupe la page sans le dire.
  • La lecture s'arrête sur $.last: 130 sur 130.

Le piège

Une suppression décale les pages.

  • ART-0001 supprimé pendant la lecture.
  • ART-0051 n'est sur aucune page.

La limite

Une Slice ne peut pas le voir.

  • Elle ne donne aucun total.
  • Le run dit Completed, avec un article en moins.

La même suppression sur la Page

Le total bouge: la liste est relue.

  • spring-page vérifie totalElements (#1796).
  • Les 128 restants sont tous là.

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

Essayer lumnik Open →