Пользовательский MessageConverter с Spring JmsMessagingTemplate не работает, как я ожидал - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь прикрепить специальный конвертер сообщений, который реализует org.springframework.jms.support.converter.MessageConverter, к JmsMessagingTemplate.

Я где-то читал, что мы можем подключить конвертер сообщений к MessagingMessageConverter, позвонив по номеру setPayloadConverter, а затем подключить этот конвертер сообщений к JmsMessagingTemplate через setJmsMessageConverter.После этого я звоню convertAndSend, но замечаю, что он не конвертирует полезную нагрузку.

Когда я отлаживал код, я заметил, что настройка Jms Message Converter не устанавливает переменную экземпляра converter в JmsMessagingTemplate.Поэтому, когда метод convertAndSend вызывает doConvert и пытается getConverter, он получает простой конвертер сообщений по умолчанию, а не мой собственный.

У меня вопрос, могу ли я использовать реализацию * 1019?* с JmsMessagingTemplate?Или мне нужно использовать реализацию org.springframework.messaging.converter.MessageConverter?

Я использую Spring Boot 1.4.1.RELEASE и Spring 4.3.3.RELEASE.Код ниже.

Конфигурация

@Configuration
@EnableJms
public class MessagingEncryptionPocConfig {
    /**
     * Listener ActiveMQ Connection Factory
     */
    @Bean(name="listenerActiveMqConnectionFactory")
    public ActiveMQConnectionFactory listenerActiveMqConnectionFactory() {
        return new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616");
    }

    /**
     * Producer ActiveMQ Connection Factory
     */
    @Bean(name="producerActiveMqConnectionFactory")
    public ActiveMQConnectionFactory producerActiveMqConnectionFactory() {
        return new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616");
    }   

    /**
     * Caching Connection Factory
     */
    @Bean
    public CachingConnectionFactory cachingConnectionFactory(@Qualifier("producerActiveMqConnectionFactory") ActiveMQConnectionFactory activeMqConnectionFactory) {
        return new CachingConnectionFactory(activeMqConnectionFactory);
    }

    /**
     * JMS Listener Container Factory
     */
    @Bean
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(@Qualifier("listenerActiveMqConnectionFactory") ActiveMQConnectionFactory connectionFactory, MessagingMessageConverter messageConverter) {
        DefaultJmsListenerContainerFactory defaultJmsListenerContainerFactory = new DefaultJmsListenerContainerFactory();
        defaultJmsListenerContainerFactory.setConnectionFactory(connectionFactory);
        defaultJmsListenerContainerFactory.setMessageConverter(messageConverter);
        return defaultJmsListenerContainerFactory;
    }

    /**
     * Jms Queue Template
     */
    @Bean(name="queueTemplate")
    public JmsMessagingTemplate queueTemplate(CachingConnectionFactory cachingConnectionFactory, MessageConverter messagingMessageConverter) {
        JmsMessagingTemplate queueTemplate = new JmsMessagingTemplate(cachingConnectionFactory);
        queueTemplate.setJmsMessageConverter(messagingMessageConverter);
        return queueTemplate;
    }

    @Bean
    public MessageConverter encryptionDecryptionMessagingConverter(Jaxb2Marshaller jaxb2Marshaller) {
        MessageConverter encryptionDecryptionMessagingConverter = new EncryptionDecryptionMessagingConverter(jaxb2Marshaller);
        MessagingMessageConverter messageConverter = new MessagingMessageConverter();
        messageConverter.setPayloadConverter(encryptionDecryptionMessagingConverter);
        return messageConverter;
    }

    /**
     * Jaxb marshaller
     */
    @Bean(name="producerJaxb2Marshaller")
    public Jaxb2Marshaller jaxb2Marshaller() {
        Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
        jaxb2Marshaller.setPackagesToScan("com.schema");
        return jaxb2Marshaller;
    }
}

Класс MessageProducer

@Component 
public class MessageProducer {

    private static final Logger LOG = LoggerFactory.getLogger(MessageProducer.class);

    @Autowired
    @Qualifier("queueTemplate")
    private JmsMessagingTemplate queueTemplate;

    public void publishMsg(Transaction trx, Map<String,Object> jmsHeaders, MessagePostProcessor postProcessor) {
        LOG.info("Sending Message. Payload={} Headers={}",trx,jmsHeaders);
        queueTemplate.convertAndSend("queue.source", trx, jmsHeaders, postProcessor);
    }
}

Unit Test

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class WebsMessagingEncryptionPocApplicationTests {
    @Autowired
    private MessageProducer producer;

    @Autowired
    private MessageListener messageListener;    

    /**
     * Ensure that a message is sent, and received.
     */
    @Test
    public void testProducer() throws Exception{
        //ARRANGE
        CountDownLatch latch = new CountDownLatch(1);
        messageListener.setCountDownLatch(latch);
        Transaction trx = new Transaction();
        trx.setCustomerAccountID(new BigInteger("111111"));
        Map<String,Object> jmsHeaders = new HashMap<String,Object>();
        jmsHeaders.put("tid", "1234563423");
        MessagePostProcessor encryptPostProcessor = new EncryptMessagePostProcessor();
        //ACT
        producer.publishMsg(trx, jmsHeaders, encryptPostProcessor);
        latch.await();
        //ASSERT - assertion done in the consumer       
    }
}

1 Ответ

0 голосов
/ 23 мая 2018

Поле converter используется для преобразования ваших входных параметров в пружинные сообщения Message<?>.

Конвертер JMS используется позже (в MessagingMessageCreator), чтобы затем создать JMS Messageиз сообщения Message<?>.

...