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

Aeron Archive中无法指定Media Driver目录的问题及解决方法

搭建独立Aeron Archive Media Driver时的目录配置问题

问题背景

我正在搭建一个独立的Aeron Archive Media Driver,供发布端和订阅端客户端使用,计划为每个连接到Aeron的进程设置双向发布/订阅代理。

当让Media Driver使用默认目录(本地Mac环境)时,一切正常,也能指定Archive目录正常工作。

正常运行的代码

public void init() {
    final String controlChannel = AERON_UDP_ENDPOINT + config.getHost() + ":" + config.getControlPort();
    final String replicationChannel = AERON_UDP_ENDPOINT + config.getHost() + ":" + config.getReplicationPort();
    final String recordingEventsChannel =
            "aeron:udp?control-mode=dynamic|control=" + config.getHost() + ":" + config.getEventsPort();

    LOGGER.info("Starting MediaDriver with control channel: {}, replication channel: {}, recording events channel: {}",
            controlChannel, replicationChannel, recordingEventsChannel);

    final var archiveContext = new Archive.Context()
            .deleteArchiveOnStart(true)
            .errorHandler(ArchieveMediaDriverService::errorHandler)
            .controlChannel(controlChannel)
            .replicationChannel(replicationChannel)
            .recordingEventsChannel(recordingEventsChannel)
            .idleStrategySupplier(SleepingMillisIdleStrategy::new)
            .threadingMode(ArchiveThreadingMode.SHARED)
            .archiveDir(new File(config.getAeronDirectoryName()));

    final var mediaDriverContext = new MediaDriver.Context()
            .spiesSimulateConnection(true)
            .errorHandler(ArchieveMediaDriverService::errorHandler)
            .threadingMode(ThreadingMode.SHARED)
            .sharedIdleStrategy(new SleepingMillisIdleStrategy())
            .dirDeleteOnStart(true);

    ArchivingMediaDriver.launch(mediaDriverContext, archiveContext);
    LOGGER.info("Media driver is ready.");

    aeron = Aeron.connect();
    LOGGER.info("Connected to Aeron {}", aeron.context());

    // Connect to AeronArchive
    aeronArchive = AeronArchive.connect(
            new AeronArchive.Context()
                    .aeron(aeron)
                    .controlRequestChannel(controlChannel)
                    .controlResponseChannel(replicationChannel)
    );
    LOGGER.info("MediaDriver is up and running");

    // Keep the MediaDriver running until the application is stopped
    Runtime.getRuntime().addShutdownHook(new Thread(this::stop));
}

问题1:Media Driver与Archive目录相同时的致命错误

当将Media Driver的目录设置为与Aeron Archive相同的目录时,会抛出FATAL错误,提示无法创建CnC文件。修改后的Media Driver配置代码如下:

final var mediaDriverContext = new MediaDriver.Context()
        .spiesSimulateConnection(true)
        .aeronDirectoryName(config.getAeronDirectoryName())
        .errorHandler(ArchieveMediaDriverService::errorHandler)
        .threadingMode(ThreadingMode.SHARED)
        .sharedIdleStrategy(new SleepingMillisIdleStrategy())
        .dirDeleteOnStart(true);

错误信息:

Caused by: io.aeron.exceptions.DriverTimeoutException: FATAL - CnC file not created: /Users/user/dev/optradex/optradex-engine/resources/archiveDataFolder/cnc.dat

问题2:目录分离后的心跳超时警告

如果将Media Driver目录改为与Archive文件夹不同的路径,系统可以运行,但会出现一条FATAL级别的警告(不影响系统运行),异常信息如下:

Caused by: io.aeron.exceptions.DriverTimeoutException: FATAL - no driver heartbeat detected
    at io.aeron.Aeron$Context.connectToDriver(Aeron.java:1563) ~[aeron-all-1.37.0.jar:1.37.0]
    at io.aeron.Aeron$Context.conclude(Aeron.java:790) ~[aeron-all-1.37.0.jar:1.37.0]
    at io.aeron.Aeron.<init>(Aeron.java:83) ~[aeron-all-1.37.0.jar:1.37.0]
    at io.aeron.Aeron.connect(Aeron.java:139) ~[aeron-all-1.37.0.jar:1.37.0]
    at io.aeron.Aeron.connect(Aeron.java:121) ~[aeron-all-1.37.0.jar:1.37.0]
    at com.xac.archivemediadriver.service.ArchieveMediaDriverService.init(ArchieveMediaDriverService.java:71) ~[main/:na]
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMethod.invoke(InitDestroyAnnotationBeanPostProcessor.java:457) ~[spring-beans-6.0.17.jar:6.0.17]
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:401) ~[spring-beans-6.0.17.jar:6.0.17]
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:219) ~[spring-beans-6.0.17.jar:6.0.17]
    ... 17 common frames omitted

解决方案

  • 目录分离要求:Archive目录与Aeron Media Driver目录必须分开,否则会出现无法创建CnC文件的致命错误。
  • 心跳超时解决:调用Aeron.connect时指定与Media Driver相同的目录,代码如下:
aeron = Aeron.connect(new Aeron.Context().aeronDirectoryName(config.getAeronDirectoryName()));

内容的提问来源于stack exchange,提问作者Diptaneal Roy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:24:55