Dans Apache Camel, lors de la création d'une "route", écrivez-la dans Original DSL qui connecte simplement les méthodes préparées. Ce DSL prend également en charge le ** branchement conditionnel ** et la ** boucle **.
Cependant, si vous écrivez selon le guide de style Java, les méthodes qui créent un branchement conditionnel et un traitement interne en boucle auront également la même indentation, ce qui rendra très difficile la lecture en tant que DSL. Par conséquent, on considère que ** il est préférable d'ajouter le retrait par vous-même **.
De plus, il existe plusieurs façons d'écrire d'autres parties, mais je souhaite les unifier du côté qui est facile à lire. J'ai donc résumé les normes de codage que j'ai décidées personnellement. Seules les fonctions que j'ai utilisées peuvent être décidées, donc je les ajouterai ou les modifierai au fur et à mesure que mon expérience augmentera à l'avenir.
RouteBuilder
A propos de la forme de tout l'itinéraire qui en est la base. Seul le contenu de configure ()
est affiché.
from("direct:sample").routeId("MySampleRoute")
// some process
.to("mock:aaa").id("SamplePartA")
.log(LoggingLevel.DEBUG,
"very long text...")
// another process
.to("mock:bbb")
;
Fondamentalement ** Méthode 1 ligne 1 ** (1 processus)
Cependant, la même ligne est recommandée pour ceux qui se qualifient immédiatement avant
Par exemple, ʻid () ʻest la même ligne (pensez à XML DSL)
routeId ()
définit l'ID de la route, donc la même ligne que from ()
, au moins la ligne suivante
Fournissez une ligne vide si vous souhaitez représenter une unité de traitement de groupe
Ajouter deux retraits (*) pour les lignes continues
Conforme au style Java
Indentez 2 étapes même lorsque l'argument de la méthode est cassé
Si l'argument est trop long, envisagez de le couper en une constante
Inversement, seul le début «from ()» apparaît en deux étapes
** Indentation supplémentaire lors de la structuration avec DSL ** (décrit plus loin)
Ending ;
sépare les lignes
Lors de l'ajout du traitement, diff n'apporte pas de modifications inutiles
Retrait 1 étape = 4 espaces (checkstyle) ou 1 tabulation, qui doit être spécifié séparément
Ceux qui créent des branches et des boucles conditionnelles sont fondamentalement «xxx ()» à «end ()». Les règles communes sont les suivantes.
xxx ()
(si elle est plus longue, passez à la ligne suivante et abaissez-la d'un pas)choice Correspond à une instruction switch (break n'est pas obligatoire). Cependant, puisque l'expression conditionnelle est écrite du côté when, SQL et la * déclaration de cas sans expression * qui peut être faite avec Ruby sont meilleures. C'est pareil.
https://camel.apache.org/components/latest/eips/choice-eip.html
from("direct:sample")
.choice()
.when(new MyPredicateA())
.to("mock:aaa")
.when(new MyPredicateB())
.to("mock:bbb")
.otherwise()
.to("mock:zzz")
.end()
;
when ()
et ʻotherwise () `sont abaissés d'une étape, et le traitement interne est abaissé d'une étape.quand ()
quand (). Simple (...)
etc. sont interditsSpécifiez une instance de «Predicate» dans la condition. (Documentation)
header (name)
ou simple (" $ {expr} ")
(ValueBuilder)header (name) .isEqualTo (value)
(PredicateBuilder)filter
Si vous n'avez qu'une seule branche when ()
, envisagez d'utiliser filter ()
au lieu de choice ()
. Le nombre de lignes et de retraits est réduit, ce qui facilite la lecture. Particulièrement utile lors de l'écriture de clauses de garde.
https://camel.apache.org/components/latest/eips/filter-eip.html
Exemple de clause de garde
//Difficile à lire sans clause de garde (* Ceci n'est pas limité au chameau)
from("direct:noGuard")
.choice()
.when(new MyPredicate())
.to("mock:doNothing")
.otherwise()
.to("mock:doSomething1")
.to("mock:doSomething2")
.to("mock:doSomething3")
.end()
;
//Vous pouvez faire une clause de garde avec choix, mais c'est un peu exagéré
from("direct:guardByChoice")
.choice()
.when(new MyPredicate())
.to("mock:doNothing")
.stop()
.end()
.to("mock:doSomething1")
.to("mock:doSomething2")
.to("mock:doSomething3")
;
//Concis avec filtre
from("direct:guardByFilter")
.filter(new MyPredicate())
.to("mock:doNothing")
.stop()
.end()
.to("mock:doSomething1")
.to("mock:doSomething2")
.to("mock:doSomething3")
;
split Correspond à instruction for extended (for-each instruction) et à la méthode forEach. Les listes et les chaînes de caractères sont séparées et emballées individuellement dans un nouvel échange pour traitement.
https://camel.apache.org/components/latest/eips/split-eip.html
from("direct:sample")
.split(body()).parallelProcessing()
.log("content: ${body}")
.to("mock:abc")
.end()
;
split ()
split (). body ()
etc. sont interditsloop, while
Vous pouvez indexer le nombre de boucles (à partir de 0). Utilisez loop ()
pour spécifier le nombre de fois comme l'instruction for, et loopDoWhile ()
pour spécifier la condition comme l'instruction while.
https://camel.apache.org/components/latest/eips/loop-eip.html
from("direct:sample")
.loop(100).copy()
.log("index: ${exchangeProperty[CamelLoopIndex]}")
.to("mock:abc")
.end()
;
try … catch … finally Il existe également une gestion des exceptions.
https://camel.apache.org/manual/latest/try-catch-finally.html
Encore une fois, selon la syntaxe Java, doTry ()
, doCatch ()
, doFinally ()
, ʻend () ʻont le même retrait, et l'intérieur de chacun est abaissé d'une étape.
Exemple: https://github.com/apache/camel/blob/camel-2.25.1/camel-core/src/test/java/org/apache/camel/processor/TryProcessorMultipleExceptionTest.java
TryProcessorMultipleExceptionTest.java
from("direct:start")
.doTry()
.process(new ProcessorFail())
.to("mock:result")
.doCatch(IOException.class, IllegalStateException.class)
.to("mock:catch")
.doFinally()
.to("mock:finally")
.end()
;
La méthode suivante consiste à mettre des données en échange.
setHeader()
setProperty()
setBody()
Il existe deux méthodes, "spécifier par argument" et "spécifier par chaîne de méthodes". Dans la convention, ** unifiez à "spécifier par argument" **. Je pense qu'il est plus facile de comprendre si la seule méthode qui compose l'itinéraire est un processus tel qu'il est.
Il est basé sur la même idée que l'argument est spécifié pour «when ()» et «split ()» dans la structuration.
// disliked
from("direct:dislikedSample")
.setHeader("foo").expression(new MyExpression())
.setProperty("bar").header("foo")
.setBody().exchangeProperty("bar")
;
// preferred
from("direct:preferredSample")
.setHeader("foo", new MyExpression())
.setProperty("bar", header("foo"))
.setBody(exchangeProperty("bar"))
;
Spécifiez une instance de ʻExpression` comme argument. (Documentation)
constant (obj)
header (name)
ou simple (" $ {expr} ")
Cependant, s'il devient compliqué de spécifier l'argument, utilisez une chaîne de méthodes. Dans ce cas, écrivez autant que possible sur la même ligne.
Par exemple, marshal ()
. Il existe également une méthode pour passer une chaîne de caractères comme argument, mais si possible, j'aimerais utiliser une constante préparée pour éviter les fautes de frappe. Ensuite, l'argument sera plus long.
from("direct:marshalSample")
.marshal().json(JsonLibrary.Gson)
.marshal(new JsonDataFormat(JsonLibrary.Gson))
;
Dans la chaîne de caractères de l'argument de log ()
, la même extension d'expression que simple ()
(je ne sais pas si elle est appelée ...) peut être écrite.
https://camel.apache.org/components/latest/languages/simple-language.html
from("direct:loggingSample")
.log("foo :: ${header[foo]}")
.log("bar :: ${exchangeProperty[bar]}")
.log("baz :: ${body}")
;
.name
,: name
, [name]
header
et non headers
lors du référencement d'éléments dans l'en-têteVous pouvez écrire des expressions plus puissantes telles que des appels de méthode, mais les règles détaillées n'ont pas encore été décidées. → https://camel.apache.org/components/latest/languages/ognl-language.html
Parfois, vous pouvez faire quelque chose de similaire de différentes manières. Il est plus lisible de choisir celui qui convient à l'objectif et celui qui est spécialisé à cet effet.
Il existe deux types disponibles. Vous ne devriez pas vous perdre car l'utilisation est différente.
from("direct:start")
.log(LoggingLevel.DEBUG, "org.apache.camel.sample", "any message")
.to("log:org.apache.camel.sample?level=DEBUG&showAll=true&multiline=true")
;
Comme expliqué dans la section sur la structuration. Vous pouvez penser que filter ()
ne peut écrire que la branche d'une instruction if (sans else).
Simple Expression Language peut créer diverses valeurs et expressions conditionnelles en utilisant ** expansion d'expression ** (?). D'autre part, les valeurs normales (ValueBuilder) Il existe également des méthodes qui peuvent être utilisées. Écrire dans une méthode augmente les chances de remarquer une simple erreur au moment de la compilation, mais sans une bonne méthode, elle a tendance à être longue. Celui qui est le plus facile à lire dépend de la situation, c'est donc à titre indicatif seulement.
from("direct:simpleOrValue")
// create same strings
.setHeader("sample1", simple("hoge: ${header[hoge]}"))
.setHeader("sample2", header("hoge").prepend("hoge: "))
// check same conditions
.choice()
.when(simple("${header[CamelSqlRowCount]} != 1"))
.log("record not unique!")
.when(header(SqlConstants.SQL_ROW_COUNT).isNotEqualTo(1))
.log("record not unique!")
.end()
;
Recommended Posts