user1866731
user1866731

Reputation: 499

Threads inside webapplication Java

Well,im trying to build a web applicattion in Java that starts a thread each time someone make a http request in the address. This is a good pratice? Could work?? Advantages or disadvantages? Work is below and use a spring example,just added the thread that i want

ps: This is running in tomcat

> HomeController.java

    @Controller  public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute("serverTime", formattedDate );
        new Teste().start();
        return "home";
    }}class Teste extends Thread{

    @Override
    public void run() {

        while(true){
            System.out.println("im in thread");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
    }

> web.xml

    <?xml version="1.0" encoding="UTF-8"?>  
<web-app version="2.5"xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/n/javaee/web-app_2_5.xsd">

    <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>

    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- Processes application requests -->
    <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>
    </servlet>

    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

> servlet-context.xml

    <?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>

    <context:component-scan base-package="com.example.threadTestes" />



</beans:beans>

Upvotes: 0

Views: 1366

Answers (2)

Andrey Nudko
Andrey Nudko

Reputation: 707

Starting a thread for every request is terrible idea in any application, managed or unmanaged, and #1 reason for that is that amount of memory OS can use to allocate a stack for new thread is limited; and not only it's limited, it is shared between all processes on the box (though your java process may be allowed to use only part of that). Now imagine those threads won't terminate at all, or won't terminate fast enough as new requests keep coming in - OS will eventually run out of space for new threads; depending on the OS and it's settings, result may vary from rather fascinating OutOfMemoryError in new Thread(), to the whole box becoming apparently unresponsive, because your java process consumed all available space and no new threads can be created at all. So: 1) for handling requests use at least thread pool (Executor); JMS is an option if you need persistence, but again you handle requests in the pool - it's just fed from JMS 2) for some sort of maintainence tasks you can launch a separate thread during app startup. In both cases clean up after yourself and stop additional threads during shutdown.

Upvotes: 1

radai
radai

Reputation: 24212

threading in a managed environment is generally a bad idea. why not use some sort of abstraction like JMS to start a background handler every time someone sends a request ? that way you can control the number of active threads (jms pool size)

Upvotes: 2

Related Questions