Estoy muy confundido acerca de devolver un "cuerpo" de las subrutas llamadas por to() en Camel. De lo que encontré sobre las rutas directas es que fomentan la reutilización de rutas y se utilizan para dividir lógicamente rutas demasiado complicadas. Pero parece que no puedo hacer una "división" más simple:

    from("jms:createRequestQueue")
            .to("direct:createRequest")

            // here the processing of the message fails, see below

            .bean(processor)

            .to("...");

    from("direct:createRequest")
            .onException(Exception.class).bean(requestErrorHandler).stop()
            .unmarshal().json(JsonLibrary.Jackson, MyModelRequest.class);

La clase de la instancia del procesador se ve así:

public class RequestProcessor {

    @Handler
    public void update(@Body MyModelRequest request) {
        // do stuff
    }

}

El caso es que el resultado de la ruta para desagrupar la solicitud (la segunda ruta) no se propaga a la ruta de llamada. Se lanza una excepción diciendo que no puede convertir String (el JSON que entra en la cola) a la clase MyModelRequest. Entonces, parece que el cuerpo JSON en la primera ruta no se reemplaza por el resultado de la ruta de desglose. Esto parece una buena reutilización de rutas que espero.

Me topé con los mensajes de InOut, pero los documentos son muy poco claros y mis experimentos fallaron de la misma manera.

¿Qué debo hacer para extraer realmente partes de una ruta a otra ruta para su reutilización?

1
redhead 30 ago. 2016 a las 10:49

2 respuestas

La mejor respuesta

Entonces, el problema estaba en la cláusula onException (se dejó fuera de la pregunta original, pensé que no era el problema). Confundí la llamada end() con la llamada stop() y, por lo tanto, la ruta se detuvo demasiado pronto y devolvió el JSON sin analizar en String. Correcto es:

from("direct:createRequest")
        .onException(Exception.class).bean(requestErrorHandler).end()
        .unmarshal().json(JsonLibrary.Jackson, MyModelRequest.class);
1
redhead 31 ago. 2016 a las 14:32

Sin un ejemplo ejecutable que reporduzca el error, es difícil saber qué sale mal, pero debería funcionar (¡y lo hace! Probado en 2.17.2 y 2.15.3):

@Component
public class DemoRouteBuilder extends RouteBuilder {   

  @Override
  public void configure() throws Exception {
    from("timer:sender?delay=10s&period=3s")
        .setBody(constant("{\"title\":\"Lord of the Rings\",\"author\":\"J.R.R. Tolkien\"}"))
        .to("direct:unmarshal")
        .bean(new RequestProcessor())
        .log("${body}!");

    from("direct:unmarshal")
        .unmarshal().json(JsonLibrary.Jackson, Book.class);
  }

  public static class RequestProcessor {

    @Handler
    public void update(@Body Book book) {
      System.out.println("Got " + book);
    }

  }

  public static class Book {
    private final String title;

    private final String author;

    private Book() {
      this(null, null);
    }

    public Book(String title, String author) {
      this.title = title;
      this.author = author;
    }

    public String getTitle() {
      return title;
    }

    public String getAuthor() {
      return author;
    }
    @Override
    public String toString() {
      return "title='" + title + "', author='" + author + '\'';
    }

  }
}

Aquí está la salida:

2016-08-30 13: 48: 34.337 INFO 16240 --- [main] com.example.DemoApplication: DemoApplication iniciada en 5.859 segundos (JVM ejecutándose para 6.587)

Título obtenido = 'El señor de los anillos', autor = 'J.R.R. Tolkien '

2016-08-30 13: 48: 44.298 INFO 16240 --- [temporizador: // remitente] ruta1: título = 'El señor de los anillos', autor = 'J.R.R. Tolkien '!

Título obtenido = 'El señor de los anillos', autor = 'J.R.R. Tolkien '

2016-08-30 13: 48: 47.232 INFO 16240 --- [temporizador: // remitente] ruta1: título = 'El señor de los anillos', autor = 'J.R.R. Tolkien '!

0
Community 20 jun. 2020 a las 09:12