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

有没有办法以编程方式删除ActiveMQ作业计划?,activemq,nms,apache-nms,amqp.netlite,Activemq,Nms,Apache Nms,Amqp.netlite,我正在尝试删除ActiveMQ中的计划作业,但到目前为止没有成功 计划是使用openwire库或openwire库之外的消息创建的,因为该库未更新,无法在netstandard/netcore上使用 用于使用NMS创建计划的示例代码,与使用AMQP lib所做的相同: var factory = new Apache.NMS.ActiveMQ.ConnectionFactory(brokerUri); IConnection connection = factory.CreateConnecti

我正在尝试删除ActiveMQ中的计划作业,但到目前为止没有成功

计划是使用openwire库或openwire库之外的消息创建的,因为该库未更新,无法在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();
这一部分在浏览器控制台中产生以下结果,这就是我愿意删除的内容:

我也读过,但日程安排不可能被删除。还试图浏览文档,但迄今为止找不到任何有用的内容


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...
    }
    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);
返回的消息包含以前添加的实际计划消息作业的信息。获取作业Id允许您完全取消所述消息的传递

要删除使用Java客户端、AMQP客户端或其他procotol客户端计划的消息发送,请执行以下操作:

    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...
    }
    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设置为remote,或者在NMS客户端中,它只是一个字符串键消息属性,包含要删除的作业Id


但是,在通过AMQP执行此操作时有一个警告,那就是您需要确保代理正在使用JMS transformer?transport.transformer=jmsse。请参阅ActiveMQ 5。您可以通过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...
    }
    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);
返回的消息包含以前添加的实际计划消息作业的信息。获取作业Id允许您完全取消所述消息的传递

要删除使用Java客户端、AMQP客户端或其他procotol客户端计划的消息发送,请执行以下操作:

    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...
    }
    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设置为remote,或者在NMS客户端中,它只是一个字符串键消息属性,包含要删除的作业Id


但是,在通过AMQP执行此操作时有一个警告,那就是您需要确保代理正在使用JMS transformer?transport.transformer=jmsse。请查看ActiveMQ 5的答案。

接受的答案有效且正确。结果表明scheduledMessage.NMSMessageId没有保存计划程序id

如果有人感兴趣,下面是干净的C源代码:

var factory = new Apache.NMS.ActiveMQ.ConnectionFactory(brokerUri);
IConnection connection = factory.CreateConnection(userName, password);

var session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
var requestBrowse = session.GetTopic("ActiveMQ.Scheduler.Management");
var queue = session.GetQueue(queueName);
var consumer = session.CreateConsumer(queue);

connection.Start();

var producer = session.CreateProducer(requestBrowse);
var scheduledMessage = consumer.Receive(TimeSpan.FromSeconds(10));
if (scheduledMessage != null)
{
    // do check with persistent storage, if schedule is canceled, remove it:
    var remove = session.CreateMessage();
    // get prop names from : http://activemq.apache.org/maven/apidocs/constant-values.htm
    remove.Properties["AMQ_SCHEDULER_ACTION"] = "REMOVE";
    remove.Properties["scheduledJobId"] = scheduledMessage.Properties.GetString("scheduledJobId");
    producer.Send(remove);
}

producer.Close();
session.Close();
connection.Close();


流程是这样的:从某个队列中获取消息,如果满足某些条件,则完全放弃计划。

接受的答案有效且正确。结果表明scheduledMessage.NMSMessageId没有保存计划程序id

如果有人感兴趣,下面是干净的C源代码:

var factory = new Apache.NMS.ActiveMQ.ConnectionFactory(brokerUri);
IConnection connection = factory.CreateConnection(userName, password);

var session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
var requestBrowse = session.GetTopic("ActiveMQ.Scheduler.Management");
var queue = session.GetQueue(queueName);
var consumer = session.CreateConsumer(queue);

connection.Start();

var producer = session.CreateProducer(requestBrowse);
var scheduledMessage = consumer.Receive(TimeSpan.FromSeconds(10));
if (scheduledMessage != null)
{
    // do check with persistent storage, if schedule is canceled, remove it:
    var remove = session.CreateMessage();
    // get prop names from : http://activemq.apache.org/maven/apidocs/constant-values.htm
    remove.Properties["AMQ_SCHEDULER_ACTION"] = "REMOVE";
    remove.Properties["scheduledJobId"] = scheduledMessage.Properties.GetString("scheduledJobId");
    producer.Send(remove);
}

producer.Close();
session.Close();
connection.Close();


流程是这样的:从某个队列中获取消息,如果满足某些条件,则完全放弃计划。

感谢您的回答,我已经添加了一个指向其他答案的链接,如下图所示,也请阅读博客。那么,我从哪里得到这个:scheduled.getStringProperty?我已经剪切并粘贴了链接文章中的代码,您应该认真阅读,详细解释了这一点。啊,现在我看到了混乱。我正在尝试删除计划作业,而不是消息这正是它所做的,请删除您以前创建的计划作业。确定将用C翻译此内容,然后再试一次。我想它只是删除了一条消息。谢谢你的回答,我已经添加了一个链接到另一个答案像这样,也阅读了博客。那么,我从哪里得到这个:scheduled.getStringProperty?我已经剪切并粘贴了链接文章中的代码,您应该认真阅读,详细解释了这一点。啊,现在我看到了混乱。我正在尝试删除计划作业,而不是消息这正是它所做的,请删除您以前创建的计划作业。确定将用C翻译此内容,然后再试一次。我认为它只是删除了一个msg.NMSMessageID,它是代理或发送方分配的消息ID,该消息携带数据,并且永远不会映射到sch中的ID
eduler itselfNMSMessageID是代理或发送方分配的消息ID,该消息携带数据,并且永远不会映射到调度程序本身内部的ID