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