You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Jeffrey Poore (JIRA)" <ji...@apache.org> on 2010/03/30 00:00:27 UTC

[jira] Created: (CXF-2741) JAXB hang on JBoss 5.1.0

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.


Re: [jira] Commented: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi Jeffrey

thanks for resolving this issue, it's been a tricky one :-). It would be
interesting to know which JVM parameter is 'to blame'...

cheers, Sergey

On Fri, Apr 2, 2010 at 3:12 PM, Jeffrey Poore (JIRA) <ji...@apache.org>wrote:

>
>    [
> https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12852827#action_12852827]
>
> Jeffrey Poore commented on CXF-2741:
> ------------------------------------
>
> It appears that this is some kind of subtle JVM bug. I took a grass roots
> JBoss and put the war on it containing a minimal hello world service and it
> runs fine without hanging. Then put our normal war on it, still runs fine.
> We have some JNDI's that we add and some database connections, and it still
> worked after adding those. Then I added in the extra JVM parameters we pass
> in, and it hangs. I'm working on figuring out which one it is, but this is
> not a CXF issue, so I'm resolving.
>
> Thanks for your help gentlemen.
>
> > 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.
>
>

[jira] Commented: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by "Jeffrey Poore (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12851561#action_12851561 ] 

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

The short: No difference if I use a different variable as the lock.

The long:

Ok, I added a static variable for the lock:

{code}
private static Object packageContextLock = new Object();
{code}

and then set this to be the variable in the synchronized block:

{code}
public JAXBContext getPackageContext(Class<?> type) {
        if (type == null || type == JAXBElement.class) {
            return null;
        }
        synchronized (packageContextLock) {
            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}

Same result. It blocks on the synchronized call. The next thing I'll try is using a synchronized map and take away the synchronized block.

> 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.


[jira] Commented: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by "Sergey Beryozkin (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12852110#action_12852110 ] 

Sergey Beryozkin commented on CXF-2741:
---------------------------------------

hi, one good thing which has come out of this discussion is that a key for a classContexts map will get changed to a String (class name) :-)

but the hang thing is a strange thing indeed...Now, perhaps another thing to try is to get rid of the code which tries to get a package context (provided you don't need a package context and if you do then may be try to temporarily add required JAXB annotations to JAXB beans) and see if the problem has something to do with a JAXBContext creating a new package context; so if after removing that code no hung occurs then the problem could be narrowed down further. In fact, if you do not need a package context then you could just have a code there which attempts to create a package context but does not attempts to put in a map, just

synchronized (this) {
try {
                    JAXBContext.newInstance(packageName, type.getClassLoader(), cProperties);
                 } catch (JAXBException ex) {
                 }

} 

cheers, Sergey

> 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.


[jira] Commented: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by "Daniel Kulp (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12851611#action_12851611 ] 

Daniel Kulp commented on CXF-2741:
----------------------------------


The map might as well be a regular HashMap or ConcurrentHashMap as the WeakHashMap isn't actually working, especially for the classContexts map.    

In the classContexts case, the JAXBContext that is held onto strongly (only the key in the WeakHashMap is weak) also holds onto the class objects that it can marshal/unmarshal strongly.   Thus, the class used as a key is held onto strongly from the value which means the context would never be removed from the map.

Not sure if the same is true for the packageContexts.   If the string is at all interned, then it would be as well.

> 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.


[jira] Updated: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by "Jeffrey Poore (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jeffrey Poore updated CXF-2741:
-------------------------------

    Comment: was deleted

(was: my apologies on the code inclusion, I thought the formatting would be preserved...)

> 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.


[jira] Commented: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by "Jeffrey Poore (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12851129#action_12851129 ] 

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

my apologies on the code inclusion, I thought the formatting would be preserved...

> 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.


[jira] Resolved: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by "Jeffrey Poore (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jeffrey Poore resolved CXF-2741.
--------------------------------

    Resolution: Not A Problem

Appears to be some kind of JVM issue unrelated to CXF.

> 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.


[jira] Closed: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by "Jeffrey Poore (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jeffrey Poore closed CXF-2741.
------------------------------

    Estimated Complexity: Moderate

> 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.


[jira] Commented: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by "Jeffrey Poore (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12852085#action_12852085 ] 

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

Even switching over to a synchronized map still hangs. Now instead it just hangs on the synchronized calls of the map. I'm starting to suspect that this is some issue with our JBoss installation (we do some slight configuration to the out of the box install), so I'm going to try it on an unmodified JBoss and see if that makes a difference. I really appreciate the assistance in narrowing down the problem. 

> 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.


[jira] Commented: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by "Sergey Beryozkin (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12851557#action_12851557 ] 

Sergey Beryozkin commented on CXF-2741:
---------------------------------------

I think clearContexts() is only called by the tests...

Please give it a try, it might be a coincidence, but perhaps using a dedicated Object lock will help.
Here are the files :
http://svn.apache.org/repos/asf/cxf/tags/cxf-2.2.6/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
http://svn.apache.org/repos/asf/cxf/tags/cxf-2.2.6/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractJAXBProvider.java
http://svn.apache.org/repos/asf/cxf/tags/cxf-2.2.6/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/AbstractConfigurableProvider.java

but only  a copy of AbstractJAXBProvider will need to be updated, and all the 3 files will have to be compiled against CXF and finally a custom provider registered as a jaxrs:provider

Using explicit synchronization will avoid the problem you described, but the 'worst' thing that would happen there is that another context will be unnecessarily created but ultimately only a single one will end up in the map

cheers, Sergey


> 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.


[jira] Commented: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by "Sergey Beryozkin (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12851439#action_12851439 ] 

Sergey Beryozkin commented on CXF-2741:
---------------------------------------

Hi

I honestly do not see why synchronizing on the packageContexts map object can cause a hang...May be I just need to wrap a weak hash map into a synchronized map...But locking on an a map object which may get updated inside the block is a usual/basic Java technique...

Can you please give me a favor and do the following : get the source for JAXBElementProvider (+AbstractJaxbProvider) from the 2.2.6 tag, and add an 'Object packageContextLock = new Object();' to AbstractJaxbProvider  and use this packageContextLock instead of packageContexts as a lock and see if it makes a difference...

thanks, Sergey
 

> 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.


[jira] Updated: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by "Daniel Kulp (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Daniel Kulp updated CXF-2741:
-----------------------------

    Description: 
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}

  was:
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 ...
}


