12

I am using the Spring API's JmsTemplate and MappingJackson2MessageConverter (version: spring-jms-4.3.4.RELEASE.jar) to publish messages to an ActiveMQ topic as shown in the below code.

TopicPublisher class:

@Component
public class TopicPublisher {

    @Autowired
    private JmsTemplate jmsTemplate;

    @Autowired
    private MessageConverter messageConverter;

    public void send() {
        Product product = new Product();
        product.setName("abcd");
        product.setPrice(10);

        jmsTemplate.setMessageConverter(messageConverter);
        jmsTemplate.convertAndSend("product.topic", product);
    }
}

MappingJackson2MessageConverter class:

@Configuration
public class JMSTextMessageConverter {

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

Now, I want to set few custom headers to the JMS message being published to the topic. I googled and could not find any example which does this. Can you help ?

developer
  • 19,553
  • 8
  • 40
  • 57

2 Answers2

21

You can add custom properties by using convertAndSendmethod from JmsTemplate by sending MessagePostProcessor as shown below:

jmsTemplate.convertAndSend("product.topic", product, new MessagePostProcessor() {
        @Override
        public Message postProcessMessage(Message message) throws JMSException {
            message.setStringProperty("my_property", "my_value");
            return message;
        }
    });
developer
  • 19,553
  • 8
  • 40
  • 57
victor gallet
  • 1,599
  • 13
  • 24
  • `message.clearProperties();` Should Add this line before `setStringProperty` . Otherwise `javax.jms.MessageNotWriteableException` would be thrown – Vijay P R Jul 28 '17 at 10:04
  • 4
    jmsTemplate.convertAndSend("product.topic", product, m -> { m.setStringProperty("my_property", "my_value"); return m }); – Monish Sen May 29 '18 at 13:46
  • what if I want to add ByteBuffer property, for example SQS supports Binary message attribute datatype, but I'm not sure that Spring JMS abstraction supports those? – Mikhail Matvienko Dec 30 '19 at 14:05
3

Try something like this:

@SendTo("product.topic")
public Message<Product> send() {
    Product product = new Product();
    product.setName("abcd");
    product.setPrice(10);

    return MessageBuilder
            .withPayload(product)
            .setHeader("code", 1234) // custom header name and value
            .build();
}

Reference: https://spring.io/blog/2014/04/30/spring-4-1-s-upcoming-jms-improvements

Monzurul Haque Shimul
  • 7,005
  • 2
  • 19
  • 34