Hi Are you able to put together a smaller and simpler example with just routes (no rest-dsl) that can let us quicker take a look and better understand what is happening?
On Mon, Mar 18, 2024 at 10:04 AM Mikael Andersson Wigander <mikael.andersson.wigan...@pm.me.invalid> wrote: > Hi > > I have experienced a weird behavior in Camel 4.4.0 in Quarkus where the > Exception handling is not executing as expected when using a toV(). > > In my code sample below everything starts with a rest call. > If this rest call finish without errors then the original message should > be returned. > If an error is thrown, then an error message should be returned. > > But if I call an endpoint using the .toV(), the error is processed as > expected BUT NOT returned. It seems like something is messing with the unit > of work or whatever… > > from(direct("start")) > .setBody(constant(*List*.*of*("A", "B"))) > .to(direct("line")); > > *// .toV(direct("line").getUri(), "mySend", "myReceive");* > > By commenting out the .to() and removing the comment on .toV() the problem > occurs. > > This is a simulation so the incoming rest post payload is NOT returned > (just POST a JSON), however the body of the "start" endpoint should be > returned if everything work, but an error message should be returned if an > error is thrown. > This is not happening if the .toV() is used. Then the body of the "start" > endpoint is returned. > > Might this be a bug or have I messed something up? > > I really like the Variables now, to send to an endpoint and be certain the > original body is untouched without the hazzle of storing/restoring logic… > > > /M > > > > > *public class *TestRouter *extends *EndpointRouteBuilder { > @Override > *public void *configure() *throws *Exception { > onException(IllegalAccessException.*class*) > .routeId("Exceptions") > .maximumRedeliveries(0) > .handled(*true*) > .removeHeaders("*") > .process(*new *JsonResponseProcessor()) > .to(log("Exceptions").level("WARN") > .showBody(*false*) > .showBodyType(*false*) > .showHeaders(*true*) > .multiline(*true*)) > .to(direct("reply")); > > restConfiguration() > .bindingMode(RestBindingMode.*json*) > .dataFormatProperty("prettyPrint", "true") > .component("servlet") > .apiProperty("cors", "true"); > > rest().post("/test") > .id("REST-workOrder-POST") > .consumes("application/json") > .produces("application/json") > .outType(ResponseMessage.*class*) > .to(direct("start").getUri()); > > from(direct("start")) > .setBody(constant(*List*.*of*("A", "B"))) > .to(direct("line")); > > > *// .toV(direct("line").getUri(), "mySend", "myReceive"); > *from("direct:line") > .to("log:line") > .process(*new *MyProcessor()) > .to("mock:line"); > > from(direct("reply")) > .routeId("createResponse") > .description("Creates a unified response") > .to(log("DIRECT_REPLY").showBody(*true*) > .showVariables(*true*) > .showBodyType(*true*) > .showHeaders(*true*) > .multiline(*true*)) > .end(); > } > > *private class *MyProcessor *implements *org.apache.camel.*Processor * > { > @Override > *public void *process(*final **Exchange *exchange) *throws *Exception > { > log.info(exchange.getIn() > .getBody(String.*class*)); > *throw new *IllegalAccessException("Error occurred"); > } > } > > *private class *JsonResponseProcessor *implements **Processor *{ > @Override > *public void *process(*final **Exchange *exchange) { > > Exception cause = exchange.getProperty(*Exchange*. > *EXCEPTION_CAUGHT*, Exception.*class*); > ResponseMessage message = *new *ResponseMessage(); > > *final **Message *in = exchange.getIn(); > *if *(cause != *null*) { > String responseCode = in.getHeader(*Exchange*. > *HTTP_RESPONSE_CODE*, String.*class*); > > String reason = "Unspecific Error"; > String errorString = cause.getMessage(); > String statusCode = "1000"; > > in.setHeader(*Exchange*.*HTTP_RESPONSE_CODE*, > HttpResponseStatus.*INTERNAL_SERVER_ERROR*); > message.setError(NumberUtils.*toInt*(statusCode, 1000), > String.*format*("ERROR message = %s(%s)", > reason, errorString)); > > } > in.setBody(message); > } > } > } > > > > ------------------------------ > > Capgemini is a trading name used by the Capgemini Group of companies which > includes Capgemini Sverige AB, a company registered in Sweden (number > 556092-3053) whose registered office is at FLEMINGGATAN 18 BOX 12054 S-102 > 22 Stockholm, Sweden. > This message contains information that may be privileged or confidential > and is the property of the Capgemini Group. It is intended only for the > person to whom it is addressed. If you are not the intended recipient, you > are not authorized to read, print, retain, copy, disseminate, distribute, > or use this message or any part thereof. If you receive this message in > error, please notify the sender immediately and delete all copies of this > message. > > > -- Claus Ibsen ----------------- @davsclaus Camel in Action 2: https://www.manning.com/ibsen2