ClassNotFoundException при получении сообщений AMQP после обновления до Spring Cloud Hoxton.SR3 - PullRequest
0 голосов
/ 09 марта 2020

После обновления Spring Cloud с Hoxton.SR1 до Hoxton.SR3 наше приложение выдает следующее исключение при каждом получении сообщения, даже если сообщение все еще обрабатывается должным образом:

java.lang.IllegalStateException: java.lang.ClassNotFoundException: com.mycompany.domain.message.DiagramDeletedMessage
    at org.springframework.integration.mapping.support.JsonHeaders.getClassForValue(JsonHeaders.java:89)
    at org.springframework.integration.mapping.support.JsonHeaders.buildResolvableType(JsonHeaders.java:72)
    at org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper.createJsonResolvableTypHeaderInAny(DefaultAmqpHeaderMapper.java:169)
    at org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper.extractStandardHeaders(DefaultAmqpHeaderMapper.java:155)
    at org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper.extractStandardHeaders(DefaultAmqpHeaderMapper.java:61)
    at org.springframework.integration.mapping.AbstractHeaderMapper.toHeaders(AbstractHeaderMapper.java:266)
    at org.springframework.integration.mapping.AbstractHeaderMapper.toHeadersFromRequest(AbstractHeaderMapper.java:203)
    at org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper.toHeadersFromRequest(DefaultAmqpHeaderMapper.java:337)
    at org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper.toHeadersFromRequest(DefaultAmqpHeaderMapper.java:61)
    at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter$Listener.createMessage(AmqpInboundChannelAdapter.java:281)
    at org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter$Listener.onMessage(AmqpInboundChannelAdapter.java:235)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1579)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1498)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer$$Lambda$1393/1038281434.invokeListener(Unknown Source)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1486)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1477)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1421)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:963)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:913)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:81)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1284)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1190)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: com.mycompany.domain.message.DiagramDeletedMessage
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:144)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:282)
    at org.springframework.integration.mapping.support.JsonHeaders.getClassForValue(JsonHeaders.java:86)
    ... 22 common frames omitted

Похоже, Такое поведение связано с изменениями, выполненными в https://github.com/spring-projects/spring-integration/commit/2f4394d8b527b227d0ee2ff43de0ec2a50ffefef. Теперь заголовок json__TypeId__, содержащий FQN сообщения, используется для попытки разрешить тип сообщения.

Поскольку исключение регистрируется как предупреждение, мы установили для уровня DefaultAmqpHeaderMapper Spring значение журнала ERROR теперь. Однако это также может скрыть другие, возможно, важные предупреждения.

Мне интересно, является ли это проблемой с вышеупомянутым изменением в Spring-интеграции и каков наилучший способ избежать заполнения наших журналов трассировками стека.

...