JAXB hang on JBoss 5.1.0
------------------------
Key: CXF-2741
URL: https://issues.apache.org/jira/browse/CXF-2741
Project: CXF
Issue Type: Bug
Components: JAXB Databinding
Affects Versions: 2.2.6
Environment: JBoss 5.1.0.GA, Spring 2.5.6, javax.ws.rs.jsr311-api 1.1
Reporter: Jeffrey Poore
We have been using CXF RESTFul services for a long time on jboss-4.2.3 with no
issues. When we switched to JBoss 5.1.0.GA, things worked fine at first, but we
noticed that after a short period of uptime, requests began to hang and time
out. Debugging this issue, we tracked it to the synchronized block in
AbstractJAXBProvider.java:
JAXBElementProvider(AbstractJAXBProvider).getPackageContext(Class<?>) line: 377
JAXBElementProvider(AbstractJAXBProvider).getJAXBContext(Class<?>, Type) line:
354
JAXBElementProvider(AbstractJAXBProvider).createMarshaller(Object, Class<?>,
Type, String) line: 453
JAXBElementProvider.marshal(Object, Class<?>, Type, String, OutputStream,
MediaType) line: 296
JAXBElementProvider.writeTo(Object, Class<?>, Type, Annotation[], MediaType,
MultivaluedMap<String,Object>, OutputStream) line: 219
JAXRSOutInterceptor.serializeMessage(Message, Response, OperationResourceInfo,
boolean) line: 241
JAXRSOutInterceptor.processResponse(Message) line: 138
JAXRSOutInterceptor.handleMessage(Message) line: 77
PhaseInterceptorChain.doIntercept(Message) line: 243
OutgoingChainInterceptor.handleMessage(Message) line: 76
PhaseInterceptorChain.doIntercept(Message) line: 243
ChainInitiationObserver.onMessage(Message) line: 109
ServletDestination.invoke(ServletConfig, ServletContext, HttpServletRequest,
HttpServletResponse) line: 98
ServletController.invokeDestination(HttpServletRequest, HttpServletResponse,
ServletDestination) line: 406
ServletController.invoke(HttpServletRequest, HttpServletResponse) line: 139
CXFServlet(AbstractCXFServlet).invoke(HttpServletRequest, HttpServletResponse)
line: 142
CXFServlet(AbstractHTTPServlet).handleRequest(HttpServletRequest,
HttpServletResponse) line: 179
CXFServlet(AbstractHTTPServlet).doGet(HttpServletRequest, HttpServletResponse)
line: 108
CXFServlet(HttpServlet).service(HttpServletRequest, HttpServletResponse) line:
617
CXFServlet(AbstractHTTPServlet).service(ServletRequest, ServletResponse) line:
159
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line:
290
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 206
ReplyHeaderFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line:
96
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line:
235
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 206
StandardWrapperValve.invoke(Request, Response) line: 235
StandardContextValve.invoke(Request, Response) line: 191
SecurityAssociationValve.invoke(Request, Response) line: 190
JaccContextValve.invoke(Request, Response) line: 92
SecurityContextEstablishmentValve.process(Request, Response, HttpEvent) line:
126
SecurityContextEstablishmentValve.invoke(Request, Response) line: 70
StandardHostValve.invoke(Request, Response) line: 127
ErrorReportValve.invoke(Request, Response) line: 102
CachedConnectionValve.invoke(Request, Response) line: 158
StandardEngineValve.invoke(Request, Response) line: 109
CoyoteAdapter.service(Request, Response) line: 330
Http11Processor.process(Socket) line: 829
Http11Protocol$Http11ConnectionHandler.process(Socket) line: 598
JIoEndpoint$Worker.run() line: 447
Thread.run() line: 619
Specifically, this method:
public JAXBContext getPackageContext(Class<?> type) {
if (type == null || type == JAXBElement.class) {
return null;
}
synchronized (packageContexts) {
String packageName = PackageUtils.getPackageName(type);
JAXBContext context = packageContexts.get(packageName);
if (context == null) {
try {
context = JAXBContext.newInstance(packageName,
type.getClassLoader(), cProperties);
packageContexts.put(packageName, context);
} catch (JAXBException ex) {
LOG.fine("Error creating a JAXBContext using ObjectFactory
: "
+ ex.getMessage());
return null;
}
}
return context;
}
}
It appears that something is holding on to the synchronized lock on
packageContexts and thus calls just block. Any help on this would be
appreciated.
We are just trying to call a simple CXF service that uses JSR-311 annotated
methods and uses JAXB as the data binding. The class and method being called
look like this:
@Path("/LDAP/")
public class LdapServicesImpl implements LdapServices {
@GET
@Path("/lookup/")
@Produces("text/xml")
@Override
public SearchResult lookupUser(@Context UriInfo ui) {
String userid = ui.getQueryParameters().getFirst("uid");
SearchResult result = getLDAPInfo(userid);
...
return result;
}
SearchResult is our JAXB annotated class:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SearchResult", namespace = "urn:ldap", propOrder = {
"ldapUsers",
"error"
})
@XmlRootElement(name = "searchResult", namespace = "urn:ldap")
public class SearchResult
implements Serializable
{
private final static long serialVersionUID = 987654321L;
@XmlElement(namespace = "urn:ldap")
protected LdapUsers ldapUsers;
@XmlElement(namespace = "urn:ldap")
protected String error;
... getters and setters ...
}
LdapUsers:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "LdapUsers", namespace = "urn:ldap", propOrder = {
"ldapUsers"
})
public class LdapUsers
implements Serializable
{
private final static long serialVersionUID = 987654321L;
@XmlElement(name = "ldapUser", namespace = "urn:ldap")
protected List<LdapUser> ldapUsers;
... getters and setters ...
}
LdapUser:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "LdapUser", namespace = "urn:ldap", propOrder = {
"id",
"fullName",
"firstName",
"middleName",
"lastName",
"address",
"city",
"state",
"zip",
"entityCode",
"telephone",
"title",
"dn",
"mail",
"emsrowid",
"community",
"objectClasses",
"groups"
})
public class LdapUser
implements Serializable
{
private final static long serialVersionUID = 987654321L;
@XmlElement(namespace = "urn:ldap", required = true)
protected String id;
@XmlElement(namespace = "urn:ldap", required = true)
protected String fullName;
@XmlElement(namespace = "urn:ldap", required = true)
protected String firstName;
@XmlElement(namespace = "urn:ldap", required = true)
protected String middleName;
@XmlElement(namespace = "urn:ldap", required = true)
protected String lastName;
@XmlElement(namespace = "urn:ldap", required = true)
protected String address;
@XmlElement(namespace = "urn:ldap", required = true)
protected String city;
@XmlElement(namespace = "urn:ldap", required = true)
protected String state;
@XmlElement(namespace = "urn:ldap", required = true)
protected String zip;
@XmlElement(namespace = "urn:ldap", required = true)
protected String entityCode;
@XmlElement(namespace = "urn:ldap", required = true)
protected String telephone;
@XmlElement(namespace = "urn:ldap", required = true)
protected String title;
@XmlElement(namespace = "urn:ldap", required = true)
protected String dn;
@XmlElement(namespace = "urn:ldap", required = true)
protected String mail;
@XmlElement(namespace = "urn:ldap", required = true)
protected String emsrowid;
@XmlElement(namespace = "urn:ldap", required = true)
protected String community;
@XmlElement(namespace = "urn:ldap", required = true)
protected ObjectClasses objectClasses;
@XmlElement(namespace = "urn:ldap", required = true)
protected Groups groups;
... getters and setters ...
}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.