这是分布式机制的现实期望吗?

时间:2008-12-05 15:03:22

标签: java distributed activemq

我一直在评估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应该(将会)实现的吗?

3 个答案:

答案 0 :(得分:5)

您正在测试所有消息代理必须处理的'slow consumer' and producer flowcontrol问题。你想失败的生产者,阻止他们或假脱机到磁盘?

基本上,ActiveMQ中的开箱即用默认是阻止生产者。但你可以configure message cursors to spool to disk

BTW你没有说过你是使用队列/主题还是持久/非持久性;如果您使用非持久性主题,则可以使用其他策略来丢弃消息等。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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