如何使用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">