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

Java 这是分布式机制的现实期望吗?,java,distributed,activemq,Java,Distributed,Activemq,我一直在评估ActiveMQ作为候选消息代理。我编写了一些测试代码,试图了解ActiveMQ的性能限制 我可以通过以下方式尽可能快地发送消息,在代理中生成故障状态: try { while(true) { byte[] payload = new byte[(int) (Math.random() * 16384)]; BytesMessage message = session.createBytesMessage(); message.

我一直在评估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的回答引用了一份三月份提交的ActiveMQ错误报告。bug描述中包含了一个建议,听起来像我在寻找的:“如果传输上的请求有一个超时(这是为了捕捉失败场景,因此一些不合理的情况不会发生),那么事情就会出错,而不是构建等待线程。”


然而,8个月后,该缺陷目前未通过一次投票获得分配。因此,我想问题仍然存在,这是ActiveMQ应该(将会)实现的吗?

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

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

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

基本上,ActiveMQ中的开箱即用默认设置是阻止生产者。但是你可以


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

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


克里斯,谢谢你的回复。看起来我可以增加内存,但是阻塞是不可避免的:感谢您的回复,我使用的主题是非持久性消息。我很好奇如何将消息游标配置为spool到磁盘。如果我用这种配置运行我的“垃圾邮件”测试程序,那么代理会开始填充硬盘吗?