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

Reply via email to