0

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

4

1 回答 1

1

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

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

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

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

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

于 2021-03-08T19:22:05.487 回答