问题描述
我正在尝试删除ActiveMQ中的预定作业,到目前为止还算不上成功。
使用NMS API或Amqpnetlite在消息中创建时间表(openwire lib除外,因为该消息未更新且不能在netstandard / netcore上使用)
用于通过NMS创建计划的示例代码,与AMQP lib相同:
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();
这部分在浏览器控制台中产生以下结果,这就是我愿意删除的内容:
我已经读过this other question and answer,也读过active mq system constants,但是无法删除日程表。还尝试浏览文档,但到目前为止找不到有用的东西
ActiveMQ是否甚至支持以编程方式管理日程表?一个AMQP解决方案会很棒,但是NMS也值得赞赏。
解决方法
可接受的答案有效且正确。原来O(N^2)
没有保存调度程序ID。
如果有兴趣,这里是干净的C#源代码:
scheduledMessage.NMSMessageId
流程是这样的:从某些队列中获取消息,如果满足某些条件,则完全放弃计划。
,您可以通过STOMP,AMQP或仅通过JMS客户端在ActiveMQ中管理计划的作业。我已经written about this before展示了如何使用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客户端或其他procotol客户端排定的排定消息发送,请执行以下操作:
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);
here记录了在使用调度程序时可以使用的全套消息属性值,在AMQP中,只需将每个字符串的字面值用作您将作业ID设置为远程的“应用程序属性”值,或在NMS客户端中,它只是您要删除的作业ID的字符串消息属性。
通过AMQP进行此操作时有一个警告,那就是您需要确保代理正在使用JMS转换器?transport.transformer=jms"
,请参见AMQP documentation中的ActiveMQ 5。