activemq - 有没有办法以编程方式删除 ActiveMQ 作业计划?
问题描述
我正在尝试删除 ActiveMQ 中的计划作业,但到目前为止还没有运气。
使用NMS API或Amqpnetlite在消息中创建计划(openwire lib 除外,因为该库未更新且不能在 netstandard/netcore 上使用)
用于使用 NMS 创建计划的示例代码,与 AMQP 库相同:
var factory = new Apache.NMS.ActiveMQ.ConnectionFactory(brokerUri);
IConnection connection = factory.CreateConnection(user, password);
connection.Start();
ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
IDestination dest = session.GetQueue(destination);
IMessageProducer producer = session.CreateProducer(dest);
producer.DeliveryMode = MsgDeliveryMode.NonPersistent;
var msg = session.CreateTextMessage("Sample text message");
msg.Properties.SetString("AMQ_SCHEDULED_CRON", "* * * * *");
producer.Send(msg);
connection.Close();
这部分在浏览器控制台中产生以下结果,这就是我愿意删除的:
我已经阅读了这个其他问题和答案,还有活动的 mq 系统常量,但没有办法删除计划。还尝试浏览文档,但到目前为止找不到任何有用的东西
ActiveMQ 是否甚至支持以编程方式管理计划?AMQP 解决方案会很棒,但 NMS 也值得赞赏。
解决方案
您可以通过 STOMP、AMQP 或仅从 JMS 客户端管理 ActiveMQ 中的计划作业。在展示如何使用 ActiveMQ Java 客户端执行此操作之前,我已经写过此内容,但原理是相同的。您可以发送带有特定标头集的消息,这些标头将对预定的消息进行操作。
要浏览预定消息的集合,您需要执行以下操作:
Connection connection = createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// Create the Browse Destination and the Reply To location
Destination requestBrowse = session.createTopic(ScheduledMessage.AMQ_SCHEDULER_MANAGEMENT_DESTINATION);
Destination browseDest = session.createTemporaryQueue();
// Create the "Browser"
MessageConsumer browser = session.createConsumer(browseDest);
connection.start();
// Send the browse request
MessageProducer producer = session.createProducer(requestBrowse);
Message request = session.createMessage();
request.setStringProperty(ScheduledMessage.AMQ_SCHEDULER_ACTION,
ScheduledMessage.AMQ_SCHEDULER_ACTION_BROWSE);
request.setJMSReplyTo(browseDest);
producer.send(request);
Message scheduled = browser.receive(5000);
while (scheduled != null) {
// Do something clever...
}
返回的消息包含有关先前已添加的实际计划消息作业的信息。获取作业 ID 允许您完全取消所述消息的传递。
要删除使用 Java 客户端、AMQP 客户端或其他协议客户端安排的预定消息发送,您需要执行以下操作:
Message remove = session.createMessage();
remove.setStringProperty(ScheduledMessage.AMQ_SCHEDULER_ACTION,
ScheduledMessage.AMQ_SCHEDULER_ACTION_REMOVE);
remove.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_ID,
scheduled.getStringProperty(ScheduledMessage.AMQ_SCHEDULED_ID));
producer.send(remove);
使用调度程序时可以使用的全套消息属性值在此处记录,在 AMQP 中只需使用每个字符串文字作为您使用作业 ID 设置为远程的应用程序属性值,或者在 NMS 客户端中使用它' d 只是带有要删除的作业 ID 的字符串键消息属性。
但是在通过 AMQP 执行此操作时有一个警告,那就是您需要确保代理正在使用 JMS 转换器,?transport.transformer=jms"
请参阅 ActiveMQ 5 的AMQP 文档。
推荐阅读
- angular - Angular - 解析器和守卫
- c# - 无法将 JSON 参数作为请求正文映射到 POST API
- node.js - 无法在 Sequelize v6 中使用原型或实例方法
- javascript - Web 语音 API 语法
- angular - 添加了下拉列表,但在使用 angular 9 中另一个组件的 array.push 时,文本内部变为空
- acumatica - 无法将字符串作为字典 Acumatica 2019R2 中的第一个参数(设备集线器打印相关)
- jquery - 动态添加的输入组验证问题
- javascript - 如何使用 javascript 将我的文件导入到 app、js?
- python - 简单的登录页面程序在 Tkinter 中产生属性错误
- python - Pandas 使用文本列重新采样