有没有办法以编程方式删除ActiveMQ作业计划?

问题描述

我正在尝试删除ActiveMQ中的预定作业,到目前为止还算不上成功。

使用NMS APIAmqpnetlite在消息中创建时间表(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();

这部分在浏览器控制台中产生以下结果,这就是我愿意删除内容

Code result

我已经读过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。

>