{"id":59765,"date":"2020-08-23T16:26:02","date_gmt":"2020-08-23T16:26:02","guid":{"rendered":"https:\/\/www.baeldung.com\/?p=86095"},"modified":"2020-08-23T16:26:02","modified_gmt":"2020-08-23T16:26:02","slug":"spring-mvc-async-vs-spring-webflux","status":"publish","type":"post","link":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/2020\/08\/23\/spring-mvc-async-vs-spring-webflux\/","title":{"rendered":"Spring MVC Async vs Spring WebFlux"},"content":{"rendered":"<p class=\"syndicated-attribution\"><meta name= \\\"keywords \\\" content= \\\"\u96fb\u5b50\u8a08\u7b97\u6a5f, \u6559\u80b2, IT \u96fb\u8166\u73ed,\u96fb\u8166\u88dc\u7fd2\uff0c \u96fb\u8166\u73ed\uff0c \u5bb6\u6559\uff0c \u79c1\u4eba\u8001\u5e2b\uff0c \u8cc7\u8a0a\u6280\u8853\uff0c \u7a0b\u5e8f\u8a2d\u8a08\uff0c \u96fb\u5b50\u8a08\u7b97\u6a5f\uff0c \u904a\u6232\uff0c \u860b\u679c\uff0c \u96fb\u5f71\uff0c \u8a08\u7b97\u6a5f\uff0c\u7de8\u78bc\uff0c Java\uff0c C\/C++\uff0c JavaScript\uff0c PHP\uff0c HTML\uff0c CSS\uff0c MySQL\uff0c mobile\uff0c Android\uff0c \u52d5\u6f2b\uff0c Python\uff0c teacher\uff0c \u88dc\u7fd2\uff0c \u96fb\u8166\u88dc\u7fd2 \u8cc7\u8a0a, \u7535\u5b50\u8ba1\u7b97\u673a, IT ,Game, apple, movie, Computer,student,Java,\u6559\u80b2, ,\u5b66\u751f, \u5b66\u4e60, learn, \u6559\u5b66,  Android, apple,anime, animation, \u4fe1\u606f\u6280\u672f, \u7a0b\u5e8f\u8bbe\u8ba1, \u79fb\u52a8\u7535\u8bdd, \u8cc7\u8a0a\u79d1\u6280,Game, Jeu, Juego,Call Of Duty ,\u4f7f\u547d\u53ec\u559a , \u6e38\u620f, \u7535\u5b50\u6e38\u620f,, \u591a\u4eba\u7535\u5b50\u6e38\u620f, \u7f51\u7edc\u6e38\u620f\uff0conline\uff0conline game, \u624b\u673a\u6e38\u620f, mobile \\\"><\/p>\n<h2  data-id=\"introduction\">1. Introduction<\/h2>\n<div class=\"bd-anchor\" id=\"introduction\"><\/div>\n<p>In this tutorial, we&#8217;ll explore the <em>@Async<\/em> annotation in Spring MVC, and then we&#8217;ll get familiar with Spring WebFlux. Our goal is to have a better understanding of the difference between these two.<\/p>\n<h2  data-id=\"implementation scenario\">2. Implementation Scenario<\/h2>\n<div class=\"bd-anchor\" id=\"implementation scenario\"><\/div>\n<p>Here, we want to choose a scenario to show how we can implement a simple web application with each of these APIs. Moreover, we&#8217;re especially interested to see more about thread management and blocking or non-blocking I\/O in each case.<\/p>\n<p>Let&#8217;s choose a web application with one endpoint that returns a string result. The point here is that the request will pass through a <em>Filter<\/em> with a small 200ms delay, and then the <em>Controller<\/em> needs 500ms to calculate and return the result.<\/p>\n<p>Next, we&#8217;re going to simulate a load with <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/httpd.apache.org\/docs\/2.4\/programs\/ab.html\">Apache ab<\/a> on both endpoints and monitor our app behavior with <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/docs.oracle.com\/javase\/7\/docs\/technotes\/guides\/management\/jconsole.html\">JConsole<\/a>.<\/p>\n<p>It may worth mentioning that in this article, <strong>our goal is not a benchmark between these two APIs, just a small load test so we can trace the thread management<\/strong>.<\/p>\n<h2  data-id=\"spring-mvc-async\">3. Spring MVC Async<\/h2>\n<div class=\"bd-anchor\" id=\"spring-mvc-async\"><\/div>\n<p>Spring 3.0 introduced the <em>@Async<\/em> annotation. <em>@Async<\/em>&#8216;s goal is to allow the application to run heavy-load jobs on a separate thread. Also, the caller can wait for the result if interested. Hence the return type must not be <em>void<\/em>, and it be can be any of <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/java-future\"><em>Future<\/em><\/a>, <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/java-completablefuture\"><em>CompletableFuture<\/em><\/a>, or <em>ListenableFuture<\/em>.<\/p>\n<p>Moreover, <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/docs.spring.io\/spring\/docs\/3.2.x\/spring-framework-reference\/html\/new-in-3.2.html\">Spring 3.2<\/a>\u00a0introduced the <em>org.springframework.web.context.request.async<\/em> package that, together with <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/blogs.oracle.com\/enterprisetechtips\/asynchronous-support-in-servlet-30\">Servlet 3.0<\/a>, brings the joy of the asynchronous process to the web layer. Thus, since Spring 3.2, <em>@Async<\/em> can be used in classes annotated as <em>@Controller<\/em> or <em>@RestController<\/em>.<\/p>\n<p>When the client initiates a request, it goes through all matched filters in the filter chain until it arrives at the <em>DispatcherServlet<\/em> instance.<\/p>\n<p>Then, the servlet takes care of the async dispatching of the request. It marks the request as started by calling <em>AsyncWebRequest#startAsync, <\/em>transfers the request handling to an instance of <em>WebSyncManager<\/em>, and finishes its job without committing the response. The filter chain also is traversed in the reverse direction to the root.<em><br \/>\n<br \/>\n<\/em><\/p>\n<p><em>WebAsyncManager<\/em> submits the request processing job in its associated <em>ExecutorService<\/em>. Whenever the result is ready, it notifies <em>DispatcherServlet<\/em> for returning the response to the client.<\/p>\n<h2  data-id=\"spring-async-implementation\">4. Spring Async Implementation<\/h2>\n<div class=\"bd-anchor\" id=\"spring-async-implementation\"><\/div>\n<p>Let&#8217;s start the implementation by writing our application class, <em>AsyncVsWebFluxApp<\/em>. H<em>ere, @EnableAsync<\/em> does the magic of enabling async for our Spring Boot application:<\/p>\n<pre><code class=\"language-java\">@SpringBootApplication\r\n@EnableAsync\r\npublic class AsyncVsWebFluxApp {\r\n    public static void main(String[] args) {\r\n        SpringApplication.run(AsyncVsWebFluxApp.class, args);\r\n    }\r\n}<\/code><\/pre>\n<p>Then we have <em>AsyncFilter<\/em>, which implements <em>javax.servlet.Filter. <\/em>Don&#8217;t forget to simulate the delay in the<em> doFilter<\/em> method:<\/p>\n<pre><code class=\"language-java\">@Component\r\npublic class AsyncFilter implements Filter {\r\n    ...\r\n    @Override\r\n    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)\r\n      throws IOException, ServletException {\r\n        \/\/ sleep for 200ms \r\n        filterChain.doFilter(servletRequest, servletResponse);\r\n    }\r\n}<\/code><\/pre>\n<p>Finally, we develop our <em>AsyncController<\/em> with the &#8220;<em>\/async_result<\/em>&#8221; endpoint:<\/p>\n<pre><code class=\"language-java\">@RestController\r\npublic class AsyncController {\r\n    @GetMapping(\"\/async_result\")\r\n    @Async\r\n    public CompletableFuture getResultAsyc(HttpServletRequest request) {\r\n        \/\/ sleep for 500 ms\r\n        return CompletableFuture.completedFuture(\"Result is ready!\");\r\n    }\r\n}<\/code><\/pre>\n<p>Because of the <em>@Async<\/em> above <em>getResultAsync<\/em>, this method is executed in a separate thread on the application&#8217;s default <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/java-executor-service-tutorial\"><em>ExecutorService<\/em><\/a>. However, it is possible to <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/spring-async\">set up a specific <em>ExecutorService<\/em> for our method<\/a>.<\/p>\n<p>Test time! Let&#8217;s run the application, install Apache ab, or any tools to simulate the load. Then we can send a bunch of concurrent requests over the &#8220;async_result&#8221; endpoint. We can execute JConsole and attach it to our java application to monitor the process:<\/p>\n<pre><code class=\"language-bash\">ab -n 1600 -c 40 localhost:8080\/async_result<\/code><\/pre>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~www.baeldung.com\/wp-content\/uploads\/2020\/08\/Async-jconsol.png\"><img decoding=\"async\" class=\"size-medium wp-image-225875 aligncenter\" src=\"http:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/Async-jconsol-300x201.png\" alt=\"\" \/><\/a> <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~www.baeldung.com\/wp-content\/uploads\/2020\/08\/Async-ab.png\"><img decoding=\"async\" class=\"size-medium wp-image-225876 aligncenter\" src=\"http:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/Async-ab-300x78.png\" alt=\"\" \/><\/a><\/p>\n<h2  data-id=\"spring-webflux\">5. Spring WebFlux<\/h2>\n<div class=\"bd-anchor\" id=\"spring-webflux\"><\/div>\n<p>Spring 5.0 has introduced <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/docs.spring.io\/spring\/docs\/current\/spring-framework-reference\/web-reactive.html\">WebFlux to support the reactive web<\/a> in a non-blocking manner. WebFlux is based on the reactor API, just another awesome implementation of the <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.reactive-streams.org\/\">reactive stream<\/a>.<\/p>\n<p><strong>Spring WebFlux supports reactive backpressure and <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/blogs.oracle.com\/arungupta\/whats-new-in-servlet-31-java-ee-7-moving-forward\">Servlet 3.1+<\/a> with its non-blocking I\/O. Hence, it can be run on Netty, Undertow, Jetty, Tomcat, or any Servlet 3.1+ compatible server.<\/strong><\/p>\n<p>Although all servers don&#8217;t use the same thread management and concurrency control model, Spring WebFlux will work fine as long as they are supporting non-blocking I\/O and reactive backpressure.<\/p>\n<p>Spring WebFlux allows us to decompose the logic in a declarative way with <em>Mono, Flux,<\/em> and their rich operator sets. Moreover, we can have functional endpoints besides its <em>@Controller<\/em> annotated ones.<\/p>\n<h2  data-id=\"spring-webflux-implementation\">6. Spring WebFlux Implementation<\/h2>\n<div class=\"bd-anchor\" id=\"spring-webflux-implementation\"><\/div>\n<p>For <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/spring-webflux\">WebFlux implementation<\/a>, we go the same path as async. So at first, let&#8217;s create the <em>AsyncVsWebFluxApp<\/em>:<\/p>\n<pre><code class=\"language-java\">@SpringBootApplication\r\npublic class AsyncVsWebFluxApp {\r\n    public static void main(String[] args) {\r\n        SpringApplication.run(AsyncVsWebFluxApp.class, args);\r\n    }\r\n}<\/code><\/pre>\n<p>Then let&#8217;s write our <em>WebFluxFilter<\/em>, which implements <em>WebFilter.<\/em> We&#8217;ll generate an intentional delay and then pass the request to the filter chain:<\/p>\n<pre><code class=\"language-java\">@Component\r\npublic class WebFluxFilter implements org.springframework.web.server.WebFilter {\r\n    @Override\r\n    public Mono filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {\r\n        return Mono\r\n          .delay(Duration.ofMillis(200))\r\n          .then(\r\n            webFilterChain.filter(serverWebExchange)\r\n          );\r\n    }\r\n}<\/code><\/pre>\n<p>At last, we have our <em>WebFluxController<\/em>. It exposes an endpoint called <em>&#8220;\/flux_result&#8221;<\/em> and returns a <em>Mono&lt;String&gt;<\/em> as the response:<\/p>\n<pre><code class=\"language-java\">@RestController\r\npublic class WebFluxController {\r\n    @GetMapping(\"\/flux_result\")\r\n    public Mono getResult(ServerHttpRequest request) {\r\n       return Mono.defer(() -&gt; Mono.just(\"Result is ready!\"))\r\n         .delaySubscription(Duration.ofMillis(500));\r\n    }\r\n}<\/code><\/pre>\n<p>For the test, we&#8217;re taking the same approach as with our async sample application. Here&#8217;s the sample result for:<em><br \/>\n<br \/>\n<\/em><\/p>\n<pre><code class=\"language-bash\">ab -n 1600 -c 40 localhost:8080\/flux_result<\/code><\/pre>\n<p><a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~www.baeldung.com\/wp-content\/uploads\/2020\/08\/WebFlux-jconsole.png\"><img decoding=\"async\" class=\"size-medium wp-image-225878 aligncenter\" src=\"http:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/WebFlux-jconsole-300x203.png\" alt=\"\" \/><\/a><a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~www.baeldung.com\/wp-content\/uploads\/2020\/08\/WebFlux-ab.png\"><img decoding=\"async\" class=\"size-medium wp-image-225877 aligncenter\" src=\"http:\/\/www.baeldung.com\/wp-content\/uploads\/2020\/08\/WebFlux-ab-300x77.png\" alt=\"\" \/><\/a><\/p>\n<h2  data-id=\"difference\">7. What&#8217;s the Difference?<\/h2>\n<div class=\"bd-anchor\" id=\"difference\"><\/div>\n<p>Spring Async supports Servlet 3.0 specifications, but Spring WebFlux supports Servlet 3.1+. It brings a number of differences:<\/p>\n<ul>\n<li>Spring Async I\/O model during its communication with the client is blocking. It may cause a performance problem with slow clients. On the other hand, Spring WebFlux provides a non-blocking I\/O model.<\/li>\n<li>Reading the request body or request parts is blocking in Spring Async, whiles it is non-blocking in Spring WebFlux.<\/li>\n<li>In Spring Async, <em>Filter<\/em>s and <em>Servlet<\/em>s are working synchronously, but Spring WebFlux supports full asynchronous communication.<\/li>\n<li>Spring WebFlux is compatible with wider ranges of Web\/Application servers than Spring Async, like Netty, and Undertow.<\/li>\n<\/ul>\n<p>Moreover, Spring WebFlux supports reactive backpressure, so we have more control over how we should react to fast producers than both Spring MVC Async and Spring MVC.<\/p>\n<p>Spring Flux also has a tangible shift towards functional coding style and declarative API decomposition thanks to Reactor API behind it.<\/p>\n<p>Do all of these items lead us to use Spring WebFlux? Well, <strong>Spring Async or even Spring MVC might be the right answer to a lot of projects out there, depending on the desired load scalability or availability of the system<\/strong>.<\/p>\n<p>Regarding scalability, Spring Async gives us better results than synchronous Spring MVC implementation. Spring WebFlux, because of its reactive nature, provides us elasticity and higher availability.<\/p>\n<h2  data-id=\"conclusion\">8. Conclusion<\/h2>\n<div class=\"bd-anchor\" id=\"conclusion\"><\/div>\n<p>In this article, we learned more about Spring Async and Spring WebFlux, then we had a comparison of them theoretically and practically with a basic load test.<\/p>\n<p>As always, complete code for the <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/github.com\/eugenp\/tutorials\/tree\/master\/spring-boot-modules\/spring-boot-mvc-3\">Async sample<\/a> and the <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/github.com\/eugenp\/tutorials\/tree\/master\/spring-5-webflux\">WebFlux sample<\/a> are available over GitHub.<\/p>\n<p><Img align=\"left\" border=\"0\" height=\"1\" width=\"1\" alt=\"\" style=\"border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;\" hspace=\"0\" src=\"https:\/\/feeds.feedblitz.com\/~\/i\/634246384\/0\/baeldung\"><\/p>\n<div style=\"clear:both;padding-top:0.2em;\"><a title=\"Like on Facebook\" href=\"https:\/\/feeds.feedblitz.com\/_\/28\/634246384\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/fblike20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Share on Google+\" href=\"https:\/\/feeds.feedblitz.com\/_\/30\/634246384\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/googleplus20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Pin it!\" href=\"https:\/\/feeds.feedblitz.com\/_\/29\/634246384\/baeldung,http%3A%2F%2Fwww.baeldung.com%2Fwp-content%2Fuploads%2F2020%2F08%2FAsync-jconsol-300x201.png\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/pinterest20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Tweet This\" href=\"https:\/\/feeds.feedblitz.com\/_\/24\/634246384\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/twitter20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Subscribe by email\" href=\"https:\/\/feeds.feedblitz.com\/_\/19\/634246384\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/email20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Subscribe by RSS\" href=\"https:\/\/feeds.feedblitz.com\/_\/20\/634246384\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/rss20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a rel=\"NOFOLLOW\" title=\"View Comments\" href=\"https:\/\/www.baeldung.com\/spring-mvc-async-vs-webflux#respond\"><img decoding=\"async\" height=\"20\" style=\"border:0;margin:0;padding:0;\" src=\"https:\/\/assets.feedblitz.com\/i\/comments20.png\"><\/a>&#160;<a title=\"Follow Comments via RSS\" href=\"https:\/\/www.baeldung.com\/spring-mvc-async-vs-webflux\/feed\/\"><img decoding=\"async\" height=\"20\" style=\"border:0;margin:0;padding:0;\" src=\"https:\/\/assets.feedblitz.com\/i\/commentsrss20.png\"><\/a>&#160;<\/div>\n\n<p class=\"syndicated-attribution\"><figure class= \\\"wp-block-image alignnone \\\"><img src= \\\"http:\/\/itteacheritfreelance.hk\/test\/wordpress\/wp-content\/uploads\/2016\/05\/logo2-2.png\\\" alt=\\\"IT\u96fb\u8166\u88dc\u7fd2 java\u88dc\u7fd2 \u70ba\u5927\u5bb6\u914d\u5c0d\u96fb\u8166\u88dc\u7fd2,IT freelance, \u79c1\u4eba\u8001\u5e2b, PHP\u88dc\u7fd2,CSS\u88dc\u7fd2,XML,Java\u88dc\u7fd2,MySQL\u88dc\u7fd2,graphic design\u88dc\u7fd2,\u4e2d\u5c0f\u5b78ICT\u88dc\u7fd2,\u4e00\u5c0d\u4e00\u79c1\u4eba\u88dc\u7fd2\u548cFreelance\u81ea\u7531\u5de5\u4f5c\u914d\u5c0d\u3002\\\"\/><figcaption>\u7acb\u523b\u8a3b\u518a\u53ca\u5831\u540d\u96fb\u8166\u88dc\u7fd2\u8ab2\u7a0b\u5427!<\/figcaption><\/figure>\r\n<\/br>Find A Teacher Form:\r\n<\/br>https:\/\/docs.google.com\/forms\/d\/1vREBnX5n262umf4wU5U2pyTwvk9O-JrAgblA-wH9GFQ\/viewform?edit_requested=true#responses\r\n<\/br><\/br>Email:\r\n<\/br>public1989two@gmail.com<br><br><br><br><br><br><br>\r\n<a href=www.itsec.hk style=color:#FFFFFF;>www.itsec.hk<\/a><br>\r\n<a href=\\\"www.itsec.vip\\\" style=color:#FFFFFF;>www.itsec.vip<\/a><br>\r\n<a href=\\\"www.itseceu.uk\\\" style=color:#FFFFFF;>www.itseceu.uk<\/a><br><\/p>","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Learn about Spring Async and Spring WebFlux both theoretically and practically with a basic load test<\/p>\n<div><a title=\"Like on Facebook\" href=\"https:\/\/feeds.feedblitz.com\/_\/28\/634246384\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/fblike20.png\"><\/a>&nbsp;<a title=\"Share on Google+\" href=\"https:\/\/feeds.feedblitz.com\/_\/30\/634246384\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/googleplus20.png\"><\/a>&nbsp;<a title=\"Pin it!\" href=\"https:\/\/feeds.feedblitz.com\/_\/29\/634246384\/baeldung,http%3A%2F%2Fwww.baeldung.com%2Fwp-content%2Fuploads%2F2020%2F08%2FAsync-jconsol-300x201.png\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/pinterest20.png\"><\/a>&nbsp;<a title=\"Tweet This\" href=\"https:\/\/feeds.feedblitz.com\/_\/24\/634246384\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/twitter20.png\"><\/a>&nbsp;<a title=\"Subscribe by email\" href=\"https:\/\/feeds.feedblitz.com\/_\/19\/634246384\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/email20.png\"><\/a>&nbsp;<a title=\"Subscribe by RSS\" href=\"https:\/\/feeds.feedblitz.com\/_\/20\/634246384\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/rss20.png\"><\/a>&nbsp;<a rel=\"NOFOLLOW\" title=\"View Comments\" href=\"https:\/\/www.baeldung.com\/spring-mvc-async-vs-webflux#respond\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/comments20.png\"><\/a>&nbsp;<a title=\"Follow Comments via RSS\" href=\"https:\/\/www.baeldung.com\/spring-mvc-async-vs-webflux\/feed\/\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/commentsrss20.png\"><\/a>&nbsp;<\/div>\n<\/div>","protected":false},"author":214,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"slim_seo":{"title":"Spring MVC Async vs Spring WebFlux - ITTeacherITFreelance.hk","description":"Learn about Spring Async and Spring WebFlux both theoretically and practically with a basic load test &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"},"footnotes":""},"categories":[6],"tags":[4784,4785,4786],"_links":{"self":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/59765"}],"collection":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/users\/214"}],"replies":[{"embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/comments?post=59765"}],"version-history":[{"count":8,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/59765\/revisions"}],"predecessor-version":[{"id":64364,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/59765\/revisions\/64364"}],"wp:attachment":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=59765"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=59765"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=59765"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}