Spring 管理定时任务时,服务器不起作用,解决方法。

最近做了一个定时发邮件的功能,之间遇到了几个问题,经过努力总算解决了!现在和大家分享一下!
我用的到环境是 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)

现在可以用了。具体一些细节可以给我回帖!希望大家热烈讨论!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值