我可以在c#代码中从ActiveMQ队列中删除消息吗?

时间:2014-01-23 04:27:02

标签: activemq message-queue nms

我想为消息头中的每条消息设置一个唯一的guid,如果我想,我可以删除特定的消息,如果我愿意的话。 NMS中有没有api可以帮我删除邮件?我使用的是ActiveMQ 5.9.0和NMS 1.6.1

2 个答案:

答案 0 :(得分:0)

是的,尽管只有该目的地没有活跃的消费者。你可以这样做:

    protected static void DeleteDestination()
    {
        IConnectionFactory factory = new ConnectionFactory(ReplaceEnvVar(connectionURI));

        using (Connection connection = factory.CreateConnection() as Connection)
        {
            using (ISession session = connection.CreateSession())
            {
                IQueue queue = session.GetQueue(testQueueName);
                try
                {
                    connection.DeleteDestination(queue);
                }
                catch
                {
                }
            }
        }
    }

答案 1 :(得分:0)

非常有可能直接在不使用REST API的情况下直接从C#和NMS库执行单个删除。

我正在C#项目中使用NuGet的NMS 18.0作为我们的支持和维护工具Nodinite,这是许多monitoring agents中的一个的代码,在本例中为ActiveMQ。此代码用于删除单独选择的邮件。

此代码从队列(queueName)中删除了1条消息(messageId)

 internal static void  DeleteMessageFromQueue(ActiveMQOption activeMQOption, string queueName, string messageId)
    {
        IConnectionFactory factory = CreateConnectionFactory(activeMQOption);

        using (IConnection connection = factory.CreateConnection())
        {
            using (ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
            {
                using (IDestination destination = session.GetQueue(queueName))
                {
                    using (IMessageConsumer consumer = session.CreateConsumer(destination, $"JMSMessageID LIKE '%{messageId}%'"))
                    {
                        connection.Start();
                        var message = consumer.Receive(new TimeSpan(0, 0, 1));
                        consumer.Close();
                        connection.Close();
                        if (message == null)
                        {
                            throw new Exception($"Message '{messageId}' not found on queue '{queueName}'");
                        }
                    }
                }
            }                
        }            
    }

创建工厂的Helper方法(使用您需要用自己的代码替换的简单模型c#类,但示例应足够简单以遵循)

    public static Apache.NMS.ActiveMQ.ConnectionFactory CreateConnectionFactory(ActiveMQOption activeMQOption)
    {
        Uri connecturi = new Uri(activeMQOption.ConnectionString);
        Apache.NMS.ActiveMQ.ConnectionFactory factory = new Apache.NMS.ActiveMQ.ConnectionFactory(connecturi);
        if (activeMQOption.UseAuthentication)
        {
            factory.UserName = activeMQOption.User;
            factory.Password = activeMQOption.Password;
        }

        return factory;
    }