You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Aeron无订阅者时仍可正常发布数据?

解决方案

核心结论

可以通过手动创建丢弃数据的间谍订阅解决非录制状态下publication.offer()返回Publication.NOT_CONNECTED的问题,无需依赖Aeron Archive的录制功能。

具体实现步骤

  1. 利用Aeron原生API创建间谍订阅
    这类订阅不会处理消息,数据会被媒体驱动自动丢弃,但能让Publication判定存在活跃订阅者,避免返回连接失败状态。

  2. 修改非录制状态的代码逻辑
    在创建普通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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 00:37:33