Spring Boot RabbitMQ consumer application can not fetch an object sent by producer application in Java 17

23 views Asked by At

I upgraded a project from Java 11/Spring Boot 2.7.9 to Java 17/Spring Boot 3.1.3. The sender still can send an object to a RabbitMQ, but the listener throws a Cannot convert exception during message parsing (Java 11/Spring Boot 2.7.9 did not have this object conversion issue). JsonMessageConverter can solve the problem but I have to use object conversion now. How to fix that the consumer module fails to convert the object generated from the producer module?

  1. Producer Module

    rabbitTemplate.convertAndSend("EXCHANGE", "PAC", new ca.open.pac.models.ScannerPub("a", "b"));
    
  2. Producer and Consumer share the object in the common module

    package ca.open.pac.models;
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class ScannerPub implements Serializable {
        private String filePath;
        private String dateTime;
    }
    
  1. Consumer

    @RabbitListener(queues = "${pac.pac-queue}") public void receivePACMessage(@Payload ca.bc.gov.open.pac.models.ScannerPub message) throws IOException { ... }

  2. Consumer Lister Message Convert Exception:

    Endpoint handler details:
    Method [public void ca.pac.open.jag.pac.transformer.services.QueueListenerService.receivePACMessage(ca.open.pac.models.ScannerPub) throws java.io.IOException]
    Bean [ca.pac.open.jag.pac.transformer.services.QueueListenerService@4dce5095]
        at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:281)
        at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandlerAndProcessResult(MessagingMessageListenerAdapter.java:224)
        at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:149)
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1662)
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1581)
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1569)
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1560)
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListenerAndHandleException(AbstractMessageListenerContainer.java:1505)
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.lambda$executeListener$8(AbstractMessageListenerContainer.java:1483)
        at io.micrometer.observation.Observation.observe(Observation.java:499)
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1483)
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:994)
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:941)
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1325)
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1227)
        at java.base/java.lang.Thread.run(Thread.java:833)
    **Caused by: org.springframework.messaging.converter.MessageConversionException: Cannot convert from [ca.open.pac.models.ScannerPub] to [ca.open.pac.models.ScannerPub] for GenericMessage [payload=ScannerPub(filePath=a, dateTime=b), headers={amqp_receivedDeliveryMode=PERSISTENT, amqp_receivedRoutingKey=PAC, amqp_receivedExchange=EXCHANGE, amqp_deliveryTag=1, amqp_consumerQueue=pac_queue, amqp_redelivered=false, id=7cf595af-4b92-95b7-8ca1-81ddd99083e5, amqp_consumerTag=amq.ctag-W4k9qOJAAo_FHYSaW6FYIQ, amqp_lastInBatch=false, contentType=application/x-java-serialized-object, timestamp=1711318782296}]**
        at org.springframework.messaging.handler.annotation.support.PayloadMethodArgumentResolver.resolveArgument(PayloadMethodArgumentResolver.java:151)
        at org.springframework.amqp.rabbit.listener.adapter.AmqpMessageHandlerMethodFactory$OptionalEmptyAwarePayloadArgumentResolver.resolveArgument(AmqpMessageHandlerMethodFactory.java:99)
        at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:118)
        at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:147)
        at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:115)
        at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:75)
        at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:277)
        ... 15 common frames omitted
0

There are 0 answers