我正在执行一项任务,将Quarkus从1.x迁移到2.x,而Quarkus与嵌入式Cassandra的集成在单元测试中失败-
由: java.lang.IllegalArgumentException:无法找到类java.lang.IllegalArgumentException引起(由Advanced.retry-policy.class. class指定)
**Custom retry policy**
public class CassandraCustomRetryPolicy implements RetryPolicy {
public CassandraCustomRetryPolicy(DriverContext context, String profileName) {
}
//override methods
}
****quarkus test be like** -**
@QuarkusTest
@QuarkusTestResource(CassandraTestResource.class)
class Test {}
**CassandraTestResource class start the embedded cassandra**
public class CassandraTestResource implements QuarkusTestResourceLifecycleManager {
private Cassandra cassandra;
@Override
public Map<String, String> start() {
cassandra = new CassandraBuilder().version("3.11.9")
.addEnvironmentVariable("JAVA_HOME", getJavaHome())
.addJvmOptions("-Xms512M -Xmx512m").build();
cassandra.start();
}我已经覆盖了资源文件夹中application.conf中的默认Cassandra驱动程序策略。
datastax-java-driver {
basic.request {
timeout = ****
consistency = ***
serial-consistency = ***
}
advanced.retry-policy {
class = com.mind.common.connectors.cassandra.CassandraCustomRetryPolicy
}我观察到我的自定义重试策略类属于QuarkusClassLoader.java中禁用的资源-
String resourceName = sanitizeName(name).replace('.', '/') + ".class";
boolean parentFirst = parentFirst(resourceName, state);
if (state.bannedResources.contains(resourceName)) {
throw new ClassNotFoundException(name);
}我捕捉到了以下日志-
com.mind.common.connectors.cassandra.CassandraCustomRetryPolicy at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:438) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:414) at java.base/java.lang.Class.forName0(原生方法)在java.base/java.lang.Class.forName(Class.java:315) at com.datastax.oss.driver.internal.core.util.Reflection.loadClass(Reflection.java:57) at com.datastax。oss.driver.internal.core.util.Reflection.resolveClass(Reflection.java:288) at com.datastax.oss.driver.internal.core.util.Reflection.buildFromConfig(Reflection.java:235) at com.datastax.oss.driver.internal.core.util.Reflection.buildFromConfigProfiles(Reflection.java:194) at com.datastax.oss.driver.internal.core.context.DefaultDriverContext.buildRetryPolicies(DefaultDriverContext.java:359) at com.datastax.oss.driver.internal.core.util.concurrent.LazyReference.get(LazyReference.java:在com.datastax.oss.driver.internal.core.context.DefaultDriverContext.getRetryPolicies(DefaultDriverContext.java:761) at com.datastax.oss.driver.internal.core.session.DefaultSession$SingleThreaded.init(DefaultSession.java:339) at com.datastax.oss.driver.internal.core.session.DefaultSession$SingleThreaded.access$1100(DefaultSession.java:300) at com.datastax.oss.driver.internal.core.session.DefaultSession.lambda$init$0(DefaultSession.java:146) at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98)在io.netty.util.concurrent.PromiseTask.run(PromiseTask.java:106) at io.netty.channel.DefaultEventLoop.run(DefaultEventLoop.java:54) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:834)
我使用的是夸克版本2.7.2,using与cassandra驱动程序版本4.14.0
发布于 2022-05-20 11:50:14
它在我初始化CQL会话后起作用,就像-
CqlSession.builder() .addContactPoint(新InetSocketAddress(settings.getAddress(),settings.getPort().withLocalDatacenter(“*”)。withClassLoader(Thread.currentThread().getContextClassLoader()).build())
发布于 2022-04-13 19:08:16
这不是一个完整的答案,但我想在这里留下一些笔记,以防其他人能在我回到终点之前把它弄过终点线。
这里的根本问题是,在上面描述的Quarkus测试用例中,Java驱动程序代码是由QuarkusClassLoader加载的,这(a)对于从哪里加载代码有更多的限制,而且(b)在必要时似乎不支持立即调用它的父程序。因此,在本例中,使用ClassNotFoundException执行测试中的以下操作将失败:
CqlSession.class.getClassLoader().forName(customretrypolicyclassname)而以下工作没有问题:
CqlSession.class.getClassLoader().getParent().forName(customretrypolicyclassname)用于加载CqlSession的类加载器是QuarkusClassLoader实例,而它的父类加载器是库存JVM类加载器。
用于加载为此策略指定的类的Java驱动程序使用 Class.forName()。但是,由于Quarkus类加载器用于加载驱动程序代码本身,这就是用于这些反射操作的加载程序.如上所述,驱动程序具有一些特定的特性,使得加载外部代码更加困难。
https://stackoverflow.com/questions/71792133
复制相似问题