weblogic - Java ClassLoader Issue or Concurrency Error? -
weblogic - Java ClassLoader Issue or Concurrency Error? -
after weblogic app has been running fine few weeks exception:
<oct 25, 2014 9:31:11 pm edt> <error> <http> <bea-101020> <[servletcontext@60724164[app:whatever3000 module:whatever3000.war path: spec-version:2.5]] servlet failed exception java.lang.exceptionininitializererror after application defunct noclassdeffounderror until app server restarted.
the total stack trace shows origin of issue concurrentmodificationexception in static initializer.
specifically equivalent / minimized code follows:
package a; import b; public class whatever { void doit() { password p = new password(); } } bundle b; public final class password implements serializable { private static final int param1 = commonstuff.somestaticmethod(); ... } import java.util.properties; public class commonstuff { private static properties prp = new properties(); static { commonstuff.load(); } public static void load() { prp.putall(system.getproperties()); <---fail this origin of exception:
java.util.concurrentmodificationexception @ java.util.hashtable$enumerator.next(hashtable.java:1017) @ java.util.hashtable.putall(hashtable.java:469) @ b.commonstuff.load(commonstuff.java:55) @ b.commonstuff.<clinit>(commonstuff.java:77) @ b.password.<clinit>(password.java:44) @ a.doit(whatever.java:99) so seems @ point during runtime of application, weblogic decided reload classes package b when static block runs finds properties object has been modified.
i don't know if it's beingness called concurrently or if it's beingness called multiple times. properties object original instance created when app loaded fresh first time , reloading of commonstuff class trying phone call putall() again.
would help if do:
private static properties prp = null; static { commonstuff.prp = new properties(); commonstuff.load(); } i cannot seek things blindly because it's in production app @ huge company. i'm trying understand i'm going wrong , how property initialize these variables while classes beingness reloaded in middle of night.
any ideas?
could weblogic classloader issue?
classes/instances cannot access class's members before class initialized. because of no 1 can access newly created prp before static constructor returns. moving prp initializer within on static {} block makes no difference. "old" prp in "old" commonstuff , "new" prp not connected in way (because "old" , "new" commonstuff different classes jvm). create possibility of concurrent modifications of prp pretty weird.
i believe reason in place. notice first line of stack trace: exception thrown enumerator of hashtable. here code of putall method (as in jdk 8, didn't alter many years):
for (map.entry<? extends k, ? extends v> e : t.entryset()) put(e.getkey(), e.getvalue()); here enumerator throws exception - , not prp, argument's enumerator.
so exception related not prp map returned system.getproperties(). reason iterating on scheme properties map not thread safe. seems thread modifying @ same time.
you need initialize prp differently. think clone() simplest way.
java weblogic classloader static-initializer
Comments
Post a Comment