最近做了一个定时发邮件的功能,之间遇到了几个问题,经过努力总算解决了!现在和大家分享一下!
我用的到环境是 Linux+Struts2+Spring+Hibernate+Tomcat6.0+ MySQL。
采用了 DBCP 连接池,用Spring 管理Hibernate的配置方案。
定时功能配置:
<bean id="someData" class="com.xxxx.web.utils.JobData">
</bean>
<bean id="someJob" class="com.xxxx.web.utils.EmailReportJob">
<property name="jobData" ref="someData"></property>
<property name="songService" ref="songService"></property>
<property name="customerService" ref="customerService"></property>
</bean>
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="someJob"></property>
<property name="targetMethod" value="execute"></property>
</bean>
<bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail"></property>
<property name="cronExpression" value="0 0 8 * * ?"/>
</bean>
<bean id="scheduledFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerBean"/>
</list>
</property>
<property name="autoStartup" value="true"/>
</bean>
这样配置完就可以了! 注意
<property name="cronExpression" value="0 0 8 * * ?"/> 时间的设置格式。
配置完之后 我就部署到Linux 环境下了!结果可以发邮件。我想终于做完了!令我没有想到的是 第二天 8点 居然不起作用。后台还报了很多错误。
错误信息:
java.io.EOFException
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1963)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2375)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2874)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3243)
at com.mysql.jdbc.Connection.setAutoCommit(Connection.java:5371)
at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:331)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:317)
我一看 原来是MySQL 里的timeout 超时了!看看了MySQL 的配置文件 默认的是8个小时。 我的要个24个小时才执行一次。看了看DBCP的配置原来忘了配置 这些属性,真是失败啊!
补上了配置之后:
jdbc.connection.driver_class=com.mysql.jdbc.Driver
jdbc.connection.url=jdbc:mysql://127.0.0.1:3306/xxxx?autoReconnect=true&autoReconnectForPools=true&useUnicode=true&characterEncoding=gbk
jdbc.username=root
jdbc.password=0
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
validationQuery=select 1
#dbcp.validationQueryTimeout=1
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=20
hibernate.dialect=org.hibernate.dialect.MySQLDialect
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>${jdbc.connection.driver_class}</value>
</property>
<property name="url">
<value>${jdbc.connection.url}</value>
</property>
<property name="username">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
<property name="testWhileIdle">
<value>${testWhileIdle}</value>
</property>
<!-- 打开检查,用异步线程evict进行检查 -->
<property name="testOnBorrow">
<value>${testOnBorrow}</value>
</property>
<property name="testOnReturn">
<value>${testOnReturn}</value>
</property>
<property name="validationQuery">
<value>${validationQuery}</value>
</property>
<property name="timeBetweenEvictionRunsMillis">
<value>${timeBetweenEvictionRunsMillis}</value>
</property>
<property name="numTestsPerEvictionRun">
<value>${numTestsPerEvictionRun}</value>
</property>
</bean>
这样配置完就可以了!注意一个问题 就是
<property name="validationQuery"><value>select 1</value></property> 里面的value 值会随着数据库的不同而不同,具体是什么如下:
DBCP:
对属性 validationQuery 设置一个简单的SQL语句就行了,例如:select 1 (mysql 和 sql server 适用)、SELECT COUNT(*) FROM DUAL(oracle)
现在可以用了。具体一些细节可以给我回帖!希望大家热烈讨论!
分享到:
相关推荐
然而,当多个服务器实例并行运行时,如果不采取适当的策略,同一定时任务可能会在每个服务器上都执行,导致数据不一致和资源浪费。 解决这个问题的关键在于实现任务的分布式协调,确保只有一个服务器实例执行特定的...
在Spring框架中,定时任务是实现自动化操作的重要手段,它允许开发者在特定时间点执行特定的任务,例如数据清理、报表生成等。本篇文章将详细探讨Spring中的定时...希望这些知识对您在实现Spring定时任务时有所帮助。
总结起来,通过Spring 3.0的定时任务机制,我们可以轻松地在Web环境中创建和管理周期性任务。结合`@Scheduled`注解、`TaskScheduler`配置以及Web应用的部署策略,可以构建出稳定、可扩展的定时任务解决方案。在实际...
在Java开发中,定时任务是不可或缺的一部分,尤其在企业级应用中,用于执行定期的数据处理、报表生成、系统维护等工作。Spring框架与Quartz库的整合提供了强大的动态管理定时任务的能力。下面我们将深入探讨这个主题...
可以通过quartz和spring的简单配置即可完成,但如果要改变任务的执行时间、频率,废弃任务等就需要改变配置甚至代码需要重启服务器,这里介绍一下如何通过quartz与spring的组合实现动态的改变定时任务的状态的一个...
4. **部署与测试**:项目部署在Tomcat服务器上,当服务器启动时,Quartz会自动加载数据库中的定时任务。通过监控日志或者定制的监控界面,可以观察到定时任务的执行情况,验证其是否按照预期工作。 5. **Spring的...
一个tomcat下部署了两个应用,一个是普通web应用syncc,另一个应用syncc_wx属于微信公众号后台程序涉及消息定时推送,tomcat未分离...”spring定时任务执行两次的异常排查处理.docx"针对上述描述问题进行分析和解决。
当应用部署在多台服务器上时,可能需要考虑分布式定时任务的解决方案,如使用Quartz或XXL-Job,它们支持集群和任务分配。 10. **测试定时任务** 可以在测试类中使用`@TestPropertySource`来模拟不同的时间环境,...
总的来说,Spring的邮件服务和定时任务为开发者提供了强大的工具,能够方便地进行邮件通信和自动化任务的管理。理解并熟练运用这两个功能,可以提升你的应用程序的交互性和自动化程度。在实际开发中,可以根据项目...
Spring + quartz 定时任务修改定时时间不重启服务
通过以上介绍,我们可以看出Spring Quartz是一个功能强大且灵活的任务调度解决方案,适用于各种需要定时任务的应用场景。结合Spring的特性,可以让开发人员更高效地管理和执行定时任务,提高软件的自动化水平。
6. **启动Scheduler**:在Spring应用启动时,通过调用Scheduler的`start()`方法来启动定时任务调度。 7. **动态管理任务**:通过Spring的`Scheduler`实例,你可以方便地进行任务的添加、删除、暂停和恢复等操作,...
关于 Spring Boot 定时任务接收邮件并且存储附件的方法讲解 Spring Boot 是一个基于 Java 的框架,它提供了许多实用的功能,包括定时任务。在 Spring Boot 中实现定时任务非常简单,只需要使用两个注解:`@...
在"Spring2.5+Quartz定时任务简单例子web工程"中,我们可以看到这两个框架的结合使用,主要目标是实现基于 Web 应用的定时任务管理。以下将详细介绍这个项目中可能涉及的知识点: 1. **Spring 2.5**: - **依赖...
后者是Spring Boot官方推荐的定时任务解决方案。 5. **生成项目结构**:确认无误后,点击“Finish”(完成),IntelliJ IDEA会自动生成项目的结构,包括pom.xml、src/main/java等文件夹。 ### 定时任务配置 1. **...
本项目就是基于Spring MVC、Mybatis、Quartz和Swagger实现的一个定时任务管理系统,旨在提供一种灵活且可配置的方式来管理和控制定时任务。下面将详细讲解这个系统的核心组成部分及其工作原理。 首先,Spring MVC是...
通过本文的学习,您已经掌握了如何在Spring Boot应用中使用`@Scheduled`注解来创建和管理定时任务。`@Scheduled`注解不仅简化了定时任务的配置过程,而且还提供了丰富的参数选项,使得开发者能够根据具体的业务需求...
Spring通过`@Scheduled`注解提供了一种声明式的方式来创建定时任务,开发者可以在方法上添加此注解,设置定时规则,如cron表达式,来定义任务的执行时间。Spring容器会自动管理这些任务,确保它们在合适的时间被调用...
总的来说,Spring Schedule提供了一种优雅的方式来进行定时任务管理,使得开发者能够专注于业务逻辑,而不是底层的调度实现。通过理解并熟练运用这些知识点,可以有效地提高开发效率和系统稳定性。在实际项目中,...
在定时任务方面,Spring提供了一个名为`Task Execution and Scheduling`的模块,可以方便地创建和管理定时任务。 `MySQL`是广泛使用的开源关系型数据库管理系统,适合处理大量数据并支持高并发访问。在定时任务中,...