4

我一直在评估 ActiveMQ 作为候选消息代理。我编写了一些测试代码来尝试了解 ActiveMQ 的性能限制。

我可以通过尽可能快地发送消息来在代理中产生失败状态,如下所示:

try {
    while(true) {
        byte[] payload = new byte[(int) (Math.random() * 16384)];
        BytesMessage message = session.createBytesMessage();
        message.writeBytes(payload);
        producer.send(message);
} catch (JMSException ex) { ... }

我很惊讶这条线

producer.send(message);

当代理进入失败状态时阻塞。我希望会抛出一些异常,所以会有一些迹象表明经纪人失败了。

我意识到我的测试代码正在向代理发送垃圾邮件,并且我希望代理会失败。但是,我更希望经纪人“大声”失败,而不是简单地阻止。

这是不切实际的期望吗?

更新:

Uri 的回答引用了 3 月份提交的 ActiveMQ 错误报告。错误描述包括一个听起来像我正在寻找的提案:“如果传输上的请求有超时(这是为了捕获失败场景,所以一些不应该合理发生的事情),事情就会出错而不是而不是建立等待线程。”

但是,在 8 个月后,该错误目前已通过单次投票取消分配。所以我想问题仍然存在,这是 ActiveMQ 应该(将会?)实现的吗?

4

3 回答 3

5

您正在测试所有消息代理必须处理的“慢消费者”和生产者流程控制问题。你想让生产者失败,阻止他们还是假脱机到磁盘?

基本上,ActiveMQ 中的开箱即用默认设置是块生产者。但是您可以将消息游标配置为假脱机到磁盘

顺便说一句,您没有说您是使用队列/主题还是持久/非持久;如果您使用的是非持久主题,则可以使用其他策略来丢弃消息等。

于 2008-12-05T16:02:05.537 回答
1

显然有一个已知问题,不确定是否已修复:

https://issues.apache.org/activemq/browse/AMQ-1625

于 2008-12-05T16:05:14.797 回答
0

不确定 ActiveMQ 配置,但其他 JMS 提供程序有各种配置选项 - 因此您也许可以让 ActiveMQ 在这种情况下按照您的意愿行事。

我知道 Fiorano 可以选择在这种情况下指定提供者是否阻止。

于 2008-12-05T15:08:30.077 回答