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

使用JMS为Azure Service Bus计划消息

秦毅
2023-03-14

我想使用JMS向Azure服务总线发送预定消息。我的代码基于org.apache.qpid.jms.message.JmsMessage。我已经为给定的问题找到了一个解决方案,但它使用org.apache.qpid.proton.message.Message,其中包含. getMessageAnnotions(),它允许编辑消息注释并添加Azure服务总线正确识别和处理的一些属性。我的消息iml缺少那个方法。

我在node.js的官方文档和实现中发现,要使用Azure服务总线安排消息,您需要发送具有有效json的标头BrokerProperties/brokerProperties。其他标头/属性将标记为客户属性并被Azure服务总线忽略。

关于JMS的azure官方文档表示,JMS API不正式支持设置ScheduledEnqueueTimeUtc。但可以通过设置属性手动实现。

所以当我向队列发送消息时,我可以在lambda中发布处理并设置一些属性:

jmsTemplate.convertAndSend(queue, payload, message -> {
    var date = Date.from(ZonedDateTime.now(ZoneId.of("UTC")).plus(delay, ChronoUnit.MILLIS).toInstant());
    var brokerProps = Map.of("ScheduledEnqueueTimeUtc", date.toGMTString());
    message.setStringProperty(
        "brokerProperties",
        objectMapper.writeValueAsString(brokerProps)
    );
    return message;
});

但它不起作用。消息到达了队列,但当我尝试在Azure上的Service Bus Explorer上查看它时,它会在浏览器控制台中抛出错误,操作将永远持续。我猜设置该属性会对服务总线产生一些影响。我还尝试发送一个以字符串形式显示日期的地图(使用Azure使用的日期格式),如“ScheduledEnqueueTimeUtc”,“2021 3月25日星期四12:54:00 GMT”,但服务总线也会将其识别为错误(窥视会一直持续,浏览器控制台中会抛出错误)。

我尝试过设置字符串属性,例如x-opt-调度-enqueue-timex-ms-调度-enqueue-time,我在SO上的其他线程中找到了这些属性,但它们都不适用于我的示例。

我看到Microsoft为Java提供了一些库来与Azure Service Bus通信,但我需要在代码中保持与云提供商的独立性,并且不包括任何额外的lib。

是否有使用包org.apache.qpid.jms.message.JmsMessage中的JMS消息实现为Azure服务总线设置BrokerProperties的示例?

共有1个答案

盖泽宇
2023-03-14

我的团队目前面临着同样的问题。

我们发现SchduledEnqueueTimeUtc属性是在MessageAnnotationsMap中设置的。不幸的是,JMS使用的org.apache.qpid.jms.provider.amqp.message.AmqpJmsMessageFacade将getter和setter设置为包私有的。但是我们发现您可以使用setTracingAnnoection(String key, Object value)方法。

例子:

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

非常感谢我的队友!!

 类似资料:
  • 在本章中,我们将学习如何编写一个简单的测试计划来测试Java Messaging Service(JMS)。 JMS支持两种类型的消息传递 - Point-to-Point messaging - 队列消息传递通常用于发送方期望响应的事务。 消息传递系统与普通HTTP请求完全不同。 在HTTP中,单个用户发送请求并获得响应。 Topic messaging - 主题消息通常称为发布/订阅消息。 主

  • Azure服务总线可以发送计划的消息。使用此处描述的AMQP协议发送计划消息:https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-amqp-request-response#message-operations 调度消息。要求 请求消息必须包括以下应用程序属性: |键|值|类型|必需|值内容 |操作|字符

  • 在本节中,我们将学习如何编写一个简单的测试计划来测试Java Messaging Service(JMS)。 出于测试目的,我们使用Apache ActiveMQ。有各种JMS服务器,如:glassfish3,IBM WebSphere MQ(以前称为MQSeries),Tibco等。 在继续本节之前,请按照以下简单步骤在系统上安装Apache ActiveMQ。 从以下链接下载最新版本的Apac

  • 主要内容:创建JMeter测试计划,添加JMS订阅服务器和发布服务器,添加监听器,保存并执行测试计划,验证输出现在编写一个JMeter测试计划来测试JMS提供程序。 对于此测试,我们必须创建一个订阅者和一个发布者。 创建JMeter测试计划 进入到JMeter/bin文件夹,双击文件以启动JMeter界面。 单击“Test Plan”节点。 将此测试计划节点重命名为JMS_topic_test。 选择JMS_topic_test 节点,然后右键单击所选项。 鼠标悬停在“Add”选项上,然后将显示

  • 构建JMS主题测试计划 现在让我们编写一个JMeter测试计划来测试JMS提供程序。 我们将创建一个订阅者和一个发布者。 我们将创建一个线程组并将每个线程组设置为两次迭代 首先让我们从/home/manisha/apache-jmeter2.9/bin/jmeter.sh.启动JMeter /home/manisha/apache-jmeter2.9/bin/jmeter.sh. 。 添加用户 现

  • 我想建立一个单一的Spring Boot应用程序,同时做多种不同的任务。我在互联网上做了研究,但我找不到任何出路。我来详细说说。我希望每隔一段时间启动一次作业,例如一天一次。我可以用Spring石英来做。我也想在一个专用的互联网地址上听信息。消息将来自Apache Kafka平台。因此,我想将Kafka集成用于Spring框架。它实际上是否适用(始终监听消息并按时执行计划的作业)