Posted by
Olivier Thery on
May 12, 2011; 10:03am
URL: https://discuss.orbeon.com/Orbeon-3-9-NullPointerException-with-websphere-6-1-tp3445071p3516921.html
Erik,
You were right, the exception is swallowed by the pool, as explain in the
javadocI added some trace around defalter.reset() in passivateObject, and you can see below the differences between execution on SUN JVM and IBM JVM (see logs before change below).
I have investigated a bit more, and I have found posts which explain the problem as an implementation difference between sun and ibm's GZIPOutputStream classes :
-
with SUN implementation, DeflaterOutputStream.close called end() on the Deflater. So it appears that you had to make a new Deflater everytime we wanted to use one with DeflaterOutputStream.
A fix has been delivered for this bug (see
Bug ID: 4499542)
-
with IBM implementation, GZIPOutputStream class (looks like for performance reasons) calls the deflater's end method as part of GZIPOutputStream.finish(), so deflater's reset can't be called after (see
this post)
SolutionMoving the call of deflater's reset in passivateObject was not a good solution.
Now, I think the best way is to be independent of this implementation difference between sun and ibm's GZIPOutputStream classes. So, as you have made for the deflater's method close, I have added a method finish to override the original deflater's method finish. This new method finish is the translation in Scala of the original sun's implementation (see
SUN java source code). I am a newbie in Scala, so my code needs your validation !
Here is my new versions of XFormsCompressor.scala and XFormsCompressor.jar
XFormsCompressor.scalaXFormsCompressor.jarI have tested them with Apache\Tomcat\Sun JVM and Websphere\IBM JVM : the deflater is now created just once and is reused (see logs after change below)
Logs before change1) With IBM JVM : a new Deflater is created each time we need it
2011-05-11 11:32:15,643 DEBUG XFormsServer - compressor - creating new Deflater
2011-05-11 11:32:15,659 DEBUG XFormsServer - compressor - in compressBytes Deflater finished : true
2011-05-11 11:32:15,659 DEBUG XFormsServer - compressor - in compressBytes Number of instances idle before returnObject : 0
2011-05-11 11:32:15,659 DEBUG XFormsServer - compressor - in compressBytes Number of instances active before returnObject : 1
2011-05-11 11:32:15,660 DEBUG XFormsServer - compressor - in passivateObject Number of instances idle before reset : 0
2011-05-11 11:32:15,660 DEBUG XFormsServer - compressor - in passivateObject Number of instances active before reset : 1
2011-05-11 11:32:15,660 DEBUG XFormsServer - compressor - in compressBytes Number of instances idle after returnObject : 0
2011-05-11 11:32:15,660 DEBUG XFormsServer - compressor - in compressBytes Number of instances active after returnObject : 0
2011-05-11 11:32:16,233 DEBUG XFormsServer - compressor - creating new Deflater
2011-05-11 11:32:16,242 DEBUG XFormsServer - compressor - in compressBytes Deflater finished : true
2011-05-11 11:32:16,242 DEBUG XFormsServer - compressor - in compressBytes Number of instances idle before returnObject : 0
2011-05-11 11:32:16,242 DEBUG XFormsServer - compressor - in compressBytes Number of instances active before returnObject : 1
2011-05-11 11:32:16,242 DEBUG XFormsServer - compressor - in passivateObject Number of instances idle before reset : 0
2011-05-11 11:32:16,242 DEBUG XFormsServer - compressor - in passivateObject Number of instances active before reset : 1
2011-05-11 11:32:16,242 DEBUG XFormsServer - compressor - in compressBytes Number of instances idle after returnObject : 0
2011-05-11 11:32:16,242 DEBUG XFormsServer - compressor - in compressBytes Number of instances active after returnObject : 02) With SUN JVM : it works fine : Deflater is created just once then reused
2011-05-11 11:43:47,984 DEBUG XFormsServer - compressor - creating new Deflater
2011-05-11 11:43:48,000 DEBUG XFormsServer - compressor - in compressBytes Deflater finished : true
2011-05-11 11:43:48,000 DEBUG XFormsServer - compressor - in compressBytes Number of instances idle before returnObject : 0
2011-05-11 11:43:48,000 DEBUG XFormsServer - compressor - in compressBytes Number of instances active before returnObject : 1
2011-05-11 11:43:48,000 DEBUG XFormsServer - compressor - in passivateObject Number of instances idle before reset : 0
2011-05-11 11:43:48,000 DEBUG XFormsServer - compressor - in passivateObject Number of instances active before reset : 1
2011-05-11 11:43:48,000 DEBUG XFormsServer - compressor - in passivateObject Number of instances idle after reset : 0
2011-05-11 11:43:48,000 DEBUG XFormsServer - compressor - in passivateObject Number of instances active after reset : 1
2011-05-11 11:43:48,000 DEBUG XFormsServer - compressor - in compressBytes Number of instances idle after returnObject : 1
2011-05-11 11:43:48,000 DEBUG XFormsServer - compressor - in compressBytes Number of instances active after returnObject : 0
2011-05-11 11:43:48,046 DEBUG XFormsServer - compressor - in compressBytes Deflater finished : true
2011-05-11 11:43:48,046 DEBUG XFormsServer - compressor - in compressBytes Number of instances idle before returnObject : 0
2011-05-11 11:43:48,046 DEBUG XFormsServer - compressor - in compressBytes Number of instances active before returnObject : 1
2011-05-11 11:43:48,046 DEBUG XFormsServer - compressor - in passivateObject Number of instances idle before reset : 0
2011-05-11 11:43:48,046 DEBUG XFormsServer - compressor - in passivateObject Number of instances active before reset : 1
2011-05-11 11:43:48,046 DEBUG XFormsServer - compressor - in passivateObject Number of instances idle after reset : 0
2011-05-11 11:43:48,046 DEBUG XFormsServer - compressor - in passivateObject Number of instances active after reset : 1
2011-05-11 11:43:48,046 DEBUG XFormsServer - compressor - in compressBytes Number of instances idle after returnObject : 1
2011-05-11 11:43:48,046 DEBUG XFormsServer - compressor - in compressBytes Number of instances active after returnObject : 0Logs after change1) With IBM JVM and SUN JVM : it works fine : Deflater is created just once then reused
2011-05-12 10:09:10,468 DEBUG XFormsServer - compressor - creating new Deflater
2011-05-12 10:09:10,484 DEBUG XFormsServer - compressor - in compressBytes Deflater finished : true
2011-05-12 10:09:10,484 DEBUG XFormsServer - compressor - in compressBytes Number of instances idle before reset and returnObject : 0
2011-05-12 10:09:10,484 DEBUG XFormsServer - compressor - in compressBytes Number of instances active before reset and returnObject : 1
2011-05-12 10:09:10,484 DEBUG XFormsServer - compressor - in passivateObject Number of instances idle after reset and before returnObject : 0
2011-05-12 10:09:10,484 DEBUG XFormsServer - compressor - in passivateObject Number of instances active after reset and before returnObject : 1
2011-05-12 10:09:10,484 DEBUG XFormsServer - compressor - in compressBytes Number of instances idle after returnObject : 1
2011-05-12 10:09:10,484 DEBUG XFormsServer - compressor - in compressBytes Number of instances active after returnObject : 0
2011-05-12 10:09:10,531 DEBUG XFormsServer - compressor - in compressBytes Deflater finished : true
2011-05-12 10:09:10,531 DEBUG XFormsServer - compressor - in compressBytes Number of instances idle before reset and returnObject : 0
2011-05-12 10:09:10,531 DEBUG XFormsServer - compressor - in compressBytes Number of instances active before reset and returnObject : 1
2011-05-12 10:09:10,531 DEBUG XFormsServer - compressor - in passivateObject Number of instances idle after reset and before returnObject : 0
2011-05-12 10:09:10,531 DEBUG XFormsServer - compressor - in passivateObject Number of instances active after reset and before returnObject : 1
2011-05-12 10:09:10,531 DEBUG XFormsServer - compressor - in compressBytes Number of instances idle after returnObject : 1
2011-05-12 10:09:10,531 DEBUG XFormsServer - compressor - in compressBytes Number of instances active after returnObject : 0I hope this change can solve the problem and that you can integrate it soon in a nightly build.
Thanks