如何使用spring任务执行器生成任务,以便不会引发内存不足异常。
当前任务池配置:

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
  <property name="corePoolSize" value="56" />
  <property name="maxPoolSize" value="112" />
  <property name="queueCapacity" value="100" />
</bean>
<bean id="threadExecutor" class="com.content.ThreadHandler.ThreadExecutor">
  <constructor-arg ref="taskExecutor" />
</bean>
</beans>

我在请求处理程序中使用bean,使用loadbean作为:
ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"ThreadPoolConfig.xml"});
            BeanFactory factory=context;

            ThreadExecutor myBean=(ThreadExecutor)factory.getBean("threadExecutor");

然后我使用taskexecutor作为mybean.execute(task);
此配置是否为每个请求创建新池?

最佳答案

建议1
您不应该为每个请求实例化spring应用程序上下文。您应该有一个名为spring context的单例类或类似的类,它应该只实例化一次spring应用程序上下文。所以你的客户代码应该是

ThreadExecutor myBean=(ThreadExecutor)SpringContext.getInstance().getBean("threadExecutor");

如前所述,springcontext应该只是一个普通的单例类;在初始化方法中,您将实例化spring applicationcontext。
public class SpringContext {

   public ClassPathXmlApplicationContext context;

   private static SpringContext _instance = new SpringContext();

   private SpringContext() {
      context = new ClassPathXmlApplicationContext(new String[]{"ThreadPoolConfig.xml"});
   }

   public static SpringContext getInstance() {
      return _instance;
   }


   public Object getBean(String bean) {
      Object beanObj = (context != null) ? context.getBean(bean) : null;
      return beanObj;
   }

}

建议2
如果这不起作用,那么您应该检查以下内容:
spring bean元素有一个scope属性。可以指定的两个值是request和session,分别对应于httprequest和httpsession。试着在你的案例中使用其中一个。
http://static.springsource.org/spring/docs/3.0.x/reference/beans.html#beans-factory-scopes
所以你的bean定义应该像
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" scope="session">

07-24 09:46
查看更多