|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2006-11-28
"Note: JobDetails created via this FactoryBean are not serializable and thus not suitable for persistent job stores. You need to implement your own Quartz Job as a thin wrapper for each case where you want a persistent job to delegate to a specific service method."
M类上有这么一句 但是怎么做这种thin wrapper呢? 引用 现在又出新问题了
Couldn't store job: org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean 用了2种调度方式 一种是SPRING包装的 一种是QUARTZ本身 当持久化QUARTZ的时候 告诉我无法把上面的那个类持久化 怎么办??? 上面这个SPRING的类其实并不需要持久化的! 引用 刚进这家公司
架构 ajax webwork hibernate spring 有个这么样的业务流程 是以前程序员辞职时留下的 有一个表有这么一个字段timeleft 意思就是说这条业务有个时效性 比如说5天失效 需求要求剩下1天的时候提醒一下 现在的系统用了quartz 它的大概意思是 当存入一条新数据的时候在action里创建调度 JobDataMap里存入了这次存入数据的ID 然后每天晚上0点0分去检查 然后给这个id对应的数据行的timeleft字段减1 这样作 如果服务器一直开启 理论上来说应该是没有问题 但是如果服务器长时间开启 Scheduler的数量会变的很大 而且如果服务器当机 我认为这些scheduler 就会消失 那么这些未完成的业务周期的业务就会成为废数据 我的考虑是 大概这样可以实现 就是 每天0点0分的时候去搜一下库 搜出这些未失效在业务周期的业务 然后批量更新他们的timeleft字段 而我对这样的处理 大批量的数据更新 有点信心不足 而且这样作就等于重构了这个业务 公司管理不是很正规,我这样做 怕万一我处理的不好 这个核心业务再出问题 这个黑锅我就背定了 现在我对“调度”有几点疑问 1.每个调度是否是一个线程,对内存消耗有多大? 2.调度是否是在web服务器停止的时候就失效,有没有办法持久化调度? 3.可否实现这样的调度 开始结束时间相差10分钟 我想第8分钟运行一次 第10分钟结束的时候再运行一次? 4.我所说的那种解决方案 如果对大数据量的操作批量更新 会存在什么问题? 公司前程序员代码如下 action...
package com.netinfo.sjsascoa.serviceWindow.action;
import com.opensymphony.xwork.Action;
import com.opensymphony.xwork.ModelDriven;
import com.opensymphony.xwork.ActionContext;
import com.opensymphony.webwork.ServletActionContext;
import com.netinfo.ares.webwork.XmlParameterInterceptor;
import com.netinfo.ares.webwork.XmlSerializer;
import com.netinfo.ares.system.domain.Usr;
import com.netinfo.sjsascoa.serviceWindow.domain.Operationinfo;
import com.netinfo.sjsascoa.serviceWindow.bo.IServiceWindowBO;
import com.netinfo.sjsascoa.serviceWindow.bo.SetLeftTimeBO;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import javax.servlet.http.HttpSession;
import java.io.Writer;
import java.util.Date;
/**
* Created by IntelliJ IDEA.
* User: ltp
* Date: 2006-8-10
* Time: 10:08:37
* To change this template use File | Settings | File Templates.
*/
public class SaveOperationInfoAction implements Action, ModelDriven {
Log log = LogFactory.getLog(getClass());
Operationinfo info = new Operationinfo();
IServiceWindowBO serviceWindowBO;
public String execute() throws Exception {
Writer writer = (Writer) ActionContext.getContext().get(XmlParameterInterceptor.WRITER);
String output;
HttpSession sess = ServletActionContext.getRequest().getSession();
Usr usr = (Usr) sess.getAttribute("usr");
String name = usr.getName();
String ou = usr.getDepartment();
info.setEditperson(name);
info.setDept(ou);
try {
serviceWindowBO.saveOperationInfo(info); /*进行收文登记的保存操作*/
startClock(info.getId());
output = XmlSerializer.serialize("登记信息保存成功");
} catch (Exception e) {
output = XmlSerializer.serialize(e);
}
writer.write(output);
writer.close();
return Action.NONE;
}
private void startClock(String operationinfoid) throws Exception
{
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
Date runTime = TriggerUtils.getNextGivenMinuteDate(new Date(), 1);
JobDetail job = new JobDetail(operationinfoid, null, SetLeftTimeBO.class);
job.getJobDataMap().put("operationinfoid", operationinfoid);
Trigger trigger = TriggerUtils.makeDailyTrigger(0,0);
//Trigger trigger = TriggerUtils.makeMinutelyTrigger();
trigger.setName(operationinfoid);
sched.scheduleJob(job, trigger);
log.info("项目: "+operationinfoid+" 已经启动计时");
sched.start();
}
public Object getModel() {
return info;
}
public void setServiceWindowBO(IServiceWindowBO serviceWindowBO) {
this.serviceWindowBO = serviceWindowBO;
}
}
BO..
package com.netinfo.sjsascoa.serviceWindow.bo;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobDataMap;
import com.netinfo.ares.hibernate.ICommonDAO;
import com.netinfo.ares.spring.BeanFactory;
import com.netinfo.ares.system.domain.Usr;
import com.netinfo.sjsascoa.serviceWindow.domain.Operationinfo;
import java.util.Collection;
/**
* Created by IntelliJ IDEA.
* User: ltp
* Date: 2006-9-5
* Time: 9:46:24
* To change this template use File | Settings | File Templates.
*/
public class SetLeftTimeBO implements ISetLeftTimeBO, Job { /*每天对办理剩余时间进行改变*/
public void execute(JobExecutionContext context) throws JobExecutionException
{
try {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String operationinfoid = dataMap.getString("operationinfoid");
operationinfoid = operationinfoid.substring(0,operationinfoid.length()-2);
String hql = "from Operationinfo as info where info.id = '"+operationinfoid+"'";
ICommonDAO dao = (ICommonDAO) BeanFactory.getBean("commonDAO");
Collection col = dao.query(hql);
Operationinfo info = (Operationinfo)col.iterator().next();
info.setTimeleft(String.valueOf(Integer.parseInt(info.getTimeleft())-1).indexOf("-")==-1?String.valueOf(Integer.parseInt(info.getTimeleft())-1):"已超时"+String.valueOf(Integer.parseInt(info.getTimeleft())-1).replace("-","")+"天");
dao.saveOrUpdate(info);
} catch (Exception e) {
e.printStackTrace();
}
}
}
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2006-11-28
各位谢谢了 原来就是知道有调度这回事 今天用到这个了 下午刚刚查的资料 有什么理解错的 请指出来 如果您有什么好的解决方案,请详细说明,谢谢~
|
|
| 返回顶楼 | |
|
时间:2006-11-28
1.使用定时运行 每次运行都是一个线程
2.做一个.sh 读取那个xml文件就独立于web外面 3.不太明白你的说法 总之quartz有两种调用方式 定时运行 循环运行 定时运行不会管前一次运行是否结束 到时间就会new一个线程 循环运行 在前一个没结束的情况下 是不会再次启动的 4.除了内存溢出好像想不到其他的什么 |
|
| 返回顶楼 | |
|
时间:2006-11-28
ddandyy 写道 2.做一个.sh 读取那个xml文件就独立于web外面 能不能细说一下 |
|
| 返回顶楼 | |
|
时间:2006-11-29
大哥,QUARTZ JOBS 信息可以存到数据库里面的啊,服务器重启什么的,数据都在DB里面,不要用IN-MEMORY STORAGE.
|
|
| 返回顶楼 | |
|
时间:2006-11-29
lordhong 写道 大哥,QUARTZ JOBS 信息可以存到数据库里面的啊,服务器重启什么的,数据都在DB里面,不要用IN-MEMORY STORAGE.
可以存入数据库的吗?? 怎么做的咧??? 能这样做最好了 |
|
| 返回顶楼 | |
|
时间:2006-11-29
看看quartz.properties里面的内容就知道了
|
|
| 返回顶楼 | |
|
时间:2006-11-29
bluedev 写道 看看quartz.properties里面的内容就知道了
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore .JobStoreTX 这一句就可以了?? 数据库需要做怎么样的支持? |
|
| 返回顶楼 | |
|
时间:2006-11-29
huangpengxiao 写道 bluedev 写道 看看quartz.properties里面的内容就知道了
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore .JobStoreTX 这一句就可以了?? 数据库需要做怎么样的支持? 看到了 在官网看到教程了谢谢大家 我去写个DEMO 试试先 |
|
| 返回顶楼 | |
|
时间:2006-11-29
quartz自带2,30个不同数据库的生成SQL。。。基本上支持所有数据库。。。
|
|
| 返回顶楼 | |








