我想使用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-time
或x-ms-调度-enqueue-time
,我在SO上的其他线程中找到了这些属性,但它们都不适用于我的示例。
我看到Microsoft为Java提供了一些库来与Azure Service Bus通信,但我需要在代码中保持与云提供商的独立性,并且不包括任何额外的lib。
是否有使用包org.apache.qpid.jms.message.JmsMessage
中的JMS消息实现为Azure服务总线设置BrokerProperties
的示例?
我的团队目前面临着同样的问题。
我们发现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框架。它实际上是否适用(始终监听消息并按时执行计划的作业)