You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cocoon.apache.org by Michael Enke <mi...@wincor-nixdorf.com> on 2007/03/27 11:02:40 UTC
outputBufferSize>0 for pipelines: Xalan must be patched
Hi all,
the outputBufferSize as a pipeline parameter doesn't help to push the output early to the client
(at least if the document is a small document <16k).
The reason is a BufferedOutputStream which is setup in the serializer
org.apache.xml.serializer.WriterToUTF8Buffered.java (2.7.0)
/** number of bytes that the byte buffer can hold.
* This is a fixed constant is used rather than m_outputBytes.lenght for performance.
*/
private static final int BYTES_MAX=16*1024;
That buffer already was existing in xalan2.5.1 but there a directWrite
wrote out every byte with write(int);
Now the serializer writes out if the buffer is full or at end of document with write(byte[], int, int).
That means setting the outputBufferSize in sitemap to lower than 16*1024 is senseless
and the comment in org.apache.cocoon.environment.AbstractEnvironment.java
// FIXME Triple buffering, anyone?
is correct: It makes no sense to buffer here. A value of 0 has the same effect as a value <= 16*1024.
(In detail the serializer buffer is for serialized bytes, in sitemap it is for pipeline bytes
which probably is different depending on the stylesheet. I did not investigate how performance
differs for outputBufferSize=0 or >0)
I use a real time application which has to write html immediately, independent of the number of bytes.
I use the following (and a Cocoon committer should propose that as a patch to the xalan team):
I add an attribute flush="on" to my xml stream. From now on xalan flushes at every endElement().
If I want to stop that I add an attribute flush="off" to my xml stream.
--- xalan-j_2_7_0.orig/src/org/apache/xml/serializer/ToHTMLStream.java 2005-08-06 23:05:30.000000000 +0200
+++ xalan-j_2_7_0/src/org/apache/xml/serializer/ToHTMLStream.java 2007-03-27 10:48:24.860050168 +0200
@@ -749,6 +749,7 @@
* @see #endElement
* @see org.xml.sax.AttributeList
*/
+ boolean flushAll = false;
public void startElement(
String namespaceURI,
String localName,
@@ -756,6 +757,15 @@
Attributes atts)
throws org.xml.sax.SAXException
{
+ if(atts != null)
+ {
+ String flushAtt = atts.getValue("flush");
+ if(flushAtt != null)
+ {
+ if(flushAtt.equals("on")) flushAll = true;
+ else if(flushAtt.equals("off")) flushAll = false;
+ }
+ }
ElemContext elemContext = m_elemContext;
@@ -887,6 +897,7 @@
final String name)
throws org.xml.sax.SAXException
{
+ if(flushAll) flushWriter();
// deal with any pending issues
if (m_cdataTagOpen)
closeCDATA();
The same has to applied to ToStream.java.
I hope that others find it useful too.
Regards,
Michael
--
WINCOR NIXDORF International GmbH
Retail Store Solutions
Wernerwerkdamm 16
13629 Berlin, Germany
Phone +49 (0) 30 5017-1386
Fax +49 (0) 30 5017-1305
E-Mail Michael.Enke@wincor-nixdorf.com
WINCOR NIXDORF International GmbH
Sitz der Gesellschaft: 33106 Paderborn, Heinz-Nixdorf-Ring 1
Registergericht Paderborn HRB 3507
Geschäftsführer: Eckard Heidloff (Vorsitzender), Stefan Auerbach, Jürgen Wilde, Dr. Jürgen Wunram
Vorsitzender des Aufsichtsrats: Karl-Heinz Stiller
Steuernummer: 339/5884/0031
Ust-ID Nr.: DE812927716
WEEE-Reg.-Nr. DE44477193
Diese E-Mail enthält vertrauliche Informationen. Wenn Sie nicht der richtige Adressat sind oder
diese E-Mail irrtümlich erhalten haben, informieren Sie bitte sofort den Absender und vernichten Sie diese Mail.
Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieser Mail ist nicht gestattet.
This e-mail may contain confidential information. If you are not the intended recipient or
have received this e-mail in error, please notify the sender immediately and destroy this e-mail.
Any unauthorized copying, disclosure or distribution of the material in this e-mail is strictly forbidden.