首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Quarkus无法加载cassandra自定义重试策略类。

Quarkus无法加载cassandra自定义重试策略类。
EN

Stack Overflow用户
提问于 2022-04-08 05:40:13
回答 2查看 217关注 0票数 1

我正在执行一项任务,将Quarkus从1.x迁移到2.x,而Quarkus与嵌入式Cassandra的集成在单元测试中失败-

由: java.lang.IllegalArgumentException:无法找到类java.lang.IllegalArgumentException引起(由Advanced.retry-policy.class. class指定)

代码语言:javascript
复制
                    **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驱动程序策略。

代码语言:javascript
复制
  datastax-java-driver {
          basic.request {
            timeout = ****
            consistency = ***
            serial-consistency = ***
          }
          advanced.retry-policy {
            class = com.mind.common.connectors.cassandra.CassandraCustomRetryPolicy
          }

我观察到我的自定义重试策略类属于QuarkusClassLoader.java中禁用的资源-

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-20 11:50:14

它在我初始化CQL会话后起作用,就像-

CqlSession.builder() .addContactPoint(新InetSocketAddress(settings.getAddress(),settings.getPort().withLocalDatacenter(“*”)。withClassLoader(Thread.currentThread().getContextClassLoader()).build())

票数 0
EN

Stack Overflow用户

发布于 2022-04-13 19:08:16

这不是一个完整的答案,但我想在这里留下一些笔记,以防其他人能在我回到终点之前把它弄过终点线。

这里的根本问题是,在上面描述的Quarkus测试用例中,Java驱动程序代码是由QuarkusClassLoader加载的,这(a)对于从哪里加载代码有更多的限制,而且(b)在必要时似乎不支持立即调用它的父程序。因此,在本例中,使用ClassNotFoundException执行测试中的以下操作将失败:

代码语言:javascript
复制
CqlSession.class.getClassLoader().forName(customretrypolicyclassname)

而以下工作没有问题:

代码语言:javascript
复制
CqlSession.class.getClassLoader().getParent().forName(customretrypolicyclassname)

用于加载CqlSession的类加载器是QuarkusClassLoader实例,而它的父类加载器是库存JVM类加载器。

用于加载为此策略指定的类的Java驱动程序使用 Class.forName()。但是,由于Quarkus类加载器用于加载驱动程序代码本身,这就是用于这些反射操作的加载程序.如上所述,驱动程序具有一些特定的特性,使得加载外部代码更加困难。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71792133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档