<div dir="ltr">You can use the Receiver API, specifically for that purpose.<div>On the exchange, call: getRequestReceiver();</div><div><br></div><div>You will get a receiver object:</div><div><a href="https://github.com/undertow-io/undertow/blob/master/core/src/main/java/io/undertow/io/Receiver.java">https://github.com/undertow-io/undertow/blob/master/core/src/main/java/io/undertow/io/Receiver.java</a><br></div><div><br></div><div>On the receiver you can call: receiveFullString, you have to pass it a callback that will be called when the whole body has been read.</div><div><br></div><div>Please share your results when you test this further!</div><div><br></div><div>Cheers,</div><div>Antoine</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 22, 2017 at 8:27 PM, SenthilKumar K <span dir="ltr"><<a href="mailto:senthilec566@gmail.com" target="_blank">senthilec566@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Seems to Reading Request body is wrong , So what is the efficient way of reading request body in undertow ?<div><br></div><div>--Senthil</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 22, 2017 at 11:30 PM, SenthilKumar K <span dir="ltr"><<a href="mailto:senthilec566@gmail.com" target="_blank">senthilec566@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hello Undertow Dev Team ,<div><br></div><div> I have been working on the use case where i should create simple http server to serve 1.5 Million Requests per Second per Instance .. </div><div><br></div><div><br></div><div>Here is the benchmark result of Undertow :</div><div><br></div><div><div>Running 1m test @ <a href="http://127.0.0.1:8009/" target="_blank">http://127.0.0.1:8009/</a></div><div> 20 threads and 40 connections</div><div> Thread Stats Avg Stdev Max +/- Stdev</div><div> Latency 2.51ms 10.75ms 282.22ms 99.28%</div><div> Req/Sec 1.12k 316.65 1.96k 54.50%</div><div> Latency Distribution</div><div> 50% 1.43ms</div><div> 75% 2.38ms</div><div> 90% 2.90ms</div><div> 99% 10.45ms</div><div> 1328133 requests in 1.00m, 167.19MB read</div><div>Requests/sec: <b>22127</b>.92</div><div>Transfer/sec: 2.79MB</div></div><div><br></div><div>This is less compared to other frameworks like Jetty and Netty .. But originally Undertow is high performant http server .. </div><div><br></div><div>Hardware details:</div><div><span style="color:rgb(128,128,128);font-family:arial,helvetica,"helvetica neue",verdana,sans-serif;font-size:14px">Xeon CPU E3-1270 v5 machine with 4 cores ( Clock 100 MHz, Capacity 4 GHz) , Memory : 32 G , Available memory 31 G.</span><br></div><div><br></div><div>I would need Undertow experts to review the server code below and advice me on tuning to achieve my goal( ~1.5 Million requests/sec ).</div><div><br></div><div>Server :</div><div><br></div><div><div>Undertow server = Undertow.builder()</div><div> .addHttpListener(8009, "localhost")</div><div> .setHandler(new Handler()).build();</div><div>server.start();</div></div><div><br></div><div><br></div><div>Handler.Java</div><div><br></div><div><div> final Pooled<ByteBuffer> pooledByteBuffer = </div><div> exchange.getConnection().getB<wbr>ufferPool().allocate();</div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">                </span>final ByteBuffer byteBuffer = pooledByteBuffer.getResource()<wbr>;</div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span> byteBuffer.clear();</div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span> exchange.getRequestChannel().<wbr>read(byteBuffer);</div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span> int pos = byteBuffer.position();</div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span> byteBuffer.rewind();</div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span> byte[] bytes = new byte[pos];</div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span> byteBuffer.get(bytes);</div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span> String requestBody = new String(bytes, Charset.forName("UTF-8") );</div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span> byteBuffer.clear();</div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span> pooledByteBuffer.free();</div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span> final PostToKafka post2Kafka = new PostToKafka();</div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">                </span>try {</div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">                        </span><b>post2Kafka.write2Kafka(request<wbr>Body); { This API can handle ~2 Millions events per sec }</b></div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">                </span>} catch (Exception e) {</div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">                        </span>e.printStackTrace();</div><div><span class="m_3588420656321499578m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">                </span>}</div><div> exchange.getResponseHeaders().<wbr>put(Headers.CONTENT_TYPE, "text/plain");</div><div> exchange.getResponseSender().s<wbr>end("SUCCESS");</div></div><div><br></div><div><br></div><div>--Senthil</div></div>
</blockquote></div><br></div>
<br>______________________________<wbr>_________________<br>
undertow-dev mailing list<br>
<a href="mailto:undertow-dev@lists.jboss.org">undertow-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/undertow-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/<wbr>mailman/listinfo/undertow-dev</a><br></blockquote></div><br></div>