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
相关产品推荐
相关产品推荐

