Comment définir l’expression “Pick” pour la stratégie FlexibleAggregationStrategy d’Apache Camel dans Spring XML?

Je tente de configurer une route Apache Camel dans Spring XML en utilisant Apache Camel 2.14. La route impliquera soit un ou un / ; Je ne suis pas encore assez expérimenté avec Camel pour savoir quel EIP sera le plus utile. De toute façon, je vais avoir besoin d’une aggregationStrategy d’ aggregationStrategy . Mon objective final consiste à créer une route Camel pour un client qui souhaite que les routes soient configurées en XML.

En cherchant sur Internet, j’ai appris l’existence d’une classe Camel appelée FlexibleAggregationStrategy . Les éléments que j’ai trouvés, et je cite, “Cela vous permet de créer rapidement une AggregationStrategy capable d’effectuer les tâches d’agrégation les plus courantes, avec un code Java nul”. Cela me semble utile, car nous voulons autant de configuration en XML que possible. En tant que tel, il serait intéressant d’éviter d’écrire ma propre AggregationStrategy en Java. Le problème est que je ne peux pas comprendre comment utiliser FlexibleAggregationStrategy .

D’après ce que je peux dire, le FlexibleAggregationStrategy sélectionne les éléments des messages à agréger à l’aide d’une Expression appelée pickExpression et filtre les messages correspondant à la conditionPredicate Predicate . Donc, je suppose que je dois avoir un moyen de définir ces valeurs dans mon XML Spring. Malheureusement, je n’ai pas pu obtenir les blocs de code suivants:

Nom de propriété défini sur pickExpression , valeur en tant qu’élément:

    //ID    

Nom de propriété défini pour pick , valeur comme élément:

    //ID    

Nom de propriété défini sur pickExpression , valeur en tant qu’atsortingbut:

    

Nom de propriété défini pour pick , valeur comme atsortingbut:

    

A chaque fois, je reçois une erreur pour me plaindre de ne pouvoir trouver le descripteur de propriété avec le nom que je lui donne. La raison pour laquelle j’essaie à la fois pick et pickExpression est que, dans ce qui semble être le code source de FlexibleAggregationStrategy , la variable contenant l’expression pick dans la classe s’appelle pickExpression , mais la méthode pour la définir s’appelle simplement pick() .

Je n’ai pas une parfaite compréhension de XML XML, mais d’après ce que je sais, l’utilisation de la pour définir une valeur de variable nécessite que le bean ait des getters et des setters pour cette variable. Étant donné que FlexibleAggregationStrategy n’a pas de getters et de setters pour pickExpression , je ne suis pas du tout pickExpression . Cependant, si je lis correctement la définition de schéma XML pour la , la seule façon d’envoyer des informations à un bean est d’utiliser la ou les parameters du constructeur. Étant donné que FlexibleAggregationStrategy ne possède aucun constructeur qui définit pickExpression , je n’ai pas trouvé de moyen de configurer un FlexibleAggregationStrategy sans écrire de code Java.

J’ai trouvé des références à quelque chose appelé “injection de méthode” qui pourrait me permettre de configurer une FlexibleAggregationStrategy . Cependant, les seules instructions que j’ai trouvées impliquent l’écriture d’un bean en Java. En tant que telle, cette technique implique également l’écriture de code Java; De plus, il semble que ce serait plus rapide et plus direct de simplement écrire ma propre AggregationStrategy .

À ce jour, ni l’ancienne ni la nouvelle page Wiki d’Apache Camel documentant le motif ne mentionne pas du tout la méthode FlexibleAggregationStrategy .

J’ai tenté une recherche Google sur le terme FlexibleAggregationStrategy pour voir si quelqu’un avait écrit des didacticiels ou de la documentation sur l’utilisation de FlexibleAggregationStrategy . A ce jour, les deux premiers résultats Google que je reçois sont des fichiers Javadoc générés automatiquement pour la classe FlexibleAggregationStrategy . Le troisième résultat est le code source hébergé par github que j’ai lié ci-dessus. Le quasortingème résultat est une autre question sur ce sujet que j’ai posté; cette question était fermée car je ne comprenais pas comment écrire correctement les questions StackOverflow. Le cinquième résultat est le code source hébergé sur grepcode.com. Le sixième résultat est le Javadoc pour une interface que je ne comprends pas. Le septième résultat est une question que quelqu’un d’autre a posée sur grokbase.com. la question n’a pas de réponse. Le huitième résultat est une question que quelqu’un d’autre a posée sur qnalist.com et qui n’a pas de réponse. Le neuvième résultat semble provenir d’une liste de diffusion impliquant la validation du code source de la classe FlexibleAggregationStrategy . Le dixième résultat est la question de grokbase publiée sur osdir.com. Des recherches similaires renvoient surtout les mêmes résultats; les autres nouveaux résultats que je trouve sont tout aussi inutiles. Je pense que si quelqu’un avait écrit un bon guide pour l’utilisation de FlexibleAggregationStrategy , il apparaîtrait dans ces recherches.

Y a-t-il quelqu’un qui a utilisé FlexibleAggregationStrategy qui peut me dire comment définir les pickExpression et conditionPredicate pour pouvoir utiliser une stratégie FlexibleAggregationStrategy ? Si vous avez besoin de quelque chose d’autre que je devrais le configurer, ou de tout autre piège courant, il serait également apprécié.

Merci pour votre temps.

En regardant le javadoc, je dirais que cette classe n’est pas compatible avec XML-DSL et qu’elle est destinée à être utilisée avec le Java-DSL courant de Camel. Vous n’avez pas de chance si vous voulez l’utiliser avec Spring-DSL.

Votre cas d’utilisation peut être plus facilement implémenté en transformant le corps de résultat dans l’itinéraire d’enrichissement à l’aide de votre expression xpath, puis en l’agrégeant avec UseLatestAggregationStrategy, qui fait essentiellement de l’échange d’enrichissement le résultat de l’agrégation:

   ...  ...    ...enrichment processing here...  //ID   

J’espère que cela pourra aider.

Le format XML de Spring n’est pas vraiment destiné aux constructeurs fluides, mais vous pouvez le faire. Par exemple, pour reproduire ceci:

 delegateStrategy = new FlexibleAggregationStrategy() .storeInBody() .accumulateInCollection(ArrayList.class) .pick(new SimpleExpression("${header[CamelFileName]}")); 

exigerait ce XML:

             

Comme vous le voyez, ce n’est pas très concis et nécessite de créer un certain nombre de beans intermédiaires, mais c’est possible.

Toutefois, si vous n’êtes pas limité à zéro Java personnalisé, vous pouvez créer votre propre AggregationStrategy qui délègue à une FlexibleAggregationStrategy et l’utiliser dans votre XML.

Portion Java:

 public class FileNameListAggregationStrategy implements AggregationStrategy { private CompletionAwareAggregationStrategy delegateStrategy; public FileNameListAggregationStrategy() { delegateStrategy = new FlexibleAggregationStrategy() .storeInBody() .accumulateInCollection(ArrayList.class) .pick(new SimpleExpression("${header[CamelFileName]}")); } @Override public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { return delegateStrategy.aggregate(oldExchange, newExchange); } } 

Portion XML: