我的任务是为JMS客户评估ActiveMQ Artemis。我有RabbmitMQ经验,但没有使用ActiveMA Artemis / JMS。
我在本地计算机上安装了Artemis,根据说明创建了一个新代理,并将其设置为Windows服务。 Windows服务启动和停止就好了。我没有对broker.xml文件进行任何更改。
对于我的第一个测试,我正在尝试从独立的Java程序执行JMS Queue生成/使用。我正在使用“使用JMS”部分中的Artemis用户手册中的代码(不使用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());
当我运行此代码时,出现以下错误:
警告:AMQ212054:目标地址= jms.queue.OrderQueue被阻止。如果系统配置为阻止,请确保使用此配置上的消息。
如果这是服务器端设置,或者生产者发送没有阻止,我的研究尚无定论。我一直无法找到一个具有阻塞布尔值的生成器发送方法,只有持久性。关于在哪里集中注意力的想法?
编辑:添加到专用于此队列的broker.xml的新地址设置元素:
<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>
答案 0 :(得分:8)
我在用户手册的进一步研究中发现了这一点:
max-disk-usage我们应该从磁盘使用的最大数据百分比。 磁盘已满时,系统将阻塞。默认= 100
并且在服务启动后的日志中尚未发布消息:
WARN [org.apache.activemq.artemis.core.server] AMQ222210:存储使用超出了最大磁盘使用量。系统将开始阻止生产者。
所以我认为无论我的地址设置如何,它都会开始阻止。查看broker.xml中的max-disk-usage设置,它被设置为90.文档默认为100,我设置为,没有启动日志警告,我的测试pub / sub代码现在可以工作。
答案 1 :(得分:0)
当地址策略设置为BLOCK并达到内存时,会发出此警告消息。检查broker.xml中设置的address policy。如果设置为BLOCK,请将其更改为PAGE。或使用OrderQueue中的待处理消息。