【问题标题】:Can a Spring MVC app be multithreaded even if its servlets are not?即使它的 servlet 不是,Spring MVC 应用程序也可以是多线程的吗?
【发布时间】:2011-05-12 15:14:05
【问题描述】:

当您谈到 Spring 应用程序是多线程的时,您一定是指该应用程序中定义的 servlet 是否是多线程的吗?

或者即使应用程序中的 servlet 不是多线程的,Spring 应用程序也可以配置为多线程吗?

【问题讨论】:

  • 是什么让您认为 servlet 不是多线程的?
  • 此外,不是所有的 web 应用程序都天生是多线程的,除非您采取措施串行处理请求?

标签: java multithreading spring servlets spring-mvc


【解决方案1】:

不再支持单线程 servlet。它们已被弃用很长时间,因此所有 servlet 都是多线程的。

然后,spring 不使用 servlet(除了一个 - 调度程序)。它使用 bean,可以是控制器、服务和存储库 (daos)。

如果这些 bean 在其字段中不包含任何数据(除了它们的依赖项),它们是线程安全的(我想你的意思是“多线程”)

简而言之——不要在你的 spring bean 中存储任何数据。将所有必需的数据作为参数传递。

【讨论】:

    【解决方案2】:

    典型的 Java Web 应用程序是多线程的,因为每个请求都在其自己的线程上处理。在此类应用程序中,当您拥有保持状态的对象(例如,通过修改静态属性)时,您必须小心,因为它们可以相互覆盖。

    当您谈论 servlet 时,如果两个请求同时进入同一个 servlet,则相关的 servlet 代码将同时执行两次。在像 Struts 或 Spring 这样将请求委托给对象的框架中,可以重用相同的 bean 实例,或者可以为每个请求创建一个新的 bean 实例,具体取决于您如何配置框架(即在Spring的案例)

    【讨论】:

      【解决方案3】:

      Spring MVC 使用一个 single 调度 servlet,它将调用定义的 Controllers。话虽如此,控制器应该是无状态的,排除了 Spring 注入的 bean。通过一个动作改变一个控制器的状态可以影响另一个动作。

      【讨论】:

        【解决方案4】:

        如果我正确理解您的问题,servlet(或 java bean)本身就不需要担心多线程。要创建多个线程,您可以通过在步骤配置中执行以下操作来实例化多线程步骤或并行步骤:

        多线程步骤:

        <step id="loading"> <tasklet
        task-executor="taskExecutor"
        throttle-limit="20">...</tasklet>
        </step>
        

        平行步:

        <job id="job1">
        <split id="split1" task-executor="taskExecutor" next="step4">
            <flow>
                <step id="step1" parent="s1" next="step2"/>
                <step id="step2" parent="s2"/>
            </flow>
            <flow>
                <step id="step3" parent="s3"/>
            </flow>
        </split>
        <step id="step4" parent="s4"/>
        

        这些例子可以在更深入的here找到和评论。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-08
          • 1970-01-01
          • 2012-10-14
          • 2011-04-19
          • 2015-07-22
          • 2012-02-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多