azureamqpazureservicebusjmstemplate

How to send scheduled message to Azure Service Bus with JMS


Azure Service Bus has capability to send scheduled messages. Sending scheduled messageses with AMQP protocol described here: https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-amqp-request-response#message-operations

Schedules messages. Request

The request message must include the following application properties:

| Key | Value | Type | Required | Value Contents

| operation | string | Yes | com.microsoft:schedule-message

| com.microsoft:server-timeout | uint | No | Operation server timeout in milliseconds.|

I work with Azure Service Bus with java JmsTemplate from Spring Framework. How map message headers to send scheduled message?

    @Test
public void sendMessageWithHeaders() {


    jmsTemplate.send("test-topic-2", new MessageCreator() {
        @Override
        public Message createMessage(Session session) throws JMSException {
            TextMessage textMessage = session.createTextMessage("test-123");
            ((JmsTextMessage) textMessage).setValidatePropertyNames(false);
            textMessage.setStringProperty("operation", "com.microsoft:schedule-message");

            textMessage.setIntProperty("com.microsoft:server-timeout", 100000);
            return textMessage;
        }
    });
}

-produce ordinal message


Solution

  • This code work:

    Azure SB use undocumented message annotation header x-opt-scheduled-enqueue-time

    static final long ONE_MINUTE_IN_MILLIS=60000;//millisecs
    
    @Test
    public void sendMessageWithHeaders() {
    
    
        jmsTemplate.send(queueName, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                TextMessage textMessage = session.createTextMessage("test-123");
                ((JmsTextMessage) textMessage).setValidatePropertyNames(false);
    
                org.apache.qpid.proton.message.Message amqpMessage = ((AmqpJmsTextMessageFacade)((JmsTextMessage)textMessage).getFacade()).getAmqpMessage();
                HashMap applicationPropertiesMap = new HashMap();
                applicationPropertiesMap.put("operation", "com.microsoft:schedule-message");
                applicationPropertiesMap.put("com.microsoft:server-timeout", 100000000);
                amqpMessage.setApplicationProperties(new ApplicationProperties(applicationPropertiesMap));
    
                Calendar date = Calendar.getInstance();
                long t= date.getTimeInMillis();
                Date afterAddingTenMins=new Date(t + (10 * ONE_MINUTE_IN_MILLIS));
    
                amqpMessage.getMessageAnnotations().getValue().put(Symbol.valueOf("x-opt-scheduled-enqueue-time"), afterAddingTenMins);
    
                return textMessage;
            }
        });
    }