Topics locked by JAXB

even after creating a new unmarshaller object every time, threads become blocked Please help

"http-80-3" daemon prio=10 tid=0x000000004fabe800 nid=0x7147 waiting for monitor entry [0x0000000042401000] java.lang.Thread.State: BLOCKED (on object monitor) at java.util.zip.ZipFile$ZipFileInputStream.read(ZipFile.java:457) - waiting to lock <0x00000000c02cce20> (a sun.net.www.protocol.jar.URLJarFile) at java.util.zip.ZipFile$ZipFileInputStream.read(ZipFile.java:475) at java.io.FilterInputStream.read(FilterInputStream.java:66) at java.io.DataInputStream.readInt(DataInputStream.java:371) at com.sun.xml.internal.bind.v2.bytecode.ClassTailor.tailor(ClassTailor.java:165) at com.sun.xml.internal.bind.v2.runtime.reflect.opt.AccessorInjector.tailor(AccessorInjector.java:108) at com.sun.xml.internal.bind.v2.runtime.reflect.opt.AccessorInjector.prepare(AccessorInjector.java:68) at com.sun.xml.internal.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.get(OptimizedAccessorFactory.java:156) at com.sun.xml.internal.bind.v2.runtime.reflect.Accessor$FieldReflection.optimize(Accessor.java:245) at com.sun.xml.internal.bind.v2.runtime.property.SingleElementNodeProperty.<init>(SingleElementNodeProperty.java:79) at sun.reflect.GeneratedConstructorAccessor21.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.sun.xml.internal.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:113) at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:145) at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.java:479) at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:305) at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1100) at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:143) at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:110) at sun.reflect.GeneratedMethodAccessor47.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202) at javax.xml.bind.ContextFinder.find(ContextFinder.java:376) at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574) at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522) 
+4
source share
2 answers

(Moving my comment to the answer)

Do you create a JAXBContext every time? JAXBContext is thread safe and must be created once and reused. Unmarshaller is not thread safe; a new one must be created for the thread.

Now I support the map (ConcurrentHashMap contexts) wrapped in stream safe code for storing all JAXBContexts (one by type) at the moment it works beautifully. Any other best suggestion ??

It depends on your application. You can also create one JAXBContext for many classes:

 JAXBContext jc = JAXBContext.newInstance(A.class, B.class, C.class, D.class); 

or

 JAXBContext jc = JAXBContext.newInstance("com.foo:org.bar"); 
+8
source

A good solution to the performance problem that is reliable for JAXB Context when developing multi-threaded web applications could be to create a singleton that provides JAXBContext as follows:

 class JAXBContextServletHelper extends HttpServlet { static final JAXBContext context = initContext(); private static JAXBContext initContext() { return JAXBContext.newInstance(MyClasse1.class,MyClasse2.class); } } 

and name it with;

 JAXBContext context = JAXBContextServletHelper. initContext(); Unmarshaller u = context.createUnmarshaller(); u.unmarshal(...); 

for more details on this, please visit the jaxb tutorial on java.net here

+1
source

Source: https://habr.com/ru/post/1369140/


All Articles