Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Plateformes réactives et architectures modulaires Java Discussion :

[Apache Camel] Gestion d'erreur d'un producer SFTP


Sujet :

Plateformes réactives et architectures modulaires Java

  1. #1
    Membre régulier
    [Apache Camel] Gestion d'erreur d'un producer SFTP
    Bonjour,

    J'aimerais mettre en place une règle de gestion d'erreur du SFTP lors de tentatives infructueuses de connection.

    J'ai un From(File:....).To (Sftp:..........)

    quel serait la meilleur façon de faire afin de gérer les erreurs de connection.
    From(File) a un Delay de 1 Heure;
    lors d'un dépot d'un fichier, il est consommé (dans le timing du Delay) et est envoyé vers le To.

    Le sftp tente de se connecter au serveur à distance, et imaginons qu'il n'est pas joignable....une exception est levée.
    J'aurais voulu, qu'il tente 3 fois et puis qu'un mail soit envoyé à l'équipe technique. Puis ne fais plus rien. Mais dans 1 Heure le From va re-consommer le fichier ce qui est normal et re faire la tentative (ce qui est bien ce que je veux.).

    Tant qu'il n'a pas réussi à ce connecter le fichier ne doit pas être consommé.

    Mon souci, c'est juste le re-connect 3 fois puis mail, puis stop les tentatives de re-connection.


    avez vous des pistes ?
    je pensais a un PollerConsumerStrategy (mais est ce bon pour un Producer) ?

  2. #2
    Expert éminent
    bonjour

    pour ce qui est de la gestion des erreur tu as onexception
    http://camel.apache.org/exception-clause.html
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    onException(IOException.class).maximumRedeliveries(3);
     
    onException(OrderFailedException.class).maximumRedeliveries(2);

    tu peux mettre autant de gestionnaire que d'exception que tu veux traité différemment.
    tu peux aussi redirigé le flux vers ce que tu veux
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    onException(FileNotFoundException.class).handled(true).to("log:nofile");


    je te conseille aussi de mettre en place le onCompletion
    http://camel.apache.org/oncompletion.html
    ce complément de route est invoqué lorsque la route est fini.

    personnellement toute mes route sont baties ainsi
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    from("direct:start")
        .interceptFrom()
            .to("log:message recu")
        .end()
        .onCompletion(). onCompleteOnly()
            .to("log:Route terminée")
            .to("mock:ok")
        .end()
        .onCompletion().onFailureOnly()
            .to("log:Route terminée avec erreur")
            .to("mock:ko")
        .end()
        .onException(FileNotFoundException.class).handled(true).to("log:nofile");
     
        // here the original route
        .process(new MyProcessor())
        .to("mock:result");


    mon intercept from ajoute des headers il génère un id unique en plus de celui de camel et trace l'arrivée de chaque message.

    le on completion complete only trace la remise du message
    le on exception et le onfailure tracent l'erreur et placent le message dans une file JMS d'erreur.

    ainsi il me sufit de déplacer le message de la file d'erreur vers une file d'entrée pour le rejouer.

    c'est la que l'ID généré entre en jeux l'intercept from ne regénère pas de nouvel id

    ainsi je peux suivre un message dans tous les échanges même s'il passe par plusieurs route ou s'il est rejoué plusieurs fois.

    j'ajoute aussi un header qui compte le nomdre de route traversée.
    cela permet à l'exploitant de savoir si on message à été rejouté pluisuers fois sans succés.

    pour généraliser la création des route (oncompletion onException interceptFrom)
    j'ai dérivé camel.RouteBuilder et toute mes routes utilisent de mon prorpre RouteBuilder.

    j'ai donc un système homogène.

    A+JYT

  3. #3
    Membre régulier
    Bonjour sekaijin,

    très interessant, j'ai mis en pratique le OnException comme suit:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    from(file:toto&delay=1H&initialDelay=15000)
      .onException(GenericFileOperationFailedException.class)
           .process(errorMailProcessor)
           .setHeader("subject",constant(technicalSubject))
           .to(smtpTechnicalSupport)
           .log(LoggingLevel.INFO, "a technical email has been sent ...")
           .stop()
           .end()
      .routeId(routeID + ".Receiver")
      .setHeader("flowname", constant(routeID))
      .to(sftp://sdfsdfsdfsdfs?consumer.delay=10M);


    mais dès qu'il y a une erreur du coté SFTP (exemple serveur indisponible), je reçoit toujours toutes les +- 2 minutes le mail...

    aurais-je oublié quelque chose ? afin de n'avoir qu'un mail toutes les 1 heure de mon from ? voir 10 minutes de mon SFTP (peut être tentative de retry)


    En sachant que le SFTP une fois l'exception levée fait un rollback de mon fichier et le laisse dans le répertoire, chose normale (et dont je veux garder) comme ça 1 heure après il retente le même fichier.

    merci

  4. #4
    Expert éminent
    regarde dans la doc du côté des maximumRedeliveries

    onException(IOException.class).maximumRedeliveries(3);

    A+JYT

  5. #5
    Membre régulier
    Citation Envoyé par sekaijin Voir le message
    regarde dans la doc du côté des maximumRedeliveries

    onException(IOException.class).maximumRedeliveries(3);

    A+JYT
    merci :-)