Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

557
Vistas
Spring AMQP @RabbitListener convertir a objeto de origen

Intento enviar un mensaje basado en un MAP plano usando Spring Boot y AMQP. Luego, el mensaje debe recibirse usando @RabbitListener y transferirlo nuevamente a un MAP.

Primero he anidado json String y lo plano y lo envío usando el siguiente código:

 // Flatten the JSON String returned into a map Map<String,Object> jsonMap = JsonFlattener.flattenAsMap(result); rabbitTemplate.convertAndSend(ApplicationProperties.rmqExchange, ApplicationProperties.rmqTopic, jsonMap, new MessagePostProcessor() { @Override public Message postProcessMessage(Message message) throws AmqpException { message.getMessageProperties().setHeader("amqp_Key1", "wert1"); message.getMessageProperties().setHeader("amqp_Key2", "Wert2"); message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT); return message; } });

Hasta aquí todo bien.

En el sitio de recepción, trato de usar un Oyente y convertir la carga útil del mensaje nuevamente al Mapa como se envió antes.

El problema es que no tengo ni idea de cómo hacerlo. Recibo el mensaje con el siguiente código:

 @RabbitListener(queues = "temparea") public void receiveMessage(Message message) { log.info("Receiving data from RabbitMQ:"); log.info("Message is of type: " + message.getClass().getName()); log.info("Message: " + message.toString()); }

Como mencioné antes, no tengo idea de cómo puedo convertir el mensaje a mi viejo MAP. El __ TypeId __ del mensaje es: com.github.wnameless.json.flattener.JsonifyLinkedHashMap

Estaría más que contento si alguien pudiera ayudarme a devolver este mensaje a un mapa de Java.

BR


Actualización después de la respuesta de Artem Bilan:

Agregué el siguiente código a mi archivo de configuración:

 @Bean public SimpleRabbitListenerContainerFactory myRabbitListenerContainerFactory() { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setMessageConverter(new Jackson2JsonMessageConverter()); factory.setConnectionFactory(connectionFactory()); factory.setMaxConcurrentConsumers(5); return factory; }

Pero todavía no tengo idea de cómo sacar el Mapa de mi mensaje. El nuevo bloque de código no cambia nada.

about 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Debe configurar el bean Jackson2JsonMessageConverter y Spring Boot lo recogerá para la definición del bean SimpleRabbitListenerContainerFactory que se utiliza para crear contenedores de escucha para los métodos @RabbitListener .

ACTUALIZAR

Preste atención a la muestra Spring AMQP JSON .

Hay un bean como jsonConverter() . De acuerdo con la configuración automática de Spring Boot, este bean se inyecta al valor predeterminado:

 public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {

Que realmente se usa para @RabbitListener de forma predeterminada, cuando el atributo containerFactory está vacío.

Entonces, solo necesita configurar ese bean y no necesita ningún SimpleRabbitListenerContainerFactory personalizado. O si lo hace, debe especificar su nombre de bean en ese atributo containerFactory de sus definiciones de @RabbitListener .

Otra opción a considerar es como Jackson2JsonMessageConverter.setTypePrecedence() :

 /** * Set the precedence for evaluating type information in message properties. * When using {@code @RabbitListener} at the method level, the framework attempts * to determine the target type for payload conversion from the method signature. * If so, this type is provided in the * {@link MessageProperties#getInferredArgumentType() inferredArgumentType} * message property. * <p> By default, if the type is concrete (not abstract, not an interface), this will * be used ahead of type information provided in the {@code __TypeId__} and * associated headers provided by the sender. * <p> If you wish to force the use of the {@code __TypeId__} and associated headers * (such as when the actual type is a subclass of the method argument type), * set the precedence to {@link TypePrecedence#TYPE_ID}. * @param typePrecedence the precedence. * @since 1.6 * @see DefaultJackson2JavaTypeMapper#setTypePrecedence(Jackson2JavaTypeMapper.TypePrecedence) */ public void setTypePrecedence(Jackson2JavaTypeMapper.TypePrecedence typePrecedence) {

Por lo tanto, si aún desea tener un Message como argumento de método pero obtener una ganancia de la conversión JSON basada en el encabezado __TypeId__ , debe considerar configurar Jackson2JsonMessageConverter para que se base en Jackson2JavaTypeMapper.TypePrecedence.TYPE_ID .

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda