[ https://issues.apache.org/jira/browse/IGNITE-3935?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16107898#comment-16107898 ]
ASF GitHub Bot commented on IGNITE-3935: ---------------------------------------- Github user xtern closed the pull request at: https://github.com/apache/ignite/pull/2369 > ClassLoaders are not switched during object deserialization > ----------------------------------------------------------- > > Key: IGNITE-3935 > URL: https://issues.apache.org/jira/browse/IGNITE-3935 > Project: Ignite > Issue Type: Bug > Components: binary > Affects Versions: 1.6 > Reporter: Denis Magda > > If an object is being deserialized with ClassLoader A then this ClassLoader A > will be used for the deserialization of the whole object's state, i.e., > including all its fields that can be custom objects loaded by ClassLoader B. > In a basic scenario we can have an object of some Ignite class that is > presented in the classpath. That Ignite class may enclose an object that is > loaded by peer-class-loading class loader. The deserialization will fail > because Ignite won't switch to the peer-class-loading loader when it's needed. > To reproduce the issue do the following: > 1. Start a remote ignite node using {{./ignite.sh > ../examples/config/example-ignite.xml}} > 2. Run the code below > {code} > public class StreamingExample {` > public static class StreamingExampleCacheEntryProcessor implements > CacheEntryProcessor<String, Long, Object> { > @Override > public Object process(MutableEntry<String, Long> e, Object... arg) throws > EntryProcessorException { > Long val = e.getValue(); > e.setValue(val == null ? 1L : val + 1); > return null; > } > } > public static void main(String[] args) throws IgniteException, IOException { > Ignition.setClientMode(true); > try (Ignite ignite = > Ignition.start("examples/config/example-ignite.xml")) { > IgniteCache<String, Long> stmCache = > ignite.getOrCreateCache("mycache"); > try (IgniteDataStreamer<String, Long> stmr = > ignite.dataStreamer(stmCache.getName())) { > stmr.allowOverwrite(true); > stmr.receiver(StreamTransformer.from(new > StreamingExampleCacheEntryProcessor())); > stmr.addData("word", 1L); > System.out.println("Finished"); > } > } > } > {code} > However if to modify this code to the following everything will work fine > {code} > public class StreamingExample { > public static class StreamingExampleCacheEntryProcessor extends > StreamTransformer<String, Long> { > @Override > public Object process(MutableEntry<String, Long> e, Object... arg) > throws EntryProcessorException { > System.out.println("Executed!"); > Long val = e.getValue(); > e.setValue(val == null ? 1L : val + 1); > return null; > } > } > public static void main(String[] args) throws IgniteException, > IOException { > Ignition.setClientMode(true); > try (Ignite ignite = > Ignition.start("examples/config/example-ignite.xml")) { > IgniteCache<String, Long> stmCache = > ignite.getOrCreateCache("mycache"); > try (IgniteDataStreamer<String, Long> stmr = > ignite.dataStreamer(stmCache.getName())) { > stmr.allowOverwrite(true); > stmr.receiver(new StreamingExampleCacheEntryProcessor()); > stmr.addData("word", 1L); > System.out.println("Finished"); > } > } > } > } > {code} -- This message was sent by Atlassian JIRA (v6.4.14#64029)