如何让Aeron无订阅者时仍可正常发布数据?
解决方案
核心结论
可以通过手动创建丢弃数据的间谍订阅解决非录制状态下publication.offer()返回Publication.NOT_CONNECTED的问题,无需依赖Aeron Archive的录制功能。
具体实现步骤
利用Aeron原生API创建间谍订阅
这类订阅不会处理消息,数据会被媒体驱动自动丢弃,但能让Publication判定存在活跃订阅者,避免返回连接失败状态。修改非录制状态的代码逻辑
在创建普通ExclusivePublication后,立即创建对应通道和流ID的间谍订阅,示例代码如下:if (isRecorded) { publication = archive.addRecordedExclusivePublication(channel, streamId); } else { Aeron aeron = archive.context().aeron(); publication = aeron.addExclusivePublication(channel, streamId); // 创建丢弃型间谍订阅,消除NOT_CONNECTED状态 Subscription spySubscription = aeron.addSpySubscription(channel, streamId); // 注意:不再需要该订阅时,需调用spySubscription.close()释放资源 }
关键说明
- 你已开启的
spiesSimulateConnection(true)是必要前提,该配置允许间谍订阅模拟真实订阅的连接状态,让Publication认为有订阅者存在。 - 录制状态下正常工作,是因为
addRecordedExclusivePublication()内部会自动创建用于录制的间谍订阅;非录制状态则需要手动补充。 - 该间谍订阅无需绑定消息处理器,媒体驱动会直接丢弃接收的数据,不会产生额外处理开销。
内容的提问来源于stack exchange,提问作者Vadim
相关产品推荐
相关产品推荐

