2016-04-25 6 views
0

Ich habe eine Einstellung wie folgt.Apache Kamel Idempotent Verbraucher Schlüssel Entfernung

Das Problem, das ich habe, ist, dass der Schlüssel aus dem Idempotent Repository nicht entfernt wird, wenn eine Ausnahme ausgelöst wird (in der Zeile unten angegeben) bei Verwendung seda Komponente innerhalb OnException. Wenn ich direct in OnException benutze, wird der Schlüssel aus dem Cache entfernt. Bei beiden Versuchen wird die E-Mail korrekt gesendet.

Meine Abfragen sind:

  1. warum wird der Schlüssel aus dem Repository-Cache nicht, wenn innerhalb der OnException mit seda entfernt werden?
  2. gibt es ein Problem mit der Verwendung von seda innerhalb der OnException? Hier

ist die Routen:

MyRouteClass1

onException(Exception.class) 
    .setHeader("subjectText", simple("failure email!")) 
    .to("seda:notifySupportOnFailure") 
    .end(); 

from("direct:findWorkItems") 
    .bean(someService, "findWorkItems") 
    .split(body()) 
     .throttle(1).timePeriodMillis(5000L) 
     .to("direct:handleWorkItem") 
     .choice().when(header("resultId").isGreaterThan(0)) 
     .bean(someService, "updateWorkItemToHandled") 
     .end(); 

from("direct:handleWorkItem") 
    .idempotentConsumer(simple("${body.workItemId}"), duplicatesRepo) 
    .bean(someService, "handleWorkItem") // e.g. exception would be thrown within here 
    .setHeader("resultId", body()) 
    .end(); 

MyRouteClass2

from("seda:notifySupportOnFailure") 
    .setHeader("from", simple("[email protected]")) 
    .setHeader("to", simple("[email protected]")) 
    .setBody(simple("Failure:\n ${exception.message} \n\ndetail: \n${body}")) 
    .to("smtp://localhost") 
    .log("Failure email now sent.") 
    .end(); 

Ich habe auch eine andere Abhilfe versucht. Ich habe die onException Klausel wie unten geändert. Dies ermöglicht es, den Schlüssel aus dem Repository zu entfernen, wenn die Ausnahme ausgelöst wird. Ich frage mich, ob das ein richtiger Ansatz ist?

onException(Exception.class) 
    .setHeader("subjectText", simple("failure email!")) 
    .multicast().to("seda:notifySupportOnFailure").end() 
    .end(); 
+0

Um einige zusätzliche Informationen dazu hinzuzufügen. Das Repository umfasst Folgendes: IdempotentRepository duplicatesRepo = MemoryIdempotentRepository.memoryIdempotentRepository (100); Die Version von Apache Camel verwendet wird, ist 2.16.2 – izzymike109

Antwort

0

Eine Arbeit um würde die idempotentConsumer Anruf in Ihrer Eltern-Route findWorkItems 'zu setzen und die completionEager Flagge auf sie auf true setzen.

onException(Exception.class) 
    .setHeader("subjectText", simple("failure email!")) 
    .to("seda:notifySupportOnFailure") 
    .end(); 

from("direct:findWorkItems") 
    .idempotentConsumer(simple("${body.workItemId}"), duplicatesRepo).completionEager(true) 
    .bean(someService, "findWorkItems") 
    .split(body()) 
     .throttle(1).timePeriodMillis(5000L) 
     .to("direct:handleWorkItem") 
     .choice().when(header("resultId").isGreaterThan(0)) 
     .bean(someService, "updateWorkItemToHandled") 
     .end(); 

from("direct:handleWorkItem") 
    .bean(someService, "handleWorkItem") // e.g. exception would be thrown within here 
    .setHeader("resultId", body()) 
    .end(); 
+0

Ich habe versucht, diese Herangehensweise Ansatz. Wenn das Flag _completionEager_ auf _true_ gesetzt ist, wird der Schlüssel innerhalb der Klausel _OnException_ aus dem Repository entfernt. Aber ist das ein richtiger Ansatz? – izzymike109

Verwandte Themen