Results 1 to 5 of 5

Thread: Spring Async 3.2 Tomcat

  1. #1
    Join Date
    Jul 2008
    Posts
    6

    Default Spring Async 3.2 Tomcat

    Hi,

    I've done some tests with the spring mvc's async functionality and it doesn't work as expected. The tests have been done with the spring-mvc-showcase application and deployed on Tomcat 7.0.34.

    For simplicity I've limited the number of Tomcat's threads to 5:

    Code:
    <Connector connectionTimeout="20000" maxThreads="5" minThreads="5" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
    The service "/async/callable/response-body" returns a callable and another thread (managed by Spring MVC, not Tomcat) executes the call method. This method sleeps for 2 seconds and returns a String.

    Code:
    @RequestMapping("/response-body")
    public @ResponseBody Callable<String> callable() {
    
    	return new Callable<String>() {
    		@Override
    		public String call() throws Exception {
    			Thread.sleep(2000);
    			return "Callable result";
    		}
    	};
    }
    If I do 10 requests to "/async/callable/response-body" path in less than 2 seconds, all the requests should be attended by Tomcat's threads because they don't execute the sleep method. If have understood correctly, the Spring managed threads would be sleeping and Tomcat's threads ready to receive more requests.

    However in the tests I've done, the last 5 requests are queued in Tomcat until the first five requests are completed.

    Have I missed something?

    Thanks in advance.

  2. #2
    Join Date
    Jun 2006
    Location
    The Netherlands
    Posts
    13,632

    Default

    Make sure you have async enabled on the servlet else it will be a normal request.

    Edit: Must have been blinded by the other samples, Callable should work as well. As stated above make sure you have async enabled on the DispatcherServlet.
    Last edited by Marten Deinum; Jan 28th, 2013 at 08:27 AM. Reason: Callable should work as well as DeferredResult.
    Marten Deinum
    Java Consultant / Pragmatist / Open Source Enthousiast / Author


    Pro Spring MVC: With Web Flow
    Conspect

    Have you read the reference guide.
    Use the [ code ] tags, young padawan

  3. #3
    Join Date
    Jul 2008
    Posts
    6

    Default

    The DispatcherServlet is configured correctly as you can see in the code below:

    Code:
    <servlet>
    	<servlet-name>appServlet</servlet-name>
    	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    	<init-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    	</init-param>
    	<load-on-startup>1</load-on-startup>
    	<async-supported>true</async-supported>
    </servlet>
    It's the last version of spring-mvc-showcase and I've only changed the time to sleep. I wonder if I should configure something in Tomcat to get this work, but I don't think so.

  4. #4
    Join Date
    Jul 2008
    Posts
    6

    Default

    Hi,

    I've done the same test with another application (spring-mvc-chat) and I've got the same result.

    With Tomcat limited to 5 threads, after 5 clients connected to the chat all Tomcat threads are busy and the server doesn't respond.

  5. #5
    Join Date
    Jul 2008
    Posts
    6

    Default

    Hi again,

    I've used the NIO connector instead of the default and now the server does process all the request concurrently.

    Code:
    <Connector connectionTimeout="20000" maxThreads="5" minThreads="5" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>
    However, I thought that it wasn't necessary to change the connector to free Tomcat's threads with Servlet 3.0. Have I missunderstod something?

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •