Yeah, I know the rollback doesn't work that way. That wasn't what I was driving at. I am just trying to deal with a business problem of informing the investigator why an exchange failed though means other than spelunking in a verbose log file for clues. Sometimes one investigating a problem may not have access even to the logs. For example if a business issue such as a studio's game site went down causing the exchanges to fail. In this circumstance we would rather push the exchange to a dead letter queue and then later be able to determine why the problem happened and relish those exchanges. Again finding the "why" in a log file isn't going to work out.
-- Robert On Friday, May 23, 2014, Claus Ibsen <claus.ib...@gmail.com> wrote: > You cannot provide a reason why a rollback happens in the TX API. > There is no rollback(String message) api for that. > > You need to record this somewhere else if you want to use that. > Or do your own kind of TX rollback. > > On Thu, May 22, 2014 at 11:00 PM, kraythe . <kray...@gmail.com<javascript:;>> > wrote: > > Greetings, I have many routes that read from AMQ queues and write to > other > > AMQ queues. For error handling I have been using the following paradigm: > > > > from("activemq:queue:inbox") > > > > > .onException(Exception.class).useOriginalMessage().handled(handled).maximumRedeliveries(0) > > .setHeader(Exchange.FAILURE_ROUTE_ID, > property(Exchange.FAILURE_ROUTE_ID)) > > .setHeader(Exchange.EXCEPTION_CAUGHT, > simple("${exception.stacktrace}")) > > .to(ExchangePattern.InOnly, "activemq:queue:dead").end(); > > .process(new PreProcessor()) > > .to("activemq:queue:outbox") > > .process(new PostProcessor()); > > > > The goal being that if there was any kind of exception, that information > > would be noted in the headers on the message before it was sent off to > the > > DLQ. The problem is this runs into roadblocks when transacted() is added > to > > the route. > > > > With the code above when the route is transacted and a message fails in > > post processing I want the message pulled off the outbox, record > > information indicating what the exception was, and have the message sent > to > > the DLQ. Unfortunately I seem to be in a quandary of how to do this. > > > > The code above simply wont work because the message being sent to the > dead > > letter queue gets rolled back along with the outbox if I mark the > exchange > > with rollback() in the exception handler. If I don't mark the message > with > > rollback() in the handler then the outbox doesn't get rolled back if the > > post processor exceptions but the dead letter channel will contain the > > correct information. On the other hand if I just let activemq handle the > > transaction, it will retry and then eventually send the message to the > DLQ > > but the message in the DLQ will contain no information about why it > failed. > > > > So I want my cake and eat it too. I want to be able to record WHY an > > exchange failed but still be able to rollback the outbox at the same > time. > > I have been plugging away at this a ton and I am out of ideas. What would > > not be acceptable would be to require the user to troll through log files > > trying to find a reason why an exchange failed. This would be an > > operational nightmare. So the message and the reason for the rollback > need > > to be somewhere accessible and they need to be together. > > > > I would appreciate any suggestions on how I could make this happen. > > > > *Robert Simmons Jr. MSc. - Lead Java Architect @ EA* > > *Author of: Hardcore Java (2003) and Maintainable Java (2012)* > > *LinkedIn: **http://www.linkedin.com/pub/robert-simmons/40/852/a39 > > <http://www.linkedin.com/pub/robert-simmons/40/852/a39>* > > > > -- > Claus Ibsen > ----------------- > Red Hat, Inc. > Email: cib...@redhat.com <javascript:;> > Twitter: davsclaus > Blog: http://davsclaus.com > Author of Camel in Action: http://www.manning.com/ibsen > hawtio: http://hawt.io/ > fabric8: http://fabric8.io/ > -- *Robert Simmons Jr. MSc. - Lead Java Architect @ EA* *Author of: Hardcore Java (2003) and Maintainable Java (2012)* *LinkedIn: **http://www.linkedin.com/pub/robert-simmons/40/852/a39 <http://www.linkedin.com/pub/robert-simmons/40/852/a39>*