Hi,
I've made a ServerResource which is supposed to return a long-running
response that serves log messages from log4j. It looks something like this:
public class LoggingServerResource
extends ServerResource
{
@Override
protected Representation get() throws ResourceException
{
return new WriterRepresentation( MediaType.TEXT_PLAIN)
{
@Override
public void write( final Writer writer ) throws IOException
{
writer.flush();
final Form params =
getRequest().getResourceRef().getQueryAsForm();
final Logger logger = Logger.getRootLogger();
AppenderSkeleton appender = new LoggingAppender( params,
writer, logger );
appender.setLayout( new PatternLayout("[%X{url}] %-5p %c{1}
: %m%n") );
logger.addAppender( appender );
synchronized (appender)
{
try
{
appender.wait();
} catch (InterruptedException e)
{
}
}
}
};
}
private class LoggingAppender extends AppenderSkeleton
{
... impl omitted for brevity ...
}
}
---
Basically it adds an appender to log4j which then writes to the Writer
as long as there's no IOException(=browser stopped connection). This
seemed to work well, but when we went into production it broke
spectacularly as it seems like the Response (or underlying
request/response) was reused for other requests. So in other calls there
would be sporadically included log messages.
The only way I can get this to make sense is that even though the
WriterRepresentation has technically not finished (i.e. write() has not
returned) the underlying streams were reused by other requests. We're
using Glassfish (which uses Tomcat), if that makes any difference.
Has anyone else seen this problem? How is it possible that a Response
being written to can be reused!? Any ideas?
/Rickard
------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2694742