使用TestContainers集成Cassandra时出现本地数据中心不匹配错误的求助
嘿,我看你在TestContainers集成Cassandra的时候碰到了数据中心不匹配的问题,这个错误我之前也遇到过,给你几个排查方向和解决办法:
先看最可能的问题:方法引用用错了
你代码里这行:
registry.add("cass.datacenter", cassandra::getLocalDatacenter);
这里用了方法引用cassandra::getLocalDatacenter,如果你的registry.add是需要直接传入字符串值的话,这就错了——它不会执行这个方法获取数据中心名称,反而可能把方法本身的引用传进去了,导致Spring拿到的配置值根本不是datacenter1,自然就会报不匹配的错误。
改成直接调用方法的形式试试:
registry.add("cass.datacenter", cassandra.getLocalDatacenter());
再确认TestContainers Cassandra的默认DC
TestContainers启动的Cassandra容器,默认的本地数据中心就是datacenter1,你甚至可以先直接硬编码这个值来验证是不是获取DC的逻辑有问题:
registry.add("cass.datacenter", "datacenter1");
如果这么改之后能正常跑,那肯定就是之前获取DC的方式不对,要么是方法引用的问题,要么是调用时机太早(容器还没完全启动)。
确保容器完全启动后再读配置
有时候容器刚启动,Cassandra还没初始化完成,你就去拿getLocalDatacenter()或者映射端口,可能会拿到空值或者不正确的结果。可以加个等待逻辑,确保容器就绪:
cassandra.start(); // 等Cassandra完全启动好 cassandra.waitUntilContainerStarted(); // 再去读取配置 registry.add("cass.datacenter", cassandra.getLocalDatacenter()); Integer val1 = cassandra.getMappedPort(9042);
检查Spring配置的键名
看你的application.yml里写的是:
spring: cassandra: localDatacenter: ${cass.datacenter}
Spring Boot的Cassandra配置里,这个键的标准写法是local-datacenter(短横线分隔),虽然驼峰有时候也能识别,但保险起见改成标准写法:
spring: cassandra: local-datacenter: ${cass.datacenter}
最后验证端口和接触点
你用getMappedPort(9042)获取映射端口是对的,TestContainers会把容器的9042映射到宿主机随机端口;getContainerIpAddress默认返回localhost也没问题,这个不用改。
先试试上面的方法,应该能解决你的问题!
备注:内容来源于stack exchange,提问作者rafradio

