¿Cuál es la forma correcta de obtener una entrada para procesar en mi ruta? -- java campo con json campo con mongodb campo con apache-camel camp Relacionados El problema

What is the right way to fetch an entry to process in my route


0
vote

problema

Español

Esta es mi primera pregunta aquí, por lo que si mi pregunta le falta alguna información fundamental, por favor, cojeando conmigo. Intentaré agregar la información necesaria lo más rápido posible. Estoy configurando una ruta de camello que recupera una URL de mi base de datos y envía esta URL a un rastreador, que recopila algunos datos de productos. Los datos que recibo de la Crawler se guardan de nuevo a la base de datos en una colección diferente. Cuando rastree otra URL, que contiene el mismo producto, quiero agregar los datos recién recibidos al objeto en mi base de datos.

Intenté guardar los datos recién recibidos en una propiedad y luego configurar dos constantes para encontrar el elemento correspondiente en la base de datos. Después de que se encuentre el objeto, quiero enviarle los datos recibidos a mi procesador, donde agrego los nuevos datos al objeto recuperado y luego guárdelo de nuevo al DB.

  from("direct:myRoute") ...     .setProperty("newItem").simple("${body}")     .setBody().constant("{ 'name': $.name}")     .setBody().constant("{ 'brand': $.brand}")     .to("mongodb:mongoBean?database={{db}}&collection=           {{col}}&operation=findOneByQuery") ...   

El resultado esperado debe ser, que mi objeto de base de datos tiene la información antigua y la información recién recibida almacenada, pero lo que obtengo es que 9988777661 no es válido BasicDBObject , lo mismo para la marca.

actualización

Entonces, descubrí que no es posible establecer dos constantes para lo que quería lograr. Experimenté un poco y pude hacer que funcione con ejemplos codificados duros.

  from("direct:myRoute") ...     .setProperty("newItem").simple("${body}")     .setBody().constant("{ 'name': 'product', 'brand': 'manufacturer'}")     .to("mongodb:mongoBean?database={{db}}&collection=           {{col}}&operation=findOneByQuery") ...   

Pero el problema permanece, que quiero establecer el 'nombre' y 'marca' como las variables JSON extraídas del cuerpo.

actualización 2

Cambié el código alrededor y probé el siguiente ejemplo en mi código.

  from("direct:myRoute") ...     .setProperty("newItem").simple("${body}")     .setBody().constant("{ 'name' : '{$.name}', 'brand' : '{$.brand}' }")     .to("mongodb:mongoBean?database={{db}}&collection=           {{col}}&operation=findOneByQuery") ...   

No recibo un error de esto, pero no funciona como se esperaba. Esperaba que los $ .NAME y $ .BRAND se reemplazarán a las variables almacenadas en el cuerpo, pero parece que se utilizan "As-Is"

2019-11-06 13: 27: 43.363 INFO 2132 --- [Xnio-1 Tarea-1] Depuración : Exchange [CierlPattern: Enout, BodyType: Cadena, Cuerpo: {'Nombre': '{$ .name}', 'Marca': '{$ .BRAND}'}]

Original en ingles

This is my first question here, so if my question is missing some core information, please bear with me. I'll try to add the needed info as fast as possible. I am setting up a camel route that retrieves a URL from my Database and sends this URL to a crawler, that collects some product data. The data that I receive from the crawler is then saved back to the Database into a different collection. When I crawl another URL, that contains the same product, I want to add the newly received data to the object in my Database.

I tried to save the newly received data in a Property and then set two constants to find the corresponding item in the database. After the object is found, I want to send that received data to my processor, where I add the new Data to the retrieved object and then save it back to the DB.

from("direct:myRoute") ...     .setProperty("newItem").simple("${body}")     .setBody().constant("{ 'name': $.name}")     .setBody().constant("{ 'brand': $.brand}")     .to("mongodb:mongoBean?database={{db}}&collection=           {{col}}&operation=findOneByQuery") ... 

The expected result should be, that my Database object has the old info and the newly received info stored, but what I get is, that { 'name': $.name} is no valid BasicDBObject, same for the brand.

Update

So, I found out, that setting two constants is not possible for what I wanted to achieve. I experimented a bit and was able to make it work with hard coded examples.

from("direct:myRoute") ...     .setProperty("newItem").simple("${body}")     .setBody().constant("{ 'name': 'product', 'brand': 'manufacturer'}")     .to("mongodb:mongoBean?database={{db}}&collection=           {{col}}&operation=findOneByQuery") ... 

But the Problem remains, that I want to set the 'name' and 'brand' as json variables extracted from the body.

Update 2

I changed the code around a bit and tried the following example in my code.

from("direct:myRoute") ...     .setProperty("newItem").simple("${body}")     .setBody().constant("{ 'name' : '{$.name}', 'brand' : '{$.brand}' }")     .to("mongodb:mongoBean?database={{db}}&collection=           {{col}}&operation=findOneByQuery") ... 

