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

标签 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 应该(将要?)实现的东西吗?

最佳答案

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

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

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

关于java - 这是分布式机制的现实期望吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/344078/

相关文章:

java - 如何在java中进行excel的单元格迭代

java - Bean验证: Complex message value resolution - but how?

java - 异步更新 ListView

JAVA:如何设置线程名称(RMI)?

Erlang:如何从 Mnesia 集群中删除节点

java - Set<字符串> getSet(字符串 s)

python - 以多节点方式获取分布式 Tensorflow 中使用的 GPU 数量

java - 没有 'org.springframework.jms.core.JmsTemplate' 类型的合格 bean

java - JMS 消息大小

java - CloudBees 的 JMS 代理选项?