cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jeffrey Poore (JIRA)" <j...@apache.org>
Subject [jira] Commented: (CXF-2741) JAXB hang on JBoss 5.1.0
Date Tue, 30 Mar 2010 21:26:27 GMT

    [ https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12851609#action_12851609
] 

Jeffrey Poore commented on CXF-2741:
------------------------------------

Yeah, I've actually talked about switching over to a plain tomcat server for our service layer
since we really don't do anything that requires JBoss - it's just that we are sharing binaries
with another server that we run that hosts a Liferay portal. 

We talked about using HashMap but it isn't synchronized by default - we could use a hash table,
which is. But I'm going to try the Collections.synchronizedMap() first. 

> 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:
> {code}
> 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	
> {code}
> Specifically, this method:
> {code}
> 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;
>         }
>     }
> {code}
> 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:
> {code}
> @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;
> }
> {code}
> SearchResult is our JAXB annotated class:
> {code}
> @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 ...
> }
> {code}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message