Search code examples
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;
            }
        });
    }