Return-Path: Delivered-To: apmail-tomcat-users-archive@www.apache.org Received: (qmail 60729 invoked from network); 2 May 2007 09:01:03 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 2 May 2007 09:01:03 -0000 Received: (qmail 6548 invoked by uid 500); 2 May 2007 09:00:52 -0000 Delivered-To: apmail-tomcat-users-archive@tomcat.apache.org Received: (qmail 6519 invoked by uid 500); 2 May 2007 09:00:51 -0000 Mailing-List: contact users-help@tomcat.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "Tomcat Users List" Delivered-To: mailing list users@tomcat.apache.org Received: (qmail 6508 invoked by uid 99); 2 May 2007 09:00:51 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 02 May 2007 02:00:51 -0700 X-ASF-Spam-Status: No, hits=2.9 required=10.0 tests=HTML_10_20,HTML_MESSAGE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (herse.apache.org: domain of mpermar@gmail.com designates 64.233.166.178 as permitted sender) Received: from [64.233.166.178] (HELO py-out-1112.google.com) (64.233.166.178) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 02 May 2007 02:00:43 -0700 Received: by py-out-1112.google.com with SMTP id p76so49221pyb for ; Wed, 02 May 2007 02:00:22 -0700 (PDT) DKIM-Signature: a=rsa-sha1; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references; b=jsy9ogA1zyKH9F9gIZsNqobCFNryljfrBsG1WxRvKcfLH8q/uVw19S6rNoODSPY2VvhKrtWj8qv90yEll3jotPpjwVuiFex7GD4K4b7uvjAW69lSVJ8VplkfbURJR1szTnualdTb2K/waOKS9yG838nYoHjXdKB/Z/YrH3mTtWs= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references; b=QKFKW3UiCD10+PiGDw5x1n0Ypt9xPMFJcf0U5AP6uBnwL6qg0OAfv9BP9x9mJytxvdTi/VVbKyjKs+84bBkyopqMSldZjC5YrYjqUPnWEzN2BhDPGRH2EjZtSxAiDKN75B7VyebyYFevxDahb1aDPBUHB57AAtZMANcXnzS2LPo= Received: by 10.65.186.14 with SMTP id n14mr769148qbp.1178096422333; Wed, 02 May 2007 02:00:22 -0700 (PDT) Received: by 10.65.22.7 with HTTP; Wed, 2 May 2007 02:00:22 -0700 (PDT) Message-ID: <8fa1023f0705020200o45b2bed5td0f9d74d52403152@mail.gmail.com> Date: Wed, 2 May 2007 10:00:22 +0100 From: "Martin Perez" To: "Tomcat Users List" Subject: Re: Comet and Async Servlets - Architecture Question In-Reply-To: <46382669.2010109@sebster.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_3940_9714514.1178096422230" References: <681762.39769.qm@web31612.mail.mud.yahoo.com> <46382669.2010109@sebster.com> X-Virus-Checked: Checked by ClamAV on apache.org ------=_Part_3940_9714514.1178096422230 Content-Type: multipart/alternative; boundary="----=_Part_3941_29525194.1178096422230" ------=_Part_3941_29525194.1178096422230 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Sebastiaan, Yes you're right. I forgot to add something like isClosed() to your SynchronizedOutputStream so I can check if it's closed before writing. Anyways, I found that after a certain limit (for ex. 6000 -> 8000 users) the system starts to behave incorrectly. Some clients never get an answer from the server, some clients only receive partial data, and some of them really end. I guess I found the limit in the box, but attached are the source code files if someone wants to see the sample or simply spot something in it. Cheers, Martin On 5/2/07, Sebastiaan van Erk wrote: > > Praveen Balaji wrote: > > The > > last few days I have been evaluating using CometProcessor to work like > an > > Async Servlet for me. I pick up the CometEvent object on BEGIN event and > > process the whole request asynchronously. When I am done, I close the > I/O stream. > > > > > > I > > would like to know what the Tomcat developers and the developers in > general > > think about this approach. Is it a misuse of the API to process requests > > asynchronously, outside of the event method? Are there any issues that I > should be cautious about? Synchronization issues? > > > > > > > See the mailing list archive of the last month and filter on "comet". > There have been quite a few posts on exactly this subject. > > There are multiple issues: > > 1) Closing the I/O stream (on the response) does not end the > request/response. It takes another 30-60 seconds before the event method > gets called with an END event leaving a lot of request open unnecessarily. > > 2) Nothing is synchronized in Comet, so you have to do all > synchronization yourself. You have to make sure that you do not write to > the output stream after the event is closed (even though you may still > have the reference in your asynchronous application code). I seem to > have eliminated most issues by synchronizing access to the response > output stream and using the same lock around the event.close() method in > the event() method of the CometProcessor. However I still very > sporadically get a ClientAbortException/ClosedChannelException which > suggests that I've missed a place where synchronization is necessary. It > might not be possible to synchronize this though, because it could > happen deep inside Tomcat. The API has no information about what to > synchronize for asynchronous use. > > 3) If you rely on the POST method to send parameters to your > CometProcessor, then you have to parse the parameters yourself; there is > an issue that doing getParameter() on the request in the BEGIN event may > return null because the request body has not yet been received by the > server at the moment of the getParameter() call. > > One of the Comet developers (Remy) suggests that it might be better to > just use normal servlets and buy some extra memory for the extra threads. > > As far as the current API goes, I would say it is probably a "misuse", > though I would very much like to see the API improved so that this is no > longer the case. > > Regards, > Sebastiaan > > > Thanks, > > Praveen Balaji. > > > > > > > > > > > > > > > > __________________________________________________ > > Do You Yahoo!? > > Tired of spam? Yahoo! Mail has the best spam protection around > > http://mail.yahoo.com > > > > --------------------------------------------------------------------- > To start a new topic, e-mail: users@tomcat.apache.org > To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org > For additional commands, e-mail: users-help@tomcat.apache.org > > ------=_Part_3941_29525194.1178096422230 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Sebastiaan,

