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



Azure 服务总线能够发送计划消息。 使用 AMQP 协议发送计划消息,如下所述:https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-amqp-request-response#message-operations

计划消息。 请求

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

|钥匙 | 价值 |类型 | 必填 | 价值内容

|运营 | 字符串 |是 |com.microsoft:schedule-message

|com.Microsoft:服务器超时 | 乌因特 | 否 | 操作服务器超时(毫秒级(。|

我使用 Azure Service Bus 和 Spring Framework 的 java JmsTemplate。 如何映射消息标头以发送计划消息?

@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;
}
});
}

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);
}

相关内容

  • 没有找到相关文章

最新更新