Java 这是分布式机制的现实期望吗?
我一直在评估ActiveMQ作为候选消息代理。我编写了一些测试代码,试图了解ActiveMQ的性能限制 我可以通过以下方式尽可能快地发送消息,在代理中生成故障状态: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.
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到磁盘。如果我用这种配置运行我的“垃圾邮件”测试程序,那么代理会开始填充硬盘吗?