有没有办法设置 Ignite 瘦客户端类加载器?

问题描述

Ignite 胖客户端提供了设置类加载器的方法。我已经成功地使用它来避免从 Ignite 缓存中删除值时找不到类的异常。否则我会与我的 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

解决方法

经过深思熟虑后,我决定尝试从 tomcat 方面解决这个问题,而不是点燃。以下链接帮助我更好地理解了这个问题。

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

  • 在启动时,我的 webapp 的类加载器会检查我的父级加载器 键值对,而不是找到它们然后自己加载它们。
  • 接下来当我使用 Ignite 类时,webapp 的类会查看 它的父类加载器(通用类加载器),发现
    父类已经加载了类,并使用该类加载器 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...