【问题标题】:Is there a way to set an Ignite thin Client ClassLoader?有没有办法设置 Ignite 瘦客户端类加载器?
【发布时间】:2021-05-29 06:41:43
【问题描述】:

Ignite 胖客户端提供了一种设置类加载器的方法。从 Ignite Caches 中删除值时,我已经成功地使用它来避免类未找到异常。否则,我会与我的 tomcat 应用程序中的类加载器发生冲突。请参见下面的示例:

IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setClassLoader(MyClass.class.getClassLoader());
Ignite ig = Ignition.start(cfg);
IgniteCache<Integer,MyClass> myCache = ig.getOrCreateCache("MyClass");
MyClass mc = myCache.get( 0 ); //throws java.lang.ClassNotFoundException without line 2

我现在正在尝试使用不提供此方法的瘦客户端。有没有办法为瘦客户端配置类加载器?或者在尝试从 Ignite ClientCache 中删除对象时尝试反序列化对象时,是否有其他方法可以避免类未找到异常?

ClientConfiguration cfg = new ClientConfiguration();
ClientIgnite ig = Ignition.startClient(cfg);
ClientCache<Integer,MyClass> myCache = ig.getOrCreateCache("MyClass");
MyClass mc = myCache.get( 0 ); //throws java.lang.ClassNotFoundException

【问题讨论】:

  • 我们需要看到minimal reproducible example
  • @M-Chen-3 为这两种设置添加了示例。
  • 在启动客户端之前尝试设置当前线程类加载器:stackoverflow.com/a/4096399/36498
  • 我尝试在创建 IgniteClinet 之前或尝试恢复我的对象之前在线程中设置类加载器,但始终得到相同的错误。 java.lang.ClassCastException:com.myCompany.MyClass 类无法转换为 com.myCompnay.MyClass 类(com.myCompany.MyClass 位于加载程序 java.net.URLClassLoader @67784306 的未命名模块中;com.myCompany.MyClass 未命名加载器模块 org.apache.catalina.loader.ParallelWebappClassLoader @475835b1)

标签: java classloader ignite thin-client


【解决方案1】:

在仔细考虑之后,我决定尝试从 tomcat 方面解决这个问题,而不是点燃。以下是帮助我更好地理解这个问题的链接。

最后,问题是 ignite 类是由一个类加载器加载的,该类加载器是我的 Web 应用程序类加载器的父级。

  • 在启动时,我的 webapp 的类加载器会检查它的父加载器是否有我的 键值对,而不是找到它们然后自己加载它们。
  • 接下来,当我使用 Ignite 类时,webapp 的类将查看 其父类加载器(通用类加载器),发现
    parent 已经加载了类,并使用该类加载器 Ignite 类。
  • 当 Ignite 类尝试将我的类转换为二进制文件时,它 会在其父类加载器中查找类,而不是找到它们 并自行加载。
  • 当我试图从缓存中获取值时,我会得到一个 冲突,因为 Ignite 和 Tomcat 各自加载了类 他们自己的。

最后我只是将 ignite jar 添加到 WEB-INF/lib 中,然后通过 webapp 类加载器加载 ignite 类,解决了整个问题。

https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html https://www.mulesoft.com/tcat/tomcat-classpath

【讨论】:

    猜你喜欢
    • 2019-07-20
    • 2020-06-21
    • 2020-02-14
    • 2020-04-07
    • 2019-11-09
    • 2020-12-20
    • 1970-01-01
    • 2021-09-22
    • 2021-10-04
    相关资源
    最近更新 更多