Spring JMS json конвертер сообщений - PullRequest
0 голосов
/ 04 марта 2019

У меня возникли проблемы с преобразованием сообщений из RabbitMQ с использованием модуля spring-jms .Ранее я отправлял свои сообщения с использованием конечной точки Rest API, эта конечная точка отправляет сообщение в очередь RabbitMQ и обрабатывает его с помощью методов @ JmsListener .

Внутренне это поведение добавляет поле для определения типа Java,управляется библиотеками Spring.Однако теперь я хочу избежать вызова API Rest, потому что в этом нет необходимости, и я могу отправить сообщение непосредственно в RabbitMQ.

Проблема заключается в том, что Spring пытается преобразовать сообщение JMS для параметра @ JmsListener ,Я не установил тип сообщения, потому что отправителю не нужна эта информация, но теперь я не могу преобразовать ее напрямую, потому что MappingJackson2MessageConverter хочет свойство для этого.

Как можно избежатьЭта проблема?Я хочу иметь возможность обрабатывать все сообщения без необходимости знать тип всех «отправителей».

Бин конвертера сообщений:

   @Bean
   public MessageConverter jacksonJmsMessageConverter() {
      MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
      converter.setTargetType(MessageType.TEXT);
      converter.setTypeIdPropertyName("_type");
      return converter;
   }

Пример кода слушателя:

 @JmsListener(concurrency = "listener.concurrency", destination = "queue.name", containerFactory = "container.factory")
 public void processFile(MyDtoClass dto) {
    ....
 }

1 Ответ

0 голосов
/ 04 марта 2019

Создайте подкласс преобразователя и переопределите getJavaTypeForMessage(), чтобы получить нужный тип ...

/**
 * Determine a Jackson JavaType for the given JMS Message,
 * typically parsing a type id message property.
 * <p>The default implementation parses the configured type id property name
 * and consults the configured type id mapping. This can be overridden with
 * a different strategy, e.g. doing some heuristics based on message origin.
 * @param message the JMS Message to set the type id on
 * @throws JMSException if thrown by JMS methods
 * @see #setTypeIdOnMessage(Object, javax.jms.Message)
 * @see #setTypeIdPropertyName(String)
 * @see #setTypeIdMappings(java.util.Map)
 */
protected JavaType getJavaTypeForMessage(Message message) throws JMSException {
...