Hi All, 

I have implemented the LRUCache in one of the operators and this cache is
not Transient. This LRUcache is a simple extension of LinkedHashMap with its
removeEldestEntry method overriden. What we found is, the default Kryo
serializer, that Apex uses for checkpointing, doesn't work properly for
LinkedHashMap. I try using @Map and some other serializer classes and found
that only serializer that works is default Java serializer. As a result, we
had explicitly mentioned the serializer for this LRUCache to be
JavaSerializer (using @Bind at variable declaration) 

This resolved the issue of serializing but now the application recovery
fails when this application is killed and restarted using -originalAppId
through Apex cli. We get a error for LRUCache class while restoring the
operator 

com.esotericsoftware.kryo.KryoException: Error during Java deserialization.
Serialization trace:
callerContextCache
(com.tgt.dqs.datausageingest.operator.UsageCountCalculatorOperator)
        at
com.esotericsoftware.kryo.serializers.JavaSerializer.read(JavaSerializer.java:47)
        at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:679)
        at
com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:106)

Caused by: java.lang.ClassNotFoundException:
com.tgt.dqs.datausageingest.common.LRUCache
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626)
        at 
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
        at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
        at
com.esotericsoftware.kryo.serializers.JavaSerializer.read(JavaSerializer.java:45)

I checked the apa content (using get-app-package-info from cli) and could
see that classpath is set to lib/*.jar so i changed the appPackage.xml to
include the application jar in lib but still its of no use 

How the application recovery really works in Apex? and what could be done to
resolve this issue 

Regards 
Vivek



--
View this message in context: 
http://apache-apex-users-list.78494.x6.nabble.com/How-the-application-recovery-works-when-its-started-with-originalAppId-tp1821.html
Sent from the Apache Apex Users list mailing list archive at Nabble.com.

Reply via email to