Hello Magnus,
XMLContext is intended to be thread-safe, and what you have found is a
bug. I have created a bug for this issue and you can track its
progress here:
https://bugs.eclipse.org/259493
-Blaise
Magnus Heino wrote:
>From javadoc:
* <p>The XMLContext is thread-safe. If multiple threads
accessing the same XMLContext object
* request an XMLMarshaller, each will receive their own instance of
XMLMarshaller, so any
* state that the XMLMarshaller maintains will be unique to that
process. The same is true
* of instances of XMLUnmarshaller and XMLValidator.
Our mappings use a XMLObjectReferenceMapping like this:
@MapperDescriptor
public XMLDescriptor createOperationReferenceDescriptor() {
return this.createReferenceDescriptor(OperationReference.class);
}
protected XMLDescriptor createReferenceDescriptor(final Class<?
extends Reference> type) {
XMLDescriptor reference = this.buildDescriptor(type);
XMLObjectReferenceMapping object = new
XMLObjectReferenceMapping();
object.setAttributeName("object");
object.setSetMethodName("setObject");
object.setGetMethodName("getObject");
object.setReferenceClass(Building.class);
object.addSourceToTargetKeyFieldAssociation("@xlink:href",
"@gml:id");
reference.addMapping(object);
return reference;
}
We then create a project:
Project project = new Project(new XMLLogin());
Add descriptors (we have implemented some annotations to make it
possible to scan for different sets of descriptors at runtime, as seen
above with the @MapperDescriptor).
for (ClassDescriptor classDescriptor : this.scanForDescriptors()) {
project.addDescriptor(classDescriptor);
}
And return a XMLContext.
return new XMLContext(project);
Any attempt to use this XMLContext across threads will fail, since the
org.eclipse.persistence.internal.oxm.ReferenceResolver used by the
XMLObjectReferenceMapping is shared across threads! This means that
thread1 might resolve to objects use by the referenceresolver in
thread2. And it does...
XMLMarshaller m1 = xmlContext.createMarshaller();
XMLMarshaller m2 = xmlContext.createMarshaller();
m2 and m2 will now reference the same ReferenceResolver.
This does not sound like thread-safe to me. Is this behaviour a bug, am
I doing somethings dumb while creating Projects and XMLContext, or is
the XMLContext simply not thread safe?
As a workaround, I tried to create a new XMLContext from the same
Project, but that didn't work either, since the ClassDescriptors
configured initially with the Project had changed at the next
XMLContext call. XMLContext(projects) seems to be possible only once
for each project instance.
We ended up with creating a new Project, XMLContext and XMLMarshaller
each time a thread requests a marshaller, and that works, but takes
time...
Thanks!
/Magnus Heino
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users
|