gpt4 book ai didi

java - 使用 JMS 安排 Azure 服务总线的消息

转载 作者:行者123 更新时间:2023-12-05 02:01:04 24 4
gpt4 key购买 nike

我想使用 JMS 将计划消息发送到 Azure 服务总线。我的代码基于org.apache.qpid.jms.message.JmsMessage。我找到了针对给定问题的一种解决方案,但它使用 org.apache.qpid.proton.message.Message ,它具有 .getMessageAnnotations(),它允许编辑消息注释并添加一些由 Azure 服务总线正确识别和处理的属性。我的消息实现缺少该方法。

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

official azure docs about JMS表示设置 ScheduledEnqueueTimeUtc 不受 JMS API 官方支持。但可以通过手动设置属性来实现。

因此,当我将消息发送到队列时,我可以在 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 上的服务总线资源管理器上查看它时,它会在浏览器控制台中抛出错误,并且该操作将永远持续。我猜想设置该属性brokerProperties会对服务总线产生一些影响。我还尝试发送日期为字符串的 map (使用 Azure 使用的日期格式),例如 "ScheduledEnqueueTimeUtc", "Thu, 25 Mar 2021 12:54:00 GMT",但服务总线也会将其识别为错误(查看将永远持续,并在浏览器控制台中抛出错误)。

我尝试设置我发现的诸如 x-opt-scheduled-enqueue-timex-ms-scheduled-enqueue-time 之类的字符串属性在 SO 的其他线程中,但它们都不适用于我的示例。

我看到 Microsoft 提供了一些用于 Java 与 Azure 服务总线通信的库,但我需要在代码中保持与云提供商的独立性,并且不包含任何其他库。

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

最佳答案

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

我们发现 ScheduledEnqueueTimeUtc 属性在 MessageAnnotationsMap 中设置。不幸的是,JMS 使用的 org.apache.qpid.jms.provider.amqp.message.AmqpJmsMessageFacade 已将 getter 和 setter 设置为包私有(private)。但我们发现您可以使用 setTracingAnnotation(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);
}

证明: enter image description here

非常感谢我的teammate !!

关于java - 使用 JMS 安排 Azure 服务总线的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66798961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com