Bonjour.
j'utilise apache camel pour injecter des données dans une base mongoDB
le fonctionnement est très simple
camel définit des routes.
les données arrivent en entrée par un canal (quelconque) sont converties automatiquement si besoin est sont envoyé à une ou plusieurs sorties
ma route est la suivante
pour ceux qui ne connaissent pas camel
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <cl:route id="mongo-http-insert"> <cl:from uri="jetty:http://0.0.0.0:9090/myapp/mongoInsert?httpMethodRestrict=POST"/> <cl:setHeader headerName="CamelHttpMethod"><cl:constant>POST</cl:constant></cl:setHeader> <cl:setHeader headerName="CamelMongoDbUpsert"><cl:constant>true</cl:constant></cl:setHeader> <cl:to uri="mongodb:myDb?database=suivi&collection=testData&writeResultAsHeader=true&writeConcern=SAFE&operation=save" /> <cl:to uri="log:Insert" /> <cl:setBody><cl:simple>${header.CamelMongoOid}</cl:simple></cl:setBody> <cl:to uri="mongodb:myDb?database=suivi&collection=testData&writeResultAsHeader=true&writeConcern=SAFE&operation=findById" /> <cl:setHeader headerName="Content-Type"><cl:constant>application/json</cl:constant></cl:setHeader> </cl:route>
je suis à l'écoute de http://0.0.0.0:9090/myapp/mongoInsert uniquement en POST
j'indique que j'accepte le mode insert or update
et l'envoi à mongoDB
le point important operation=save qui assure le insert or update.
pour que cela fonctionne il faut mettre dans le corp du POST un paquet JSON
vu que c'est du HTTP c'est obligatoirement du texte.
l'étape suivante et de logger l'échange histoire d'en garder la trace.
lorsque les données sont insérées j'ai dans un header associé à mon échange l'OID généré par la base.
Je remplace le JSON de l'échange par l'OID et j'envois une recherche à la base. operation=findById
cela me retourne un paquet JSON qui est ce qui a été inséré dans la base.
je fixe le header HTTP pour dire que la réponse est en JSON
voici ce que j'obtiens: envoiretour
Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 { "cool": "MongoDb", "name": "Sekaijin" }Jusque là c'est magique. comme je suis en insert or update je dois pouvoir mettre à jour mes données
Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 { "_id": { "$oid": "5798b871cfa9d41d40b73994" }, "cool": "MongoDb", "name": "Sekaijin" }
j'envoi doncMongoDb=>MongoDB
Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 { "_id": { "$oid": "5798b871cfa9d41d40b73994" }, "cool": "MongoDB", "name": "Sekaijin" }
et là ça plante. la raison est que BSON ne sait pas décoder "$oid"J'ai donc regardé plusieurs cas avec $.
comme $currentDatedès qu'il y a $ j'ai un message du type
Invalid BSON field name $oid.
si je mets $oid sans les quote vu qu'il fait un (DBObject)JSON.parse (..) il plante sur le JSON.parse.
c'est pire avec ObjectId("5798e5bfcfa9d4180ce9a0aa").
comment représenter l'ID pour qu'il fasse un update ?
comment représenter une date pour qu'il y ait dans la base une date et pas un string ou un NumberLong("1469637143762").
A+JYT
PS: je n'ai aucune ligne de code (Java) je place le xml dans un fichier blueprint(spring like) dans karaf. ça fonctionne sans rien d'autre.
J'ai trouvé sur le net le convertisseur camel qui assure la transformation
https://github.com/apache/camel/blob...onverters.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 @Converter public static DBObject fromStringToDBObject(String s) { DBObject answer = null; try { answer = (DBObject) JSON.parse(s); } catch (Exception e) { LOG.warn("String -> DBObject conversion selected, but the following exception occurred. Returning null.", e); } return answer; }
Partager