Темы блокируются JAXB - PullRequest
5 голосов
/ 26 августа 2011

даже после создания нового объекта unmarshaller каждый раз потоки блокируются Пожалуйста, помогите

"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)

Ответы [ 2 ]

9 голосов
/ 27 августа 2011

(перемещение моего комментария к ответу)

Вы каждый раз создаете JAXBContext?JAXBContext является потокобезопасным и должен быть создан один раз и использован повторно.Unmarshaller не является потокобезопасным, и новый должен быть создан для каждого потока.

Теперь я поддерживаю карту (контексты ConcurrentHashMap), обернутую потокобезопасным кодом, для хранения всех JAXBContextex (по одному на тип) на данный момент она работает хорошо.Любое другое лучшее предложение ??

Это зависит от вашего приложения.Вы также можете создать один JAXBContext для многих классов:

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

или

JAXBContext jc = JAXBContext.newInstance("com.foo:org.bar");
1 голос
/ 08 мая 2015

Хорошим решением проблем устранения проблем производительности, надежным для контекста JAXB, при разработке многопоточных веб-приложений может быть создание синглтона, предоставляющего JAXBContext, подобного этому:

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

и вызов его с помощью;

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

для более подробной информации по этому вопросу, пожалуйста, посетите руководство jaxb на java.net здесь

...