如何在activemq 5.8.0中删除空队列(即没有队列名称)?

如何在activemq 5.8.0中删除空队列(即没有队列名称)?,activemq,Activemq,如何在activemq 5.8.0中删除空队列(即没有队列名称) 当我在active 5.8.0控制台中使用delete按钮删除空队列时,空队列出现问题,然后抛出一些错误,如下所示 i、 错误 处理此请求时发生异常,请检查日志以了解 更多信息 你下一步想做什么 在早期版本中,在使用空名称创建队列方面存在一些问题。如果不简单地删除所有文件并重新开始,我不确定您是否能够成功地删除队列 要尝试的一件事是使用JConsole连接到代理并调用队列MBean上的remove操作 我们最近遇到了这个问题,我在

如何在activemq 5.8.0中删除空队列(即没有队列名称)

当我在active 5.8.0控制台中使用delete按钮删除空队列时,空队列出现问题,然后抛出一些错误,如下所示

i、 错误

处理此请求时发生异常,请检查日志以了解 更多信息

你下一步想做什么


在早期版本中,在使用空名称创建队列方面存在一些问题。如果不简单地删除所有文件并重新开始,我不确定您是否能够成功地删除队列


要尝试的一件事是使用JConsole连接到代理并调用队列MBean上的remove操作

我们最近遇到了这个问题,我在上面记录了这个问题:

我们正在使用mkahadb(配置为每个目的地使用一个单独的目录),并且能够简单地删除相应的目录(/data//kaha/queue#3a#2f#2f)并重新启动AMQ


否则,请尝试JMX,否则您将需要清除整个消息存储并按照Tim的建议重新开始…

这里是我不久前编写的一些代码,用于处理类似问题。它使用JMX进行连接,并删除从未使用过的任何空队列

import javax.management.JMX;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

import org.apache.activemq.broker.jmx.BrokerViewMBean;
import org.apache.activemq.broker.jmx.QueueViewMBean;

public class CleanQueues {
    public static void main(String[] args) throws Exception {
        if (args.length != 1 && args.length != 2) {
            System.out.println("Usage: CleanQueues host [port]");
            System.exit(1);
        }
        String host = args[0];
        String port = "1099";
        if (args.length == 2) {
            port = args[2];
        }
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://"+host+":"+port+"/jmxrmi");
        JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
        MBeanServerConnection connection = jmxc.getMBeanServerConnection();
        ObjectName broker = null;
        for (ObjectName objectName : connection.queryNames(new ObjectName("org.apache.activemq:BrokerName=*,Type=Broker"),null)) {
            broker = objectName;
        }
        if (broker == null) {
            System.out.println("Could not find broker name.");
            System.exit(2);
        }
        BrokerViewMBean proxy = JMX.newMBeanProxy(connection, broker, BrokerViewMBean.class);

        for (ObjectName n : proxy.getQueues()) {
            QueueViewMBean q = JMX.newMBeanProxy(connection, n, QueueViewMBean.class);
            if (q.getDispatchCount() == 0 && q.getConsumerCount() == 0) {
                System.out.println("Removing queue: "+q.getName());
                proxy.removeQueue(q.getName());
            }
        }
    }
}

使用JConsole对我来说效果很好,只需使用空值字段调用removeQueue。