> 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.


[jira] Commented: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by "Sergey Beryozkin (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12851584#action_12851584 ] 

Sergey Beryozkin commented on CXF-2741:
---------------------------------------

Hmm...This is very strange. 
So CXF 2.2.6 works ok on jboss-4.2.3 but the hang is occurring on JBoss 5.1.0.GA...
What else have changed ? jdk 1.5 -> jdk 1.6 ?

No one has reported issues against 2.2.6 on Tomcat/Jetty, but may be you can verify independently ?
Also, perhaps it is worth, just for the sake of trying to narrow down the problem, turn the map into a regular HashMap ? 

thanks, Sergey

> 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.


[jira] Commented: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by "Jeffrey Poore (JIRA)" <ji...@apache.org>.
    [ 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.


[jira] Commented: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by "Jeffrey Poore (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12852827#action_12852827 ] 

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

It appears that this is some kind of subtle JVM bug. I took a grass roots JBoss and put the war on it containing a minimal hello world service and it runs fine without hanging. Then put our normal war on it, still runs fine. We have some JNDI's that we add and some database connections, and it still worked after adding those. Then I added in the extra JVM parameters we pass in, and it hangs. I'm working on figuring out which one it is, but this is not a CXF issue, so I'm resolving.

Thanks for your help gentlemen.

> 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.


[jira] Commented: (CXF-2741) JAXB hang on JBoss 5.1.0

Posted by "Jeffrey Poore (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/CXF-2741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12851476#action_12851476 ] 

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

Yeah, it's really kind of a strange spot to be stuck on - doesn't make any sense for a deadlock situation. We did notice that there is a call to clear the packageContexts that is un-synchronized, but I doubt that would cause a hang...

{code}
static void clearContexts() {
        classContexts.clear();
        packageContexts.clear();
}
{code}

I'll give a try on using the other object lock and see if that helps. One of my co-workers here had the same idea of using the synchronized weak map. My question would be, does it matter if two calls end up with different context objects? (i.e., you make the map synchronized so that you no longer need to synchronize the block, but now you could possibly have two threads successively create contexts as they both get null when they check to see if it exists, and then they both add a new context with that key)

> 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.