> On May 30, 2024, at 08:47, <joan.balagu...@ventusproxy.com> 
> <joan.balagu...@ventusproxy.com> wrote:
> 
> I have a NIO connector with an asynchronous servlet with its write listener 
> (working in both tomcat 8.5 and tomcat 10.1.20).
> 
> @Override
> public void onWritePossible() throws IOException {
> 
>  if (this.isFirst) {
>    this.os = this.asyncContext.getResponse().getOutputStream();
>    this.startIdx = 0;
>    this.endIdx = WRITE_BUFFER_SIZE;
>  }


Is there any logic somewhere to clear isFirst? If not, the start and end 
indices will be reset every time this method is called should os.isReady() 
returns false.


> while (this.startIdx < this.endIdx && this.os.isReady()) {
>     this.os.write(this.response, this.startIdx, this.endIdx - this.startIdx);
> 
>     this.startIdx = this.endIdx;
>     this.endIdx += WRITE_BUFFER_SIZE;
>     if (this.endIdx > this.response.length) this.endIdx = 
> this.response.length;
>  }
> 
>  if (this.startIdx == this.endIdx) {
>    this.ac.complete();
>  }
> }
> 
> Only when the response to return is bigger than 32K then:
> 1. Writing the response in chunks of WRITE_BUFFER_SIZE  = 32K, sometimes our 
> client receives the response in wrong order (complete, all bytes written, but 
> in different order).
> 2. Setting a WRITE_BUFFER_SIZE  = 8K seems to fix this issue.
> 
> But it's weird, this is only happening in this client, we have other 
> installations returning responses of megabytes with no issues.


Perhaps this one client has a slow network, so isReady() returns false in that 
environment, but not in other ones.

  - Chuck


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to