如何使用JMS将计划消息发送到Azure服务总线

如何使用JMS将计划消息发送到Azure服务总线,azure,amqp,azureservicebus,jmstemplate,Azure,Amqp,Azureservicebus,Jmstemplate,Azure服务总线具有发送预定消息的功能。 使用此处描述的AMQP协议发送计划消息: 调度消息。 请求 请求消息必须包括以下应用程序属性: |键|值|类型|必需|值内容 |操作|字符串|是| com.microsoft:计划消息 |微软:服务器超时| uint | No |操作服务器超时(毫秒)| 我使用Spring框架中的JavaJMSTemplate使用Azure服务总线。 如何映射邮件标题以发送计划邮件 @Test public void sendMessageWithHeader

Azure服务总线具有发送预定消息的功能。 使用此处描述的AMQP协议发送计划消息:

调度消息。 请求

请求消息必须包括以下应用程序属性:

|键|值|类型|必需|值内容

|操作|字符串|是| com.microsoft:计划消息

|微软:服务器超时| uint | No |操作服务器超时(毫秒)|

我使用Spring框架中的JavaJMSTemplate使用Azure服务总线。 如何映射邮件标题以发送计划邮件

    @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;
        }
    });
}
-生成顺序消息

此代码起作用:

Azure SB使用未记录的消息批注头
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;
        }
    });
}
此代码可用于:

Azure SB使用未记录的消息批注头
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;
        }
    });
}
2021年更新: 正如您在我的答案中所看到的,您需要一种稍微不同的方法,因为
.getAmqpMessage()
不再可用:

public void sendDelayedMessage() {
    final var now = ZonedDateTime.now();
    jmsTemplate.send("test-queue", session -> {
        final var tenMinutesFromNow = now.plusMinutes(10);
        final var textMessage = session.createTextMessage("Hello Service Bus!");
        ((JmsTextMessage) textMessage).getFacade().setTracingAnnotation("x-opt-scheduled-enqueue-time", Date.from(tenMinutesFromNow.toInstant()));
        return textMessage;
    });
    log.info("Sent at: " + now);
}
2021年更新: 正如您在我的答案中所看到的,您需要一种稍微不同的方法,因为
.getAmqpMessage()
不再可用:

public void sendDelayedMessage() {
    final var now = ZonedDateTime.now();
    jmsTemplate.send("test-queue", session -> {
        final var tenMinutesFromNow = now.plusMinutes(10);
        final var textMessage = session.createTextMessage("Hello Service Bus!");
        ((JmsTextMessage) textMessage).getFacade().setTracingAnnotation("x-opt-scheduled-enqueue-time", Date.from(tenMinutesFromNow.toInstant()));
        return textMessage;
    });
    log.info("Sent at: " + now);
}
.getAmqpMessage()不适用于我的AmqpJmsTextMessageFacade类。可能是他们删除了它..getAmqpMessage()对我来说不适用于AmqpJmsTextMessageFacade类。也许他们把它拿走了。