【问题标题】:Empty a jms queue in JBOSS 7 using HornetQ使用 HornetQ 在 JBOSS 7 中清空 jms 队列
【发布时间】:2013-10-30 15:46:05
【问题描述】:

我正在使用 jboss 7.1.1 final 和 HornetQ 2.2.13 final。

我配置了几个队列,其中一个是“满”消息,几千条。我无法删除这些消息。

我尝试使用 jboss cli 和命令删除它们 /subsystem=messaging/hornetq-server=default/jms-queue=Queue:remove-messages

它响应成功,但消息仍然存在......

我尝试使用带有 jmx 命令的 JConsole 删除它们。它以数字零响应,并且计数消息仍然相同。

我尝试在 Jboss 控制台中删除队列并重新启动 AS。再次配置队列后,消息仍然存在,导致其持久化。

唯一可行的方法是配置 hornetq 服务器以禁用standalone.xml 中的持久性。

有人知道如何使用 jconsole 或 jboss cli 吗?

【问题讨论】:

  • 如果不想让消息持久化,为什么还要配置持久化?
  • 我从来没有说过我不想保留消息...我的意思是禁用此功能,我能够从队列中删除消息。
  • 啊...显然这些消息是“正在发送中”。这与排队不同。

标签: jboss7.x jmx hornetq


【解决方案1】:

你所要做的就是调用方法:

来自 jboss-cli:

/subsystem=messaging/hornetq-server=default/jms-queue=testQueue:remove-messages

我刚刚通过添加大量消息(包括分页)尝试了您尝试过的确切版本。并且一切正常。

我将系统配置为分页,并使用它创建了几千条消息:

  HornetQConnectionFactory cf = HornetQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF, new TransportConfiguration(NETTY_CONNECTOR_FACTORY));
  Connection conn = cf.createConnection("guest", "hello");
  Session sess = conn.createSession(true, Session.SESSION_TRANSACTED);
  javax.jms.Queue queue = sess.createQueue("testQueue");
  MessageProducer prod = sess.createProducer(queue);

  for (int i = 0 ; i < 50000; i++)
  {
     TextMessage msg = sess.createTextMessage("hello " + i);
     prod.send(msg);
     if (i % 500 == 0)
     {
        System.out.println("Sent " + i);
        System.out.println("commit");
        sess.commit();
     }
  }
  sess.commit();
  conn.close();

然后我尝试了 remove 方法,它成功了:

/subsystem=messaging/hornetq-server=default/jms-queue=testQueue:remove-messages

如果这不起作用,有两种可能性:

  • 我们更改了在传递过程中锁定队列的方式。也许您遇到了一个已修复的错误,您将不得不迁移到更新的版本。

  • 您在消费者的交付中有队列。如果消息处于传递状态的消费者缓冲区中,我们无法删除消息。您必须删除消费者才能删除所有消息。

我在这里添加了这个答案,因为我做了很多研究试图复制你的问题,而且一切都像一个魅力。我需要更多关于发生了什么的信息。

我认为最好的是用户论坛,我们可以在其中进一步讨论。 SOF 将进行简单的问题/答案。这不是调查错误或类似问题的地方。

https://community.jboss.org/en/hornetq?view=discussions

【讨论】:

  • 您的测试是否启用了持久性?无论如何...这是我为我的问题找到的答案:community.jboss.org/thread/197030?start=0&tstart=0
  • 是的.. 已启用持久性。我基本上使用的是 Jaikiran 在他的回答中提供的方法。你只需要调用 remove-messages 就可以了
  • 在 Jaikiran 的回答下方查看 Justin Bertram 的回答。
  • 不管你是否向队列发送了 15k 条消息,它们的状态都会以正确的方式更改为“正在发送”,并且您无法删除它们。我想为我一直进行压力测试的测试环境改变这一点。
  • 您还可以尝试通过在客户端禁用消息缓冲来减少“正在传递”的消息数量。这可以通过在连接工厂配置中设置“consumer-window-size”来完成。虽然这可能会影响消费性能。
猜你喜欢
  • 1970-01-01
  • 2012-03-02
  • 2012-03-13
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 2011-10-10
  • 2010-12-26
  • 2016-10-07
相关资源
最近更新 更多