早上测试程序的时候,发现项目下的定时任务quartz同一时刻有一个任务执行了两次,但是我清楚地记得原来是没有问题,很是懊恼。
第一步
检查配置文件,文件内有配置concurrent为false,理论上来讲应该可以防止job同时执行两次的问题。
[html]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 要调用的工作类 -->
<bean id="xmlJob" class="com.all58.video.quartz.XmlJob"></bean>
<!-- 可继续加新的任务 -->
<!-- 要调用的工作类结束 -->
<bean id="xmlJobTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean="xmlJob"/>
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod">
<value>work</value>
</property>
<span style="color:#ff0000"><property name="concurrent">
<value>false</value>
</property></span>
</bean>
<!-- 定义调用对象和调用对象的方法 -->
<bean id="xmlJobTaskDoTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="xmlJobTask"/>
</property>
<property name="cronExpression">
<value>0 0/2 * ? * *</value>
</property>
</bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序,不需要实例化对象 -->
<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="xmlJobTaskDoTime"/>
</list>
</property>
</bean>
</beans>
第二步
既然不是quartz配置的问题,那就往上一层代码找找看吧,忽然发现SSH项目中出现了ApplicationContext被连续两次注入的问题,但是我只是在web.xml进行了一次引用配置,不应该调用两次才对...
[html]
<!-- Spring ApplicationContext配置文件的路径,可使用通配符,多个路径用,号分隔此参数用于后面的Spring Context Loader -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
在applicationContext.xml中
[html]
<bean id="appContext" class="com.all58.video.util.AppContext" />
第三步
虽然不知道什么造成多次注入的问题,但总归知道是什么造成的了,从网上查一下吧 applicationContext.xml多次注入,从网上得来原因,一般的说法是:
在web.xml进行配置applicationConetxt.xml的引用会似使得注入一次,同时spring自己进行加载该文件会使得注入一次。因此造成了两次注入;
既然如此,那我就把quartz的配置提取出来不就可以了,然后我就把quartz的配置写入到了job.xml中,然后更改web.xml文件如下 :
[html]
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml,<span style="font-family:Tahoma">classpath:job.xml</span></param-value>
</context-param>
理论上来讲应该没问题了吧,但是还是不可以,applicationContext加载两次可以说得过去,但是定时任务还是被同时执行了两次,因此我得出了结果,不是applicationContext.xml被加载了两次,而是web.xml被加载了两次,从而造成了以上的结果。
那我就去查,什么情况下会出现web.xml被多次加载?
原来是TOMCAT的配置文件server.xml配置不当引起的
请看下面这段配置就是错误的:
[html]
<Host name="localhost" <span style="color:#ff0000"> appBase="webapps"</span>
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<span style="color:#3333ff"> <Context path="" docBase="D:\apache-tomcat-6.0.14\webapps\Server" debug="0" reloadable="true"/></span>
tomcat的默认加载工程目录为tomcat\webapps\....,这就会造成加载一次Server项目下的web.xml 第一次注入
由于本地中的工程有很多,所以为了方便配置了默认启动项目,添加了上面蓝色的配置,造成了第二次注入
解决办法:
1.更改server.xml中appBase=""。再次启动项目,一切正常。
2.删除蓝色配置,将项目放到tomcat\webapps\ROOT中,以此来达到默认启动的效果。
暂时只发现这两种解决办法,如果大家还有什么其他的解决办法,欢迎留言
分享到:
相关推荐
### Web.xml 文件详解 #### 一、概述 `web.xml`是Java Web应用程序中的核心配置文件,用于描述项目的整体架构及各个组件之间的关系。对于初学者来说,掌握`web.xml`的基本结构及其内部元素是非常重要的。 #### 二...
如果在`web.xml`配置文件中,Servlet被标记为`load-on-startup`,那么它会在容器启动时自动加载。否则,将在第一次请求时加载。 2. **初始化**: 在Servlet实例创建后,容器会调用`init()`方法。这是Servlet准备...
负整数表示在需要时才加载,没有设置或值为负数时,容器会在Servlet第一次被请求时才初始化。值相等的Servlet加载顺序由容器决定。 在Web.xml文件中,配置元素的物理顺序并不影响加载顺序,例如,监听器(Listener...
如果你想采用jdom converter,你必须很清楚地知道jdom converter是否可以被加载.这就是DWR保留上面的提示信息的原因. 3 The Creators DWR共有三种Creator,最简单的”new”是调用bean的默认构造函数创建实例.”...
描述中提到了“urlrewritefilter-4.0.3.jar”,这是UrlRewriteFilter的特定版本,4.0.3是其发行的版本号,表明这是一个稳定且经过多次改进的软件。在Java Web应用中,我们需要将这个JAR文件添加到项目的类路径...
DOM一次性加载整个XML文档,适合小文件;SAX事件驱动,逐行读取,节省内存;StAX允许向前导航,更灵活。 2. **创建Bean**:根据XML节点创建对应的Bean实例。可以通过JAXB(Java Architecture for XML Binding)自动...
此方法在应用程序启动时被调用一次,是一个合适的时机来加载需要在应用程序级别共享的数据。 ```csharp protected void Application_Start(object sender, EventArgs e) { // 假设从数据库或其他来源加载数据 ...
DOM解析方式一次性加载整个XML文档到内存中,形成一个树形结构,方便查找和操作;而SAX则是一种事件驱动的解析方式,逐行读取XML,只在遇到特定元素时触发回调函数,内存占用较小。 在Android中,若要将XML数据展示...
Context元素负责管理Web应用的生命周期,包括加载、启动、停止和卸载。 在server.xml文件中,我们还会看到一些其他的配置项,比如: - Logger:用于记录日志信息。 - Realm:用于定义安全领域,可以配置用户、角色...
例如,在`standalone.xml`或`domain.xml`中,可以通过开启`<deployments-scanner>`元素来设置扫描周期,指定多久检查一次部署的变更。 5. **开发工具集成**:现代的IDE如Eclipse或IntelliJ IDEA提供了与JBoss AS 7...
SAX(Simple API for XML)则是一种基于事件驱动的解析方式,它不需要一次性加载整个XML文档,而是逐行读取,因此适合处理大型XML文件。在SAX2中,我们创建一个实现了`org.xml.sax.ContentHandler`接口的类,然后在...
11. **DOM(文档对象模型)和SAX(简单API for XML)解析器**:解析XML文档的两种主要方式,DOM一次性加载整个文档到内存,而SAX是事件驱动的逐行解析。 通过《 Beginning XML 4th Edition》,读者不仅能掌握XML的...
DOM解析器一次性加载整个XML文档到内存,因此适用于小型文件,对于大型文件可能会消耗大量资源。 2. SAX解析: SAX(Simple API for XML)是一种事件驱动的解析方式,它不将整个XML文档加载到内存,而是逐行读取,...
3. **数据绑定支持**:控件集支持与各种数据源(如数据库、XML或Web服务)的直接绑定,简化了数据展示和交互的过程。数据绑定机制允许动态加载和更新数据,提高了应用程序的性能。 4. **AJAX增强**:ComponentArt ...
XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,它以其结构化、自描述性和可扩展性而被广泛应用于Web服务、配置文件、数据交换等多个领域。在编程中,处理XML文件是常见的任务,包括读取XML...
3. **性能优化**:ComponentArt Web.UI注重性能优化,其控件设计得轻量级且高效,能够处理大量数据而不会影响页面加载速度。 4. **国际化支持**:支持多语言环境,可以轻松地为不同地区的用户提供本地化界面。 5. ...
DOM一次性加载整个XML文档到内存中,适合小型文件;SAX是事件驱动的,只读且逐行处理,适用于大型文件;JAXB则用于对象和XML之间的自动转换,简化了数据绑定。 在描述中提到的"动态网站的一部分"可能涉及到使用Java...
2.3.1 加载和实例化 ................................................................................................................................16 2.3.2 初始化 ........................................
- Web开发:如AJAX(异步JavaScript和XML)技术,虽然现在更多使用JSON,但XML曾是主要的数据交换格式。 总结起来,"第7次XML"的学习内容广泛,涉及XML的基本概念、语法、解析方法及其在各种场景下的应用。深入...