Yes you're right. I forgot to add something like isClosed() to your SynchronizedOutputStream so I can check if it's closed before writing.

Anyways, I found that after a certain limit (for ex. 6000 -> 8000 users) the system starts to behave incorrectly. Some clients never get an answer from the server, some clients only receive partial data, and some of them really end. I guess I found the limit in the box, but attached are the source code files if someone wants to see the sample or simply spot something in it.

Cheers,
Martin

On 5/2/07, Sebastiaan van Erk <sebster@sebster.com> wrote:
Praveen Balaji wrote:
> The
> last few days I have been evaluating using CometProcessor to work like an
> Async Servlet for me. I pick up the CometEvent object on BEGIN event and
> process the whole request asynchronously. When I am done, I close the I/O stream.
>
>
> I
> would like to know what the Tomcat developers and the developers in general
> think about this approach. Is it a misuse of the API to process requests
> asynchronously, outside of the event method? Are there any issues that I should be cautious about? Synchronization issues?
>
>
>
See the mailing list archive of the last month and filter on "comet".
There have been quite a few posts on exactly this subject.

There are multiple issues:

1) Closing the I/O stream (on the response) does not end the
request/response. It takes another 30-60 seconds before the event method
gets called with an END event leaving a lot of request open unnecessarily.

2) Nothing is synchronized in Comet, so you have to do all
synchronization yourself. You have to make sure that you do not write to
the output stream after the event is closed (even though you may still
have the reference in your asynchronous application code). I seem to
have eliminated most issues by synchronizing access to the response
output stream and using the same lock around the event.close() method in
the event() method of the CometProcessor. However I still very
sporadically get a ClientAbortException/ClosedChannelException which
suggests that I've missed a place where synchronization is necessary. It
might not be possible to synchronize this though, because it could
happen deep inside Tomcat. The API has no information about what to
synchronize for asynchronous use.

3) If you rely on the POST method to send parameters to your
CometProcessor, then you have to parse the parameters yourself; there is
an issue that doing getParameter() on the request in the BEGIN event may
return null because the request body has not yet been received by the
server at the moment of the getParameter() call.

One of the Comet developers (Remy) suggests that it might be better to
just use normal servlets and buy some extra memory for the extra threads.

As far as the current API goes, I would say it is probably a "misuse",
though I would very much like to see the API improved so that this is no
longer the case.

Regards,
Sebastiaan

> Thanks,
> Praveen Balaji.
>
>
>
>
>
>
>
> __________________________________________________
> Do You Yahoo!?
> Tired of spam?  Yahoo! Mail has the best spam protection around
> http://mail.yahoo.com
>

---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


