Skip to main content
Vous êtes passé par les premières vérifications et la raison de refus est maxAttempts. C’est la seule valeur qui signifie réellement routage.

Le log nomme la cause

Chacune de ces lignes est en WARN ou ERROR et n’a besoin d’aucun drapeau de debug.
routing.rule.broken est journalisé une fois par règle, pas une fois par message, et le compteur ne se remet à zéro que lorsqu’une nouvelle table de routage est publiée.Donc après avoir corrigé une règle, guettez que la ligne réapparaisse plutôt qu’elle reste absente — un log silencieux ne prouve rien. routing_rules_broken sur /ops/health est le même fait sous forme de nombre, et c’est la façon fiable de distinguer « corrigé » de « déjà signalé ».

Deux choses à écarter avant d’éditer une règle

Un attrape-tout parfait pointant vers un fournisseur déconnecté ne livre rien et ressemble exactement à un bug de routage.
Répond en mots : « N vendor(s) configured, none bound — nothing can be sent yet. »
Une règle qui en référence un est entièrement ignorée plutôt que chargée avec moins de conditions — parce qu’abandonner des conditions élargirait silencieusement la règle.Cherchez Skipping … filter '…' is missing or disabled. Si cela a vidé la table default, toute la configuration de routage est refusée et vous êtes dans le cas ERROR ci-dessus.

Pourquoi une règle n’a pas correspondu

Six causes, et les deux dernières comptent pour la plupart des surprises :
  • Les règles sont évaluées de haut en bas ; une table NORMAL s’arrête à la première correspondance.
  • Le repli doit être à la fin. Un attrape-tout au-dessus d’autres règles rend tout ce qui le suit inaccessible — la page de routage du panneau avertit dans les deux cas.
  • Les noms d’attribut doivent correspondre à ceux de la référence de routage.
  • Les comparaisons de chaînes distinguent la casse sauf si on utilise equalsIgnoreCase.
  • startsWith compare du texte littéral. Une expression régulière qu’on y écrit ne peut jamais être vraie — utilisez matches. Le panneau avertit ; un fichier édité à la main non.
  • Un champ non défini ne correspond à aucun opérateur positif, à l’exception de isNull. product:equals:premium ne correspond pas à un message ne portant aucun produit — mais product:!equals:premium le fait.

Tracer un message

Réglez outSms.routing.trace sur un seul numéro de série de message ou identifiant de compte. Chaque règle contre laquelle ce message est testé journalise alors quelle condition a échoué et ce que le message contenait réellement :
Cela s’applique en direct — réglez-le pendant l’incident, effacez-le après. Laissé vide, il coûte une lecture volatile par règle.
N’attrapez pas outSms.routing.debug. Il journalise chaque règle de chaque message et rend l’objet message complet pour le faire — trente String.replace enchaînés par ligne — donc il est inutilisable aux débits où les questions de routage se posent réellement. Il n’est utile que sur une passerelle inactive reproduisant un seul envoi.

Les deux nombres de file

Voir aussi

Comment fonctionne le routage

Tables, règles et ordre de résolution.

Rejets du fournisseur

Quand le fournisseur est bindé et refuse chaque submit.