ActiveMq:持久队列和离线系统

Posted

技术标签:

【中文标题】ActiveMq:持久队列和离线系统【英文标题】:ActiveMq: persistent queue and offline system 【发布时间】:2017-06-19 10:07:38 【问题描述】:

我是 ActiveMQ 技术的新用户,但在使用这项技术时遇到了一些问题。

我有以下情况:

    我有一个在嵌入式(离线)ARM 设备中运行的软件,它在运行时将一组视频存档在可插拔硬盘上。 有时(每天 4-5 个事件),我必须将警报事件与这些视频相关联,并将警报排入持久队列。 每月一次,我们必须提取硬盘并将其连接到另一个嵌入式 在线 ARM 设备,该设备应通知 ActiveMQ 服务器有关 离线 ARM 设备生成的警报

现在我的问题是:如何将持久队列存储在硬盘上,以便离线 ARM 设备生成的事件可用于在线 ARM 系统(在线和离线嵌入式设备是硬盘)?

请注意,我无法更改向在线服务器传输消息的方式,因为它不是我公司开发的系统。

最好的问候

乔瓦尼

【问题讨论】:

【参考方案1】:

听起来您想要一种“存储转发”消息传递模式。您可以配置“离线”ActiveMQ 代理以尝试连接到“在线”ActiveMQ 代理。网络连接器将尝试以可配置的时间间隔进行连接,当它“在线”时,它将开始自动发送消息。

轻微的缺点是代理将尝试连接到远程代理(即使在离线时),因此您需要管理日志轮换或日志级别以适应。

查找 static:// 网络连接器 uri

Network of brokers

【讨论】:

嗨,马特,我想我理解建议的方法。使用静态连接器,如果板 A 离线 2 天,并且第三天连接到运行“服务器”的主机 C,则排队的消息将被正常传递。但是我对我的系统有疑问:设备 A 离线并生成消息;硬盘每周一次与 A 断开连接并连接到 B,一块板在 A 上运行相同的 SW,但连接到 ActiveMq 服务器代理。我不明白如何允许板 A 上的 ActiveMq 生成的消息由板 B 传递到服务器 C。 如果ActiveMQ kahadb文件的存储位置在所有板子的同一目录中并且ActiveMQ版本相同:板上的SW应该启动代理,读取存储在板上的消息硬盘从 A 传送到服务器 C 就好了。 另一种选择可能是采用补偿事务或文件系统作为队列的方法。将文件存储在文件夹中,让进程检测何时连接存储(文件系统监视器或 cron 作业),然后在连接测试通过时将消息发布到服务器 C 上的代理。

以上是关于ActiveMq:持久队列和离线系统的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中直接持久化存储 JSON 数据以供查询和离线使用?

ActiveMQ消息持久化-JDBC

EF框架学习---EF中的在线和离线场景

如何让我的 ActiveMQ 代理删除离线持久订阅者

使用 KahaDB 时如何持久化 Activemq 队列/主题中的消息?

[进阶之路]ActiveMQ实现消息失败重发机制和两种模式(PTP和PubSub)