------=_Part_3941_29525194.1178096422230-- ------=_Part_3940_9714514.1178096422230 Content-Type: text/x-java; name="StreamingCometTestServlet.java" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="StreamingCometTestServlet.java" X-Attachment-Id: f_f17k4evu cGFja2FnZSBjb20uY29nbm90ZWMuc3RyZWFtaW5nOw0KDQppbXBvcnQgamF2YS5pby5JT0V4Y2Vw dGlvbjsNCmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KaW1wb3J0IGphdmEudXRpbC5BcnJh eUxpc3Q7DQppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQppbXBvcnQgamF2YS51dGlsLkxpc3Q7 DQoNCmltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247DQppbXBvcnQgamF2YXgu c2VydmxldC5odHRwLkh0dHBTZXJ2bGV0Ow0KaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRw U2VydmxldFJlcXVlc3Q7DQppbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVz cG9uc2U7DQoNCmltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbWV0RXZlbnQ7DQppbXBvcnQg b3JnLmFwYWNoZS5jYXRhbGluYS5Db21ldFByb2Nlc3NvcjsNCmltcG9ydCBvcmcuYXBhY2hlLmxv ZzRqLkxvZ2dlcjsNCg0KaW1wb3J0IGNvbS5jb2dub3RlYy5zdHJlYW1pbmcuam1zc2ltLlJhdGVH ZW5lcmF0b3I7DQppbXBvcnQgY29tLmNvZ25vdGVjLnN0cmVhbWluZy5qbXNzaW0uUmF0ZUdlbmVy YXRvckZhY3Rvcnk7DQppbXBvcnQgY29tLmNvZ25vdGVjLnN0cmVhbWluZy5qbXNzaW0uUmF0ZUxp c3RlbmVyOw0KDQpwdWJsaWMgY2xhc3MgU3RyZWFtaW5nQ29tZXRUZXN0U2VydmxldCBleHRlbmRz IEh0dHBTZXJ2bGV0IA0KCQkJCQkJCQkJICAgaW1wbGVtZW50cyBDb21ldFByb2Nlc3NvciwgUmF0 ZUxpc3RlbmVyIHsNCg0KCQ0KCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lv blVJRCA9IDc1MjA2MDY2NzE5MzE1Njc2NTVMOw0KCXN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9n Z2VyLmdldExvZ2dlcihTdHJlYW1pbmdDb21ldFRlc3RTZXJ2bGV0LmNsYXNzKTsNCgkNCgkvL3By aXZhdGUgTGlzdDxIdHRwU2VydmxldFJlc3BvbnNlPiBjb25uZWN0aW9ucyA9IA0KCQkvL0NvbGxl Y3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdDxIdHRwU2VydmxldFJlc3BvbnNl PigpKTsNCgkNCglwcml2YXRlIEFycmF5TGlzdDxDb21ldFJhdGVTZW5kZXI+IGNvbWV0UmF0ZVNl bmRlcnMgPSBuZXcgQXJyYXlMaXN0PENvbWV0UmF0ZVNlbmRlcj4oNzUpOw0KCXByaXZhdGUgSGFz aE1hcDxDb21ldFJhdGVTZW5kZXIsIExpc3Q8U3luY2hyb25pemVkT3V0cHV0U3RyZWFtPj4gY29u bmVjdGlvbnMgPSANCgkJbmV3IEhhc2hNYXA8Q29tZXRSYXRlU2VuZGVyLCBMaXN0PFN5bmNocm9u aXplZE91dHB1dFN0cmVhbT4+KCk7DQoJDQoJcHJpdmF0ZSBpbnQgcm91bmRyb2JpbiA9IDA7DQoJ T2JqZWN0IHJvdW5kbG9jayA9IG5ldyBPYmplY3QoKTsNCgkNCglAT3ZlcnJpZGUNCglwdWJsaWMg dm9pZCBpbml0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gew0KCQkNCgkJc3VwZXIuaW5pdCgp Ow0KDQoJCWZvciAoaW50IGk9MDtpPDc1O2krKykgew0KCQkJQ29tZXRSYXRlU2VuZGVyIGNvbWV0 UmF0ZVNlbmRlciA9IG5ldyBDb21ldFJhdGVTZW5kZXIodGhpcyxpKTsNCgkJCVRocmVhZCBtZXNz YWdlU2VuZGVyVGhyZWFkID0gDQoJCQkJbmV3IFRocmVhZChjb21ldFJhdGVTZW5kZXIsIk1lc3Nh Z2VTZW5kZXJbIiArIGdldFNlcnZsZXRJbmZvKCkgKyAiXSIpOw0KCQkJbWVzc2FnZVNlbmRlclRo cmVhZC5zZXREYWVtb24odHJ1ZSk7DQoJCQltZXNzYWdlU2VuZGVyVGhyZWFkLnN0YXJ0KCk7CQkJ DQoJCQljb21ldFJhdGVTZW5kZXJzLmFkZChjb21ldFJhdGVTZW5kZXIpOw0KCQkJY29ubmVjdGlv bnMucHV0KGNvbWV0UmF0ZVNlbmRlciwgbmV3IEFycmF5TGlzdDxTeW5jaHJvbml6ZWRPdXRwdXRT dHJlYW0+KCkpOw0KCQl9DQoJCQ0KCQlSYXRlR2VuZXJhdG9yIGdlbmVyYXRvciA9IFJhdGVHZW5l cmF0b3JGYWN0b3J5LmdldFJhdGVHZW5lcmF0b3IoKTsNCgkJZ2VuZXJhdG9yLmFkZFJhdGVMaXN0 ZW5lcih0aGlzKTsNCgl9DQoNCglwdWJsaWMgdm9pZCByYXRlQXZhaWxhYmxlKFJhdGUgcmF0ZSkg ew0KCQkNCgkJZm9yIChDb21ldFJhdGVTZW5kZXIgc2VuZGVyOiBjb21ldFJhdGVTZW5kZXJzKSB7 DQoJCQlzZW5kZXIuc2VuZChyYXRlKTsNCgkJfQ0KCX0NCgkNCglwdWJsaWMgdm9pZCBldmVudChD b21ldEV2ZW50IGNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gew0KCQkN CgkJSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBjZS5nZXRIdHRwU2VydmxldFJlcXVlc3Qo KTsNCgkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IGNlLmdldEh0dHBTZXJ2bGV0UmVz cG9uc2UoKTsNCgkJDQoJCWlmIChjZS5nZXRFdmVudFR5cGUoKSA9PSBDb21ldEV2ZW50LkV2ZW50 VHlwZS5CRUdJTikgew0KCQkJLy9jZS5zZXRUaW1lb3V0KDMwKjEwMDApOw0KCQkJaWYgKGxvZ2dl ci5pc0RlYnVnRW5hYmxlZCgpKSB7DQoJCQkJbG9nZ2VyLmRlYnVnKCJCZWdpbm5pbmcgY29tZXQg c2Vzc2lvbiB3aXRoICIgKyByZXF1ZXN0LmdldFNlc3Npb24odHJ1ZSkuZ2V0SWQoKSk7DQoJCQl9 DQoJCQkvL3N5bmNocm9uaXplZCAoY29ubmVjdGlvbnMpIHsNCgkJCQlzeW5jaHJvbml6ZWQocm91 bmRsb2NrKSB7DQoJCQkJCUNvbWV0UmF0ZVNlbmRlciBzZW5kZXIgPSBjb21ldFJhdGVTZW5kZXJz LmdldChyb3VuZHJvYmluKTsNCgkJCQkJaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7DQoJ CQkJCQlsb2dnZXIuZGVidWcoIkFzc2lnbmluZyBzZXNzaW9uICIgKyByZXF1ZXN0LmdldFNlc3Np b24oKS5nZXRJZCgpICsgIiB0byBDb21ldCBSYXRlIFNlbmRlciAiICsgc2VuZGVyLmdldElkKCkp OwkJCQkJCQ0KCQkJCQl9DQoJCQkJDQoJCQkJCUxpc3Q8U3luY2hyb25pemVkT3V0cHV0U3RyZWFt PiBjb25uZWN0aW9ucyA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KHNlbmRlcik7DQoJCQkJCWNvbm5l Y3Rpb25zLmFkZChuZXcgU3luY2hyb25pemVkT3V0cHV0U3RyZWFtKHJlc3BvbnNlLmdldE91dHB1 dFN0cmVhbSgpKSk7DQoJCQkJCXJvdW5kcm9iaW4rKzsNCgkJCQkJaWYgKHJvdW5kcm9iaW4gPT0g Y29tZXRSYXRlU2VuZGVycy5zaXplKCkpIHsNCgkJCQkJCXJvdW5kcm9iaW4gPSAwOw0KCQkJCQl9 DQoJCQkJfQ0KCQkJLy99DQoJCX0gZWxzZSBpZiAoY2UuZ2V0RXZlbnRUeXBlKCkgPT0gQ29tZXRF dmVudC5FdmVudFR5cGUuRVJST1IpIHsNCgkJCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkg ew0KCQkJCWxvZ2dlci5kZWJ1ZygiRXJyb3IgZm9yIHNlc3Npb24gIiArIHJlcXVlc3QuZ2V0U2Vz c2lvbih0cnVlKS5nZXRJZCgpKTsNCgkJCX0NCgkJCS8vc3luY2hyb25pemVkIChjb25uZWN0aW9u cykgew0KCQkJCXJlbW92ZVJlc3BvbnNlKGNlLCByZXNwb25zZSk7DQoJCQkvL30NCgkJfSBlbHNl IGlmIChjZS5nZXRFdmVudFR5cGUoKSA9PSBDb21ldEV2ZW50LkV2ZW50VHlwZS5FTkQpIHsNCgkJ CWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KCQkJCWxvZ2dlci5kZWJ1ZygiRW5kIGZv ciBzZXNzaW9uICIgKyByZXF1ZXN0LmdldFNlc3Npb24odHJ1ZSkuZ2V0SWQoKSk7DQoJCQl9CQ0K CQkJcmVtb3ZlUmVzcG9uc2UoY2UsIHJlc3BvbnNlKTsNCgkJfSBlbHNlIGlmIChjZS5nZXRFdmVu dFR5cGUoKSA9PSBDb21ldEV2ZW50LkV2ZW50VHlwZS5SRUFEKSB7DQogICAgICAgICAgICBJbnB1 dFN0cmVhbSBpcyA9IHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKTsNCiAgICAgICAgICAgIA0KCQkJ aWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7DQoJCQkJbG9nZ2VyLmRlYnVnKCJSZWNlaXZl ZCByZWFkIGV2ZW50LiBBdmFpbGFibGUgYnl0ZXM6ICIgKyBpcy5hdmFpbGFibGUoKSk7DQoJCQl9 DQogICAgICAgICAgICANCiAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs1MTJdOw0K ICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIGludCBuID0gaXMucmVhZChidWYpOw0K ICAgICAgICAgICAgICAgIGlmIChuID4gMCkgew0KICAgICAgICAgICAgICAgIAlpZiAobG9nZ2Vy LmlzRGVidWdFbmFibGVkKCkpIHsNCgkgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zygi UmVhZCAiICsgbiArICIgYnl0ZXM6ICIgKyBuZXcgU3RyaW5nKGJ1ZiwgMCwgbikgDQoJICAgICAg ICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3Igc2Vzc2lvbjogIiArIHJlcXVlc3QuZ2V0U2Vz c2lvbih0cnVlKS5nZXRJZCgpKTsNCiAgICAgICAgICAgICAgICAJfQ0KICAgICAgICAgICAgICAg IH0gZWxzZSBpZiAobiA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc0Rl YnVnRW5hYmxlZCgpKSB7DQogICAgICAgICAgICAgICAgICAgIAlsb2dnZXIuZGVidWcoIlJlY2Vp dmVkICIgKyBuICsgIiBieXRlcy4gQ2xvc2luZyBjb25uZWN0aW9uLiIpOw0KICAgICAgICAgICAg ICAgICAgICB9DQogICAgICAgIAkJCXJlbW92ZVJlc3BvbnNlKGNlLCByZXNwb25zZSk7DQogICAg ICAgIAkJCSAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0K ICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gd2hpbGUgKGlzLmF2YWlsYWJsZSgpID4g MCk7CQkJDQoJCX0gZWxzZSB7DQoJCQlpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsNCgkJ CQlsb2dnZXIuZGVidWcoIlJlY2VpdmVkIHVua25vd24gZXZlbnQ6IiArIGNlLmdldEV2ZW50VHlw ZSgpKTsNCgkJCX0NCgkJfQ0KCX0NCg0KCXByaXZhdGUgdm9pZCByZW1vdmVSZXNwb25zZShDb21l dEV2ZW50IGNlLCANCgkJCQkJCQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dz IElPRXhjZXB0aW9uIHsNCgkJDQoJCWZvcihDb21ldFJhdGVTZW5kZXIgc2VuZGVyOiBjb21ldFJh dGVTZW5kZXJzKSB7DQoJCQlMaXN0PFN5bmNocm9uaXplZE91dHB1dFN0cmVhbT4gY29ubmVjdGlv bnMgPSB0aGlzLmNvbm5lY3Rpb25zLmdldChzZW5kZXIpOw0KCQkJU3luY2hyb25pemVkT3V0cHV0 U3RyZWFtIGZvdW5kU3RyZWFtID0gbnVsbDsNCgkJCWZvcihTeW5jaHJvbml6ZWRPdXRwdXRTdHJl YW0gc3RyZWFtOiBjb25uZWN0aW9ucykgew0KCQkJCWlmIChzdHJlYW0ub3V0LmVxdWFscyhyZXNw b25zZS5nZXRPdXRwdXRTdHJlYW0oKSkpIHsNCgkJCQkJZm91bmRTdHJlYW0gPSBudWxsOw0KCQkJ CQlzeW5jaHJvbml6ZWQoc3RyZWFtKSB7DQoJCQkJCQljZS5jbG9zZSgpOw0KCQkJCQkJc3RyZWFt LmNsb3NlKCk7DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJfQ0KCQkJaWYgKGZvdW5k U3RyZWFtICE9IG51bGwpIHsNCgkJCQljb25uZWN0aW9ucy5yZW1vdmUoZm91bmRTdHJlYW0pOw0K CQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoJfQ0KCQ0KCUBPdmVycmlkZQ0KCXB1YmxpYyB2b2lkIGRl c3Ryb3koKSB7DQoNCgkJY29ubmVjdGlvbnMuY2xlYXIoKTsNCgl9DQoNCglwdWJsaWMgTGlzdDxT eW5jaHJvbml6ZWRPdXRwdXRTdHJlYW0+IGdldENvbm5lY3Rpb25zKENvbWV0UmF0ZVNlbmRlciBz ZW5kZXIpIHsNCgkJDQoJCUxpc3Q8U3luY2hyb25pemVkT3V0cHV0U3RyZWFtPiBjb25uZWN0aW9u cyA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KHNlbmRlcik7DQoJCWlmIChjb25uZWN0aW9ucyAhPSBu dWxsKSB7DQoJCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxTeW5jaHJvbml6ZWRPdXRwdXRTdHJlYW0+ KGNvbm5lY3Rpb25zKTsNCgkJfSBlbHNlIHsNCgkJCXJldHVybiBuZXcgQXJyYXlMaXN0PFN5bmNo cm9uaXplZE91dHB1dFN0cmVhbT4oKTsNCgkJfQ0KCX0NCgkNCglwdWJsaWMgdm9pZCByZW1vdmVD b25uZWN0aW9uKENvbWV0UmF0ZVNlbmRlciBzZW5kZXIsIFN5bmNocm9uaXplZE91dHB1dFN0cmVh bSBzdHJlYW0pIHsNCgkJDQoJCUxpc3Q8U3luY2hyb25pemVkT3V0cHV0U3RyZWFtPiBjb25uZWN0 aW9ucyA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KHNlbmRlcik7DQoJCWNvbm5lY3Rpb25zLnJlbW92 ZShzdHJlYW0pOw0KCX0JDQp9DQo= ------=_Part_3940_9714514.1178096422230 Content-Type: text/x-java; name="CometRateSender.java" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="CometRateSender.java" X-Attachment-Id: f_f17k4y9r cGFja2FnZSBjb20uY29nbm90ZWMuc3RyZWFtaW5nOw0KDQppbXBvcnQgamF2YS5pby5JT0V4Y2Vw dGlvbjsNCmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KaW1wb3J0IGphdmEudXRpbC5IYXNo TWFwOw0KaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCmltcG9ydCBqYXZhLnV0aWwuTGlzdDsN CmltcG9ydCBqYXZhLnV0aWwuTWFwOw0KDQppbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcu U2VyaWFsaXphdGlvblV0aWxzOw0KaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOw0KDQpw dWJsaWMgY2xhc3MgQ29tZXRSYXRlU2VuZGVyIGltcGxlbWVudHMgUnVubmFibGUgew0KDQoJc3Rh dGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENvbWV0UmF0ZVNlbmRlci5jbGFz cyk7DQoJDQoJcHJpdmF0ZSBTdHJlYW1pbmdDb21ldFRlc3RTZXJ2bGV0IHNlcnZsZXQ7DQoJcHJv dGVjdGVkIEFycmF5TGlzdDxSYXRlPiByYXRlcyA9IG5ldyBBcnJheUxpc3Q8UmF0ZT4oKTsNCgkN Cglwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiByYXRlc1dyaXRlZCA9IG5ldyBIYXNo TWFwPFN0cmluZywgSW50ZWdlcj4oKTsNCglwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2Vy PiByYXRlc1BlbmRpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7DQoJDQoJcHJp dmF0ZSBib29sZWFuIHJ1bm5pbmc7DQoJcHJpdmF0ZSBsb25nIHN0YXRzTGFzdER1bXBlZCA9LTE7 DQoJcHJpdmF0ZSBpbnQgaWQ7DQoNCglwcml2YXRlIGxvbmcgRFVNUF9TVEFUU19JTlRFUlZBTCA9 IDUwMDA7DQoJDQoJcHVibGljIENvbWV0UmF0ZVNlbmRlcihTdHJlYW1pbmdDb21ldFRlc3RTZXJ2 bGV0IHNlcnZsZXQsIGludCBpZCkgew0KCQkNCgkJdGhpcy5zZXJ2bGV0ID0gc2VydmxldDsNCgkJ dGhpcy5pZCA9IGlkOw0KCQlyYXRlc1dyaXRlZC5jbGVhcigpOw0KCX0NCgkNCglwdWJsaWMgdm9p ZCBzdG9wKCkgew0KCQkNCgkJcnVubmluZyA9IGZhbHNlOw0KCX0NCgkNCiAgICBwdWJsaWMgdm9p ZCBzZW5kKFJhdGUgcmF0ZSkgew0KICAgIAkNCiAgICAgICAgc3luY2hyb25pemVkIChyYXRlcykg ew0KICAgICAgICAgICAgcmF0ZXMuYWRkKHJhdGUpOw0KICAgICAgICAgICAgcmF0ZUFkZGVkKHJh dGUpOw0KICAgICAgICAgICAgcmF0ZXMubm90aWZ5KCk7DQogICAgICAgIH0NCiAgICB9DQoJDQog ICAgcHVibGljIHZvaWQgcnVuKCkgew0KDQogICAgCXJ1bm5pbmcgPSB0cnVlOw0KICAgICAgICB3 aGlsZSAocnVubmluZykgew0KDQogICAgICAgICAgICBpZiAocmF0ZXMuc2l6ZSgpID09IDApIHsN CiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQg KHJhdGVzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByYXRlcy53YWl0KCk7DQogICAgICAg ICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2Vw dGlvbiBlKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQ0KICAgICAgICAgICAgICAg IH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgUmF0ZVtdIHBlbmRpbmdSYXRlcyA9IG51 bGw7DQogICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHJhdGVzKSB7DQogICAgICAgICAgICAgICAg cGVuZGluZ1JhdGVzID0gcmF0ZXMudG9BcnJheShuZXcgUmF0ZVswXSk7DQogICAgICAgICAgICAg ICAgcmF0ZXMuY2xlYXIoKTsNCiAgICAgICAgICAgICAgICByYXRlc1BlbmRpbmcuY2xlYXIoKTsN CiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIFNlbmQgYW55IHBlbmRpbmcgbWVzc2FnZSBv biBhbGwgdGhlIG9wZW4gY29ubmVjdGlvbnMNCg0KICAgICAgICAgICAgTGlzdDxTeW5jaHJvbml6 ZWRPdXRwdXRTdHJlYW0+IGNvbm5lY3Rpb25zID0gc2VydmxldC5nZXRDb25uZWN0aW9ucyh0aGlz KTsNCiAgICAgICAgICAgIGlmIChjb25uZWN0aW9ucy5zaXplKCkgPiAwKSB7DQogICAgICAgICAg ICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7DQogICAgICAgICAgICAJCWxvZ2dl ci5kZWJ1ZygiQ29tZXQgc2VuZGVyICIgKyBpZCArICIuIFNlbmRpbmcgbWVzc2FnZSB0byAiICsg Y29ubmVjdGlvbnMuc2l6ZSgpICsgIiBvcGVuZWQgY29ubmVjdGlvbnMiKTsNCiAgICAgICAgICAg IAl9DQogICAgICAgICAgICAgICAgSXRlcmF0b3I8U3luY2hyb25pemVkT3V0cHV0U3RyZWFtPiBp dCA9IGNvbm5lY3Rpb25zLml0ZXJhdG9yKCk7DQogICAgICAgICAgICAgICAgd2hpbGUgKGl0Lmhh c05leHQoKSkgeyAgICAgICAgICAgICAgICAJDQogICAgICAgICAgICAgICAgICAgIHRyeSB7DQog ICAgICAgICAgICAgICAgICAgIAlTeW5jaHJvbml6ZWRPdXRwdXRTdHJlYW0gc3RyZWFtID0gaXQu bmV4dCgpOw0KICAgICAgICAgICAgICAgICAgICAJaWYgKCFzdHJlYW0uaXNDbG9zZWQoKSkgew0K CSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGVuZGluZ1JhdGVz Lmxlbmd0aDsgaisrKSB7DQoJICAgICAgICAgICAgICAgICAgICAgICAgCWJ5dGVbXSBidWZmZXIg PSBTZXJpYWxpemF0aW9uVXRpbHMuc2VyaWFsaXplKHBlbmRpbmdSYXRlc1tqXSk7DQoJICAgICAg ICAgICAgICAgICAgICAgICAgCXN0cmVhbS53cml0ZShidWZmZXIpOw0KCSAgICAgICAgICAgICAg ICAgICAgICAgIAlyYXRlU2VudChwZW5kaW5nUmF0ZXNbal0pOw0KCSAgICAgICAgICAgICAgICAg ICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgCX0gZWxzZSB7DQogICAgICAgICAgICAgICAg ICAgIAkJc2VydmxldC5yZW1vdmVDb25uZWN0aW9uKHRoaXMsIHN0cmVhbSk7DQogICAgICAgICAg ICAgICAgICAgIAl9DQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUp IHsNCiAgICAgICAgICAgICAgICAgICAgCWxvZ2dlci5lcnJvcigiQ29tZXQgc2VuZGVyICIgKyBp ZCArICIuRXhjZXB0aW9uIHNlbmRpbmcgbWVzc2FnZSB0byBjbGllbnQuIFByb2JhYmx5IGEgY2xp ZW50IGhhcyBjbG9zZWQgdGhlIHN0cmVhbS4iKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAg ICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBkdW1wU3RhdHMoKTsNCiAgICAgICAgICAg IH0NCiAgICAgICAgICAgIGNvbm5lY3Rpb25zLmNsZWFyKCk7DQogICAgICAgICAgICB0cnkgew0K CQkJCVRocmVhZC5zbGVlcCg1MDApOw0KCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24g ZSkgew0KCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQl9DQogICAgICAgIH0NCiAgICB9DQoN CglwdWJsaWMgdm9pZCBkdW1wU3RhdHMoKSB7DQoNCgkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJl bnRUaW1lTWlsbGlzKCk7DQoNCgkJaWYgKChzdGF0c0xhc3REdW1wZWQgIT0gLTEpICYmICh0aW1l IC0gc3RhdHNMYXN0RHVtcGVkIDwgRFVNUF9TVEFUU19JTlRFUlZBTCkpIHsNCgkJCXJldHVybjsN CgkJfQ0KDQoJCVN0cmluZ0J1ZmZlciBzdGF0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCgkJc3Rh dHMuYXBwZW5kKCJSYXRlIHN0cmVhbWluZyBjb21ldCBzZXJ2ZXIgIiArIGlkICsgIiBzdGF0aXN0 aWNzXG4iKTsNCgkJc3RhdHMuYXBwZW5kKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LVxuXG4iKTsNCgkJDQoJCUl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIEludGVnZXI+PiBpdCA9 IHJhdGVzV3JpdGVkLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsNCgkJd2hpbGUgKGl0Lmhhc05leHQo KSkgewkJCQ0KCQkJTWFwLkVudHJ5PFN0cmluZyxJbnRlZ2VyPiBlbnRyeSA9IGl0Lm5leHQoKTsN Cg0KCQkJZG91YmxlIHRocm91Z2hwdXQgPSAxLjBEICogZW50cnkuZ2V0VmFsdWUoKSAvICgodGlt ZSAtIHN0YXRzTGFzdER1bXBlZCkvMTAwMCk7IA0KCQkJDQoJCQlJbnRlZ2VyIGlwZW5kaW5nID0g cmF0ZXNQZW5kaW5nLmdldChlbnRyeS5nZXRLZXkoKSk7DQoJCQlpbnQgcGVuZGluZyA9IGlwZW5k aW5nID09IG51bGwgPyAwIDogaXBlbmRpbmcuaW50VmFsdWUoKTsNCg0KCQkJc3RhdHMuYXBwZW5k KGVudHJ5LmdldFZhbHVlKCkpOw0KCQkJc3RhdHMuYXBwZW5kKCIgcmF0ZXMgaGFzIGJlZW4gc2Vu dCBmb3IgdGhlIGN1cnJlbmN5IHBhaXIgIik7DQoJCQlzdGF0cy5hcHBlbmQoZW50cnkuZ2V0S2V5 KCkpOw0KCQkJc3RhdHMuYXBwZW5kKCIuIFRoaXMgbWFrZXMgYSB0aHJvdWdocHV0IG9mOiAiKTsN CgkJCXN0YXRzLmFwcGVuZCh0aHJvdWdocHV0KTsNCgkJCXN0YXRzLmFwcGVuZCgiIHJhdGVzL3Nl Yy4iKTsNCgkJCXN0YXRzLmFwcGVuZChwZW5kaW5nKTsNCgkJCXN0YXRzLmFwcGVuZCgiIHJhdGVz IHBlbmRpbmcuXG4iKTsNCgkJfQ0KCQlsb2dnZXIuaW5mbyhzdGF0cyk7DQoJCQ0KCQkNCgkJc3Rh dHNMYXN0RHVtcGVkID0gdGltZTsNCgkJcmF0ZXNXcml0ZWQuY2xlYXIoKTsNCgl9DQogICAgDQoJ cHVibGljIHZvaWQgcmF0ZUFkZGVkKFJhdGUgcmF0ZSkgew0KCQkNCgkJLy8gQWRkIG9uZSB0byB0 aGUgc2VudCByYXRlcw0KCQlTdHJpbmcgcmF0ZUlkID0gcmF0ZS5nZXRJZCgpOw0KCQlJbnRlZ2Vy IHJhdGVzID0gcmF0ZXNQZW5kaW5nLmdldChyYXRlSWQpOw0KCQlpZiAocmF0ZXMgPT0gbnVsbCkg ew0KCQkJcmF0ZXMgPSBuZXcgSW50ZWdlcigwKTsNCgkJfQ0KCQlyYXRlc1BlbmRpbmcucHV0KHJh dGVJZCxuZXcgSW50ZWdlcihyYXRlcy5pbnRWYWx1ZSgpKzEpKTsNCgl9DQoJDQoJcHVibGljIHZv aWQgcmF0ZVNlbnQoUmF0ZSByYXRlKSB7DQoNCgkJLy8gQWRkIG9uZSB0byB0aGUgc2VudCByYXRl cw0KCQlTdHJpbmcgcmF0ZUlkID0gcmF0ZS5nZXRJZCgpOw0KCQlJbnRlZ2VyIHJhdGVzID0gcmF0 ZXNXcml0ZWQuZ2V0KHJhdGVJZCk7DQoJCWlmIChyYXRlcyA9PSBudWxsKSB7DQoJCQlyYXRlcyA9 IG5ldyBJbnRlZ2VyKDApOw0KCQl9DQoJCXJhdGVzV3JpdGVkLnB1dChyYXRlSWQsbmV3IEludGVn ZXIocmF0ZXMuaW50VmFsdWUoKSsxKSk7CQkNCgl9DQoNCglwdWJsaWMgaW50IGdldElkKCkgew0K CQlyZXR1cm4gaWQ7DQoJfQ0KCQ0KfQ0K ------=_Part_3940_9714514.1178096422230 Content-Type: text/x-java; name="SynchronizedOutputStream.java" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="SynchronizedOutputStream.java" X-Attachment-Id: f_f17k50sw cGFja2FnZSBjb20uY29nbm90ZWMuc3RyZWFtaW5nOw0KDQppbXBvcnQgamF2YS5pby5JT0V4Y2Vw dGlvbjsNCmltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCg0KLyoqDQogKiBUaGlzIG91dHB1 dCBzdHJlYW0gc2ltcGx5IHdyYXBzIGFub3RoZXIgb3V0cHV0IHN0cmVhbSBhbmQgc3luY2hyb25p emVzIGFjY2Vzcw0KICogdG8gdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbS4gVGhlIHN5bmNo cm9uaXphdGlvbiBpcyBkb25lIG9uIHRoZSBpbnN0YW5jZQ0KICogb2YgdGhpcyBjbGFzcy4NCiAq IA0KICogQGF1dGhvciBzZWJzdGVyDQogKi8NCnB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRPdXRw dXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gew0KDQoJZmluYWwgT3V0cHV0U3RyZWFtIG91 dDsNCgkNCglib29sZWFuIGNsb3NlZDsNCg0KCXB1YmxpYyBTeW5jaHJvbml6ZWRPdXRwdXRTdHJl YW0oZmluYWwgT3V0cHV0U3RyZWFtIG91dCkgew0KCQlpZiAob3V0ID09IG51bGwpIHsNCgkJCXRo cm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigib3V0Iik7IC8vJE5PTi1OTFMtMSQNCgkJfQ0K CQl0aGlzLm91dCA9IG91dDsNCgl9DQoNCglwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUo ZmluYWwgYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQoJCW91dC53cml0ZShiKTsNCgl9 DQoNCglwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGIsIGZpbmFs IGludCBvZmYsIGZpbmFsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQoJCW91dC53cml0 ZShiLCBvZmYsIGxlbik7DQoJfQ0KDQoJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlKGZp bmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KCQlvdXQud3JpdGUoYik7DQoJfQ0KDQoJ cHVibGljIHN5bmNocm9uaXplZCB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCgkJ b3V0LmZsdXNoKCk7DQoJfQ0KDQoJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhy b3dzIElPRXhjZXB0aW9uIHsNCgkJDQoJCWNsb3NlZD10cnVlOw0KCQlvdXQuY2xvc2UoKTsNCgl9 DQoNCglwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDbG9zZWQoKSB7DQoJCXJldHVybiBj bG9zZWQ7DQoJfQ0KDQp9DQoNCg== ------=_Part_3940_9714514.1178096422230 Content-Type: text/plain; charset=us-ascii --------------------------------------------------------------------- To start a new topic, e-mail: users@tomcat.apache.org To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org For additional commands, e-mail: users-help@tomcat.apache.org ------=_Part_3940_9714514.1178096422230--