日期:2014-05-16  浏览次数:20619 次

Quartz JDBCStore 和MethodInvokingJobDetailFactoryBean冲突的问题
"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