JavaWEB springmvc 使用定时任务
2015-12-07 18:23
477 查看
1.配置web.xml
在web.xml配置使用springmvc框架,其他配置略。
2.配置springmvc-context.xml
根据web.xml里面的指定配置springmvc 核心代码在第18-19行和第85-92行进行配置。
3.使用注解方式
这样就可以了,就会每5秒进行一次任务。一般做一些定时通知,定时备份,定时清理等任务。
4.出现问题及解决
这样配置完成后,发现启动服务后,这个testTask任务,都是执行两次的。查看tomcat打印的日志,发现定时任务的启动两次的,或者说整个web服务是启动两次的。以前没有这个定时任务,由于启动时日志太多,也没有报错,所以一直没有太注意。web容器启动了两次服务,就产生了两个定时器实例。经上网查询,是有两种可能,一个是spring配置出错,一个是tomcat配置出错。关于配置出错,请参看这篇文章: /article/2129068.html 。
我是tomcat配置出错。具体出现问题如下:
默认tomcat配置文件conf/server.xml 里面Host段是这个样子的
我们把在eclipse下的项目部署到webapps文件目录下后,启动服务后,在浏览器中访问的地址是 Http://127.0.0.1:8080/<项目名称>/ 这样子进行访问。当我们不要项目名称作为访问路径,想通过ip、端口直接进行访问时,配置如下:
增加context段,进行配置。就这样一直无事,直到最近增加定时任务功能,才发现原来这样配置会出现项目启动两次的情况。也是导致定时任务被调用两次的原因。我的解决办法是 配置如下:
就这样解决问题。 还有Context段,tomcat 6.0 和 tomcat 7.0及以上的配置有点区别
本文地址: /article/6193167.html
在web.xml配置使用springmvc框架,其他配置略。
<display-name>xxx.com</display-name> <!-- 配置Spring MVC DispatcherServlet --> <servlet> <servlet-name>MVC DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 初始化参数 --> <init-param> <!-- 加载SpringMVC的xml到 spring的上下文容器中 --> <param-name>contextConfigLocation</param-name> <!-- 下面这个参数是指定springmvc的配置文件所在 --> <param-value>classpath:com/jieli/config/springmvc-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- 配置DispatcherServlet所需要拦截的 url --> <servlet-mapping> <servlet-name>MVC DispatcherServlet</servlet-name> <!-- <url-pattern>/</url-pattern> 这样配置的话,所有页面都会进入拦截器 这个在springmvc 的配置文件里还有对其进行再次配置--> <url-pattern>/</url-pattern> </servlet-mapping>
2.配置springmvc-context.xml
根据web.xml里面的指定配置springmvc 核心代码在第18-19行和第85-92行进行配置。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd" > <!-- ==============基础配置 开始============= --> <!-- 开启controller注解支持 --> <!-- use-default-filters="false" 只扫描指定的注解 --> <context:component-scan base-package="com.jieli.controller" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <!-- 视图解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="contentType" value="text/html"/> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 如果当前请求为"/"时,则转发到"index" --> <mvc:view-controller path="/" view-name="forward:index"/> <!-- 默认的注解映射的支持 --> <mvc:annotation-driven /> <!-- 静态资源映射 不经过controller--> <mvc:resources mapping="/js/**" location="/WEB-INF/js/" /> <mvc:resources mapping="/css/**" location="/WEB-INF/css/" /> <mvc:resources mapping="/fonts/**" location="/WEB-INF/fonts/" /> <mvc:resources mapping="/plugins/**" location="/WEB-INF/plugins/" /> <mvc:resources mapping="/images/**" location="/WEB-INF/images/" /> <mvc:resources mapping="/html/**" location="/WEB-INF/html/" /> <mvc:resources mapping="/jsp/**" location="/WEB-INF/jsp/" /> <!-- 当上面要访问的静态资源不包括在上面的配置中时,则根据此配置来访问 --> <mvc:default-servlet-handler/> <!-- 自定义拦截器 准备用于权限管理 --> <!-- <mvc:interceptors> --> <!-- 如果不定义 mvc:mapping path 将拦截所有的URL请求 --> <!-- <bean class="com.demo.web.auth.AuthInterceptor"></bean> --> <!-- <mvc:interceptor> --> <!-- <mvc:mapping path="/secure/*"/> --> <!-- <bean class="*****.***Interceptor"></bean> --> <!-- </mvc:interceptor> --> <!-- </mvc:interceptors> --> <!-- ==============基础配置 结束============= --> <!-- =========下面的配置是一些插件化配置====== --> <!-- 支持上传文件 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置上传文件的最大尺寸为1MB --> <property name="maxUploadSize"> <value>2048576</value> </property> <property name="defaultEncoding"> <value>UTF-8</value> </property> </bean> <!-- 权限控制, 作用是让所有的请求动通过拦截器 --> <mvc:interceptors> <!-- 如果不定义 mvc:mapping path 将拦截所有的URL请求 --> <bean class="com.jieli.interceptor.AuthInterceptor"></bean> </mvc:interceptors> <!-- 增加定时任务插件 --> <context:annotation-config></context:annotation-config> <!-- spring 扫描注解配置 --> <context:component-scan base-package="com.jieli.plugins.timetask"> </context:component-scan> <!-- 开启这个配置 spring才能识别@Scheduled注解 --> <task:annotation-driven scheduler="qbScheduler" mode="proxy"/> <task:scheduler id="qbScheduler" pool-size="10"/> <!-- 增加邮件 --> </beans>
3.使用注解方式
package com.jieli.plugins.timetask; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component("taskJob") public class TestEverySecond { @Scheduled(cron = "1/5 * * * * ?") public void testTask(){ System.out.println(System.currentTimeMillis()); } }
这样就可以了,就会每5秒进行一次任务。一般做一些定时通知,定时备份,定时清理等任务。
4.出现问题及解决
这样配置完成后,发现启动服务后,这个testTask任务,都是执行两次的。查看tomcat打印的日志,发现定时任务的启动两次的,或者说整个web服务是启动两次的。以前没有这个定时任务,由于启动时日志太多,也没有报错,所以一直没有太注意。web容器启动了两次服务,就产生了两个定时器实例。经上网查询,是有两种可能,一个是spring配置出错,一个是tomcat配置出错。关于配置出错,请参看这篇文章: /article/2129068.html 。
我是tomcat配置出错。具体出现问题如下:
默认tomcat配置文件conf/server.xml 里面Host段是这个样子的
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Host>
我们把在eclipse下的项目部署到webapps文件目录下后,启动服务后,在浏览器中访问的地址是 Http://127.0.0.1:8080/<项目名称>/ 这样子进行访问。当我们不要项目名称作为访问路径,想通过ip、端口直接进行访问时,配置如下:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="/JieLiERP" debug="0" reloadable="true" /> </Host>
增加context段,进行配置。就这样一直无事,直到最近增加定时任务功能,才发现原来这样配置会出现项目启动两次的情况。也是导致定时任务被调用两次的原因。我的解决办法是 配置如下:
<Host name="localhost" appBase="" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="/webapps/JieLiERP" debug="0" reloadable="true" /> </Host>
就这样解决问题。 还有Context段,tomcat 6.0 和 tomcat 7.0及以上的配置有点区别
<!-- tomcat 6.0 --> <Context path="" docBase="/webapps/JieLiERP" debug="0" reloadable="true" /> <!-- tomcat 7.0及以上 --> <Context path="/" docBase="webapps/JieLiERP" debug="0" reloadable="true" />
本文地址: /article/6193167.html
相关文章推荐
- 谈谈Java的集合组件
- OA高危漏洞的修复过程 推荐
- Maven搭建ssh环境(myeclipse2014) - pom.xml中dependencies+plugins
- java垃圾回收机制
- Spring实现AOP的4种方式
- MyEclipse做Maven
- Java类的实例化的初始化过程
- 基于Maven项目,搭建Spring+SpringMVC+MyBatis的WEB项目(待更新)
- 深度解析Java中volatile的内存语义实现以及运用场景
- SpringMVC 处理异常的4种方式
- 详解Java线程编程中的volatile关键字的作用
- java日期操作
- Java内功提升之多态
- Spring整合Ehcache缓存
- 基于注解的SpringMVC
- netbeans 8.0.2 卡在 refresh indices 或者 background scanning of projects
- java面向对象主要有四大特性
- 用Eclipse搭建Hadoop2.7.1开发环境
- Java中获取文件大小的正确方法
- 【Java基础】深入Java内存区域