ActiveMQ 仅在必要时保留在磁盘上

ActiveMQ persist on disk only when necessary

我正在使用 Java 和 ActiveMQ 从 Embedded-Linux 发送消息。我的要求是,如果目标代理不可用,则应保留消息。我选择 KahaDB 作为持久化适配器,以便消息在代理重启后仍然存在。

broker = new SslBrokerService();

KahaDBPersistenceAdapter kahaDBPersistenceAdapter=new KahaDBPersistenceAdapter();
kahaDBPersistenceAdapter.setJournalMaxFileLength(16 * 1024 * 1024);
broker.setPersistenceAdapter(kahaDBPersistenceAdapter);

/** Connector setup code */
broker.start();

尽管我已将最大文件大小限制为 16MB,但如果目标 broker/consumer 不可用,我想 保留消息。这样做的原因是限制 CPU 和磁盘使用。例如:生成消息 1,尝试发送消息。如果成功的持久性不应该发生,因为我对重新发送已经发送的数据不感兴趣(或者应该只发生在内存中)。生成消息 2、3、4 但目标代理不可用,然后将消息保存在磁盘上,以便在不太可能关闭 borker 消息的情况下继续存在。

在 ActiveMQ 的文档中来回翻阅后,我没有找到任何适用于我的用例的答案,所以我想问这个伟大的社区是否真的有可能实现我正在寻找的东西。

您必须编写自定义插件才能获得确切的场景。如果只有消费者不可用,JMS 不会描述持续存在的用例,b/c 可靠性合同也与生产者签订。我认为存储转发设计将是您正在寻找的。配置 embeddedBroker 以使用 static: networkConnector 将其发送到目标代理。 ActiveMQ 将在可用时自动将消息推送到目标服务器,如果远程代理不可用,则将它们在嵌入式服务器上排队。