users@jersey.java.net

Recursive error serializing object

From: Rod Fitzsimmons Frey <rfrey_at_attassa.com>
Date: Fri, 23 Oct 2009 10:58:17 -0600

I'm having an issue with my webservices that seems related to logging in
Jersey, but I'm not sure.

Sometimes when a client hangs up in the middle of serializing XML to it, my
logs will show something like this:

Oct 23, 2009 12:34:59 PM com.sun.jersey.impl.json.writer.JsonXmlStreamWriter
writeStartElement
SEVERE: null
ClientAbortException: java.io.IOException
        at
org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:
358)
        at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:325)
        at
org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:381)
        at
org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:370)
        at
org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.ja
va:89)
        at
com.sun.jersey.spi.container.servlet.ServletContainer$Writer.write(ServletCo
ntainer.java:249)
        at
com.sun.jersey.spi.container.ContainerResponse$CommittingOutputStream.write(
ContainerResponse.java:115)
        at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:220)
        at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:281)
        at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:124)
        at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:134)
        at java.io.OutputStreamWriter.write(OutputStreamWriter.java:220)
        at java.io.Writer.write(Writer.java:157)
        at
com.sun.jersey.impl.json.writer.JsonXmlStreamWriter$WriterAdapter.write(Json
XmlStreamWriter.java:72)
        at
com.sun.jersey.impl.json.writer.JsonXmlStreamWriter.writeStartElement(JsonXm
lStreamWriter.java:398)
        at
com.sun.xml.bind.v2.runtime.output.XMLStreamWriterOutput.beginStartTag(XMLSt
reamWriterOutput.java:113)
        at
com.sun.xml.bind.v2.runtime.output.XmlOutputAbstractImpl.beginStartTag(XmlOu
tputAbstractImpl.java:98)
        at
com.sun.xml.bind.v2.runtime.output.NamespaceContextImpl$Element.startElement
(NamespaceContextImpl.java:483)
        at
com.sun.xml.bind.v2.runtime.XMLSerializer.endNamespaceDecls(XMLSerializer.ja
va:283)
        at
com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:
674)
        at
com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody
(SingleElementNodeProperty.java:1
50)


(that's about half the stack trace, but you get the idea).
That's fine, but what happens is that the stack trace repeats, except with
the line

        at
com.sun.jersey.impl.json.writer.JsonXmlStreamWriter.writeStartElement(JsonXm
lStreamWriter.java:398)
        at
com.sun.jersey.impl.json.writer.JsonXmlStreamWriter.writeStartElement(JsonXm
lStreamWriter.java:398)

repeated 2 times. Then again with that line 3 times. Then 4, 5, 6 and so
on, until I get a stack overflow. By that time the line is repeating many
hundreds of times and my log file has ballooned by about 6 GB per
occurrence.

The app recovers after the stack overflow but while it's occurring it slows
to a crawl. It takes 3-4 minutes, probably mostly disk write times to the
log file.

Any insight? My classes are pretty simple, they don't seem to have any
circular references that I can find by inspection.

Thanks,
Rod