I don't get an error from this, but it does not work as expected. I hoped, that the $.name and $.brand will get replaced to the variables stored in the body, but it seems, they get used "as-is"

2019-11-06 13:27:43.363 INFO 2132 --- [ XNIO-1 task-1] DEBUG : Exchange[ExchangePattern: InOut, BodyType: String, Body: { 'name' : '{$.name}', 'brand' : '{$.brand}' }]

           

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

OK, así que encontramos una solución a este problema que funciona para nuestra USECASE. Establecemos el nombre y la marca como propiedades y usamos un simple para configurar el cuerpo con estas propiedades.

  from("direct:myRoute") ...     .setProperty("newItem").simple("${body}")     .setProperty("name").jsonpath("$.name")     .setProperty("brand").jsonpath("$.brand")     .setBody().simple("{'name':'${property.name}','brand':'${property.brand}'}")     .convertBodyTo(String.class)     .to("mongodb:mongoBean?database={{db}}&collection=           {{col}}&operation=findOneByQuery") ...   
 

Ok, so we found a solution to this problem that works for our usecase. We set the name and the brand as properties and used a simple to set the body with these properties.

from("direct:myRoute") ...     .setProperty("newItem").simple("${body}")     .setProperty("name").jsonpath("$.name")     .setProperty("brand").jsonpath("$.brand")     .setBody().simple("{'name':'${property.name}','brand':'${property.brand}'}")     .convertBodyTo(String.class)     .to("mongodb:mongoBean?database={{db}}&collection=           {{col}}&operation=findOneByQuery") ... 
 
 

Relacionados problema

1  ClasspathxMlapplicationContext problema en Apache-ServiceMix-4.3.0-fusible-00-00  ( Classpathxmlapplicationcontext problem in apache servicemix 4 3 0 fuse 00 00 ) 
Seguí el ejemplo en el Capítulo 14 del Libro, "Camel en acción". Deseo ocultar el middleware de la lógica de negocios. Mientras se desarrolla utilizando "Cam...

4  Apache Camel: SFTP Endpoint - TUBO CERRADO EDICION  ( Apache camel sftp endpoint pipe closed issue ) 
Estoy trabajando con una ruta que descarga archivos de un servidor remoto al directorio local usando SFTP. Versión de Apache Camel: 2.15.2 Desde el punto fi...

1  APACHE CAMEL CAPTING CAPTING INTENTOS ANTES DE OTROS PUNTOS DE FACINTES DE FACINABLE  ( Apache camel capturing failover attempts before another failover does round robi ) 
Estoy usando Apache Camel Failover Componente con la siguiente configuración de ruta: <route id="jettyRouter" errorHandlerRef="defaultErrorHandler"> <f...

0  Re-ruta dinámicamente para las rutas de camello  ( Re route dynamically for camel routes ) 
Estoy tratando de averiguar cómo volver a rutas dinámicamente para una ruta de camello. Actualmente calculo la ruta en un procesador basado en algunas entrada...

1  Componente de archivo (Camel Apache) Eliminar = Parámetro verdadero no funciona en Windows  ( File componentapache camel delete true parameter not working in windows ) 
El componente de archivo de Apache Camel no funciona correctamente en Windows7, donde está trabajando en Linux sin ningún problema. My requisito: Despué...

0  Alcance de Mensaje de Apache Camel  ( Apache camel message scope ) 
He escrito un componente (EHCOMPONENT) para hacer un manejo de errores para otros componentes (Acomponente). Acomponent Lee de una cola, encuentra un error,...

2  Sirviendo archivos estáticos con rutas de camello  ( Serving static files with camel routes ) 
Estoy tratando de servir un archivo estático en las rutas de camello. Las rutas en mi clase principal contienen esta pieza de código: public final void c...

1  Apache Camel Multidifast Conversing Mensaje de texto al mensaje de byte  ( Apache camel multicast converting text message to byte message ) 
Estoy tratando de publicar un mensaje de texto al tema con Apache Camel con ActiveMQ. El siguiente código funciona bien y mi programa de cliente es capaz de c...

0  Camel JMS: consume un mensaje (es un XML) del tema e invoca un frijol Java y pasa el objeto XML a él  ( Camel jms consume a messageis an xml from topic and invoke a java bean and p ) 
Tengo una ruta de camello que se supone que consume un mensaje JMS de un tema e invoca un frijol de primavera. Definición de ruta from("jms:topic:testQueue...

0  ¿Cómo recuperar un contenido específico del cuerpo de camello para pasar a un método de frijol en la ruta de camello?  ( How to retrieve a specific content from camel body to pass to a bean method in c ) 
Tengo una ruta de camello simple definida que consumirá un mensaje XML. La ruta es la siguiente: from("from-endpoint").bean(myBean, "method1").log("$body...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos