我该如何解决在新安装的ActiveMQ Artemis上出现的阻塞问题?

10

我被指派评估ActiveMQ Artemis用于JMS客户端。我有RabbmitMQ的经验,但没有使用ActiveMQ Artemis和JMS的经验。

我将Artemis安装到我的本地机器上,按照说明创建了一个新代理,并将其设置为Windows服务。Windows服务可以正常启动和停止。我没有对broker.xml文件进行任何更改。

对于我的第一个测试,我正在尝试从独立的Java程序执行JMS队列生产/消费。我正在使用Artemis用户手册中“使用JMS”部分的代码(不使用JNDI):

TransportConfiguration transportConfiguration = new TransportConfiguration(NettyConnectorFactory.class.getName());
ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF,transportConfiguration);

Queue orderQueue = ActiveMQJMSClient.createQueue("OrderQueue");
Connection connection = cf.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

MessageProducer producer = session.createProducer(orderQueue);
MessageConsumer consumer = session.createConsumer(orderQueue);

connection.start();

TextMessage message = session.createTextMessage("This is an order");
producer.send(message);

TextMessage receivedMessage = (TextMessage)consumer.receive();
System.out.println("Got order: " + receivedMessage.getText());

当我运行这段代码时,我会得到以下错误:
WARN: AMQ212054: Destination address=jms.queue.OrderQueue is blocked. If the system is configured to block make sure you consume messages on this configuration.

我的研究还没有得出结论,这是一个服务器端设置还是生产者发送时不阻塞的问题。我找不到具有阻塞布尔值的生产者发送方法,只有持久性。你有什么建议?谢谢。

编辑:在broker.xml中添加了新的address-setting元素,专门用于此队列:

<address-setting match="jms.queue.OrderQueue">
    <max-size-bytes>104857600</max-size-bytes>
    <page-size-bytes>10485760</page-size-bytes>
    <address-full-policy>PAGE</address-full-policy>
</address-setting>

尽管出现了AMQ212054警告消息,消费者是否成功读取了TextMessage? - Awan Biru
3个回答

21

我在进一步查阅用户手册后找到了以下内容:

max-disk-usage 硬盘上可用数据的最高使用百分比。当磁盘已满时,系统会发生阻塞。默认值为100。

在服务启动后日志中没有发布任何消息:

WARN [org.apache.activemq.artemis.core.server] AMQ222210: 存储使用已超出最大磁盘使用量。系统将开始阻止生产者。

因此,无论我的地址设置如何,它都会开始阻止。查看 broker.xml 文件中的 max-disk-usage 设置,发现其被设置为 90。文档默认值为 100,我将其设置为 100,启动日志没有警告,并且我的测试 pub/sub 代码现在可以正常工作。


值得注意的是,文档引用的max-disk-usage的默认值是代码默认值,因此如果您在broker.xml中不设置<max-disk-usage>,它将为100。但是,create命令输出的broker.xml使用90作为<max-disk-usage> - Justin Bertram

0

当地址策略设置为BLOCK且内存达到上限时,会出现此警告消息。请检查broker.xml中设置的地址策略。如果它被设置为BLOCK,请将其更改为PAGE。或从OrderQueue中消费待处理的消息。


1
谢谢您的回复,我已经检查过了,两个地址设置条目都设置为PAGE以进行地址全策略。我进行了进一步搜索,并找到了这个页面:https://communities.ca.com/thread/241725820。我的broker.xml缺少max-size-bytes和page-size-bytes条目,所以我添加了它们。但是现在加上这些后,Broker无法启动,我收到了Windows服务启动错误。 - user640118
这是一个通用的服务无法启动的消息。然而,我在您提供的链接上进行了一些研究。我添加了一个专门针对此队列的附加地址设置元素(请参见原帖中的新元素)。现在代理已经成功启动,但我仍然收到阻塞消息。 - user640118

0

默认情况下,最大磁盘使用率设置为90%。如果剩余的可用空间大小低于10%,则会显示此警告消息,并且在您调整参数或释放超过10%的空间之前,将不会收到任何消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接