2012-07-26 4 views
3

J'essaye de construire une route qui essaie de valider un xml et si tout est correct, alors il faut scinder ce fichier sinon une exception est levée et il doit faire autre chose. Donc, je l'ai fait ce qui suit:Camel - Split() et doCatch (....) ne fonctionne pas

from("file:"+fileOutboxTransformed+"?preMove=inprogress&move="+backupFolderTransformed+"/"+labelMessageType+"_${date:now:yyyyMMddHHmmssSSS}-${file:name.noext}.${file:ext}") 
    .log(LoggingLevel.INFO, "Got transformed file and sending it to jms queue: "+queue) 
    .doTry() 
     .to("validator:classpath:"+validator) 
     .split(xPathMessageTypeSplit) 
     .to("jms:"+queue+"?jmsMessageType=Text") 
    .doCatch(ValidationException.class) 
     .log(LoggingLevel.INFO, "Validation Exception for message ${body}") 
     .to("xslt:classpath:"+transformationsErrorAfter) 
     .split(xPathNotificationSplit) 
     .to("file:"+fileOutboxInvalid+"?fileName=${file:name.noext}-${date:now:yyyyMMddHHmmssSSS}.err2") 
    .end(); 

Mais il ne compile pas (si je ne me le partage alors il compile et fonctionne) et l'erreur est:

The method doCatch(Class<ValidationException>) is undefined for the type ExpressionNode 

J'ai donc essayé le

suivant
from("file:"+fileOutboxTransformed+"?preMove=inprogress&move="+backupFolderTransformed+"/"+labelMessageType+"_${date:now:yyyyMMddHHmmssSSS}-${file:name.noext}.${file:ext}") 
    .log(LoggingLevel.INFO, "Got transformed file and sending it to jms queue: "+queue) 
    .doTry() 
     .to("direct:validate") 
    .doCatch(ValidationException.class) 
     .log(LoggingLevel.INFO, "Validation Exception for message ${body}") 
     .to("xslt:classpath:"+transformationsErrorAfter) 
     .split(xPathNotificationSplit) 
     .to("file:"+fileOutboxInvalid+"?fileName=${file:name.noext}-${date:now:yyyyMMddHHmmssSSS}.err2") 
    .end(); 

    from("direct:validate") 
     .to("validator:classpath:"+validator) 
     .to("direct:split_message"); 

    from("direct:split_message") 
     .split(xPathMessageTypeSplit) 
     .to("jms:"+queue+"?jmsMessageType=Text"); 

Cette fois, je reçois l'erreur de point final en double

org.apache.camel.FailedToStartRouteException: Failed to start route route312 because of Multiple consumers for the same endpoint is not allowed: Endpoint[direct://validate] 

avez-vous une idée sur la façon de résoudre ce problème?

+0

Qu'est-ce qui se passe si vous mettez '.end()' 'juste avant le .doCatch'? –

Répondre

1

Votre deuxième essai semble bien. L'erreur que vous obtenez est causée par deux routes commençant par from("direct:validate") N'avez-vous pas un autre itinéraire dans votre application consommant du même point de terminaison?

Edit: Essayez de nommer différemment, existe valider peut-être déjà (dans votre application ou à l'intérieur de chameau)

+0

non .. de ("direct: valider") est le seul que j'ai dans la route – ddelizia

+0

Peut-être essayer de le nommer différemment, juste pour voir – cexbrayat

+0

J'ai essayé avec un autre nom, mais j'ai la même erreur – ddelizia

5

Pour revenir au bloc bloc d'une scission() doTry() (ou choix ou autre type imbriqué), vous devez utiliser endDoTry(). Contrairement à son nom, cette méthode mettra fin au bloc scindé imbriqué et retournera à la DSL doTry().

j'utiliser la première route que vous avez affichée avec ces changements:

from("file:"+fileOutboxTransformed+"?preMove=inprogress&move="+backupFolderTransformed+"/"+labelMessageType+"_${date:now:yyyyMMddHHmmssSSS}-${file:name.noext}.${file:ext}") 
    .log(LoggingLevel.INFO, "Got transformed file and sending it to jms queue: "+queue) 
    .doTry() 
     .to("validator:classpath:"+validator) 
     .split(xPathMessageTypeSplit) 
      .to("jms:"+queue+"?jmsMessageType=Text") 
     .endDoTry() 
    .doCatch(ValidationException.class) 
     .log(LoggingLevel.INFO, "Validation Exception for message ${body}") 
     .to("xslt:classpath:"+transformationsErrorAfter) 
     .split(xPathNotificationSplit) 
      .to("file:"+fileOutboxInvalid+"?fileName=${file:name.noext}-${date:now:yyyyMMddHHmmssSSS}.err2") 
     .endDoTry() 
    .end();