当前位置: 首页 > 知识库问答 >
问题:

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

邓建柏
2023-03-14

Azure服务总线可以发送计划的消息。使用此处描述的AMQP协议发送计划消息:https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-amqp-request-response#message-operations

调度消息。要求

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

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

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

|com.microsoft: server-timeout|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;
        }
    });
}

-产生序号消息

共有2个答案

籍靖
2023-03-14

更新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);
}
令狐翰
2023-03-14

此代码可用于:

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;
        }
    });
}
 类似资料:
  • 我正在使用Python开发一个集成,从不同的Azure服务总线主题和队列中读取消息。但我在安排留言时有个问题。我无法查看计划的邮件。我想偷看它们,然后要么完成,要么让它们不读,直到预定的时间。我尝试查看队列和主题,但我找不到任何文档说明如何查看其中任何一个排定的消息。有人设法做到了吗?应该是一个非常常见的用例。在使用标准的REST调用时也没有发现任何问题。

  • 我想使用JMS向Azure服务总线发送预定消息。我的代码基于。我已经为给定的问题找到了一个解决方案,但它使用,其中包含,它允许编辑消息注释并添加Azure服务总线正确识别和处理的一些属性。我的消息iml缺少那个方法。 我在node.js的官方文档和实现中发现,要使用Azure服务总线安排消息,您需要发送具有有效json的标头。其他标头/属性将标记为并被Azure服务总线忽略。 关于JMS的azur

  • 我正在为Azure服务总线使用最新的Java绑定(V3.1.3):https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/servicebus 当我创建一个新的队列客户端,计划一条消息,然后取消它... ...代码似乎按预期工作:活动消息计数变为0。但是一旦被调度的消息到达它应该被调度的时间(我测试了10秒和100秒以后),消息有时会

  • 我是老学校窗户蔚蓝建筑师。使用服务总线主题将消息传递给工作者角色。

  • 如果消息中毒,Azure服务总线队列触发函数将执行默认策略,将消息发送到死信队列。但是,我们是否可以手动将消息发送到死信队列?有几次,由于某种内部或业务异常,我们不希望Azure Function执行其默认策略,我们希望将其他信息绑定到消息,并手动将其发送到Azure服务总线截止日期队列。 在以前使用BrokeredMessage对象的版本中,有一个名为 然而,在最新的Functino 2中。十、

  • 使用Azure Service Bus-Topics,我想实现一个解决方案,其中一旦生产者将消息发送到Topic,消息就会被发送/通知给最终消费者(比如队列)。 我理解主题作为pub/sub模型工作,其中订阅者需要从订阅中读取消息。但是我正在寻找一种类似队列的工作方法(当接收到任何消息时,它会触发web作业/服务)。 首先,我想知道服务巴士的主题是否是正确的选择?接下来,如果可能的话,实现一个变通