小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

quartz持久化實現(xiàn)

 昵稱22833412 2016-01-06

一、官網(wǎng)下載壓縮包

http://www./downloads/destination?name=quartz-2.2.2-distribution.tar.gz&bucket=tcdistributions&file=quartz-2.2.2-distribution.tar.gz

 

在上面文件夾下執(zhí)行對應的數(shù)據(jù)庫sql文件

得到11個數(shù)據(jù)庫表:

二、新建Maven工程

1、在POM里加入如下依賴:

<!-- quartz start -->

      <dependency>

         <groupId>org.quartz-scheduler</groupId>

         <artifactId>quartz</artifactId>

         <version>2.2.1</version>

         <exclusions>

            <exclusion>

                <groupId>c3p0</groupId>

                <artifactId>c3p0</artifactId>

            </exclusion>

            <exclusion>

                <groupId>org.slf4j</groupId>

                <artifactId>slf4j-api</artifactId>

            </exclusion>

         </exclusions>

         <optional>true</optional>

      </dependency>

      <dependency>

         <groupId>c3p0</groupId>

         <artifactId>c3p0</artifactId>

         <version>0.9.1.2</version>

      </dependency>

  <!-- quartz end -->

<!-- slf4j -->

      <dependency>

         <groupId>org.slf4j</groupId>

         <artifactId>slf4j-api</artifactId>

         <version>1.7.5</version>

    </dependency>

 

2、加入quartz.properties文件:

 

quartz.propertie中內(nèi)容如下:

  #============================================================================

# Configure Main Scheduler Properties  DefaultQuartzScheduler

#============================================================================

org.quartz.scheduler.instanceName = DefaultQuartzScheduler

org.quartz.scheduler.rmi.export = false

org.quartz.scheduler.rmi.proxy = false

org.quartz.scheduler.wrapJobExecutionInUserTransaction = false

#============================================================================

# Configure ThreadPool 

#============================================================================

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

org.quartz.threadPool.threadCount = 10

org.quartz.threadPool.threadPriority = 5

org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

 

org.quartz.jobStore.misfireThreshold = 60000

 

#============================================================================

# Configure JobStore 

#============================================================================

 

#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.HSQLDBDelegate

#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.MSSQLDelegate

org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate

org.quartz.jobStore.useProperties = true

org.quartz.jobStore.tablePrefix = QRTZ_ 

org.quartz.jobStore.isClustered = false

org.quartz.jobStore.dataSource = myDS

org.quartz.jobStore.maxMisfiresToHandleAtATime=1

#============================================================================

# Configure Datasources 

#============================================================================

org.quartz.dataSource.myDS.dialect:org.hibernate.dialect.MySQLDialect

org.quartz.dataSource.myDS.driver=com.mysql.jdbc.Driver

org.quartz.dataSource.myDS.URL=jdbc:mysql://localhost:3306/prisys?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

org.quartz.dataSource.myDS.user=root

org.quartz.dataSource.myDS.password=root

org.quartz.dataSource.myDS.maxConnections=5

org.quartz.dataSource.myDS.validationQuery=SELECT 1

 

3、執(zhí)行指定的bean和方法

   /**

 *  根據(jù)bean和方法執(zhí)行定時任務

 * 執(zhí)行job

 */

@SuppressWarnings("all")

public class SpringJobModel implements Job {

 

 

    public static String SRPTING_BEAN_NAME = "beanName";

 

    public static String SRPTING_METHOD_NAME = "methodName";

 

    /*

     * (non-Javadoc)

     *

     * @see org.quartz.Job#execute(org.quartz.JobExecutionContext)

     */

    public void execute(JobExecutionContext context)

           throws JobExecutionException {

       JobDataMap data = context.getJobDetail().getJobDataMap();

    System.out.println("bean:"+data.getString(SRPTING_BEAN_NAME)+"------------method:"+data.getString(SRPTING_METHOD_NAME));

       try {

           invokeMethod(data.getString(SRPTING_BEAN_NAME),data.getString(SRPTING_METHOD_NAME), null);

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

 

    public void invokeMethod(String owner, String methodName, Object[] args)

           throws Exception {

        System.out.println("ContextLoader.getCurrentWebApplicationContext()-----------"+ContextLoader.getCurrentWebApplicationContext());

       Object ownerClass = ContextLoader.getCurrentWebApplicationContext().getBean(owner);

 

       Method method = ownerClass.getClass().getMethod(methodName, null);

       method.invoke(ownerClass, args);

    }

}

 

4、將定時任務寫入數(shù)據(jù)庫

 

A、執(zhí)行service

   @Service("schedulerService")

public class SchedulerServiceImpl implements SchedulerService {

 

   

//  //調(diào)度器,任務調(diào)度的主API

//  @Autowired

    private Scheduler scheduler;

    @Resource

    private SysJobDao sysJobDao;

   

   

    @PostConstruct

    public void init() {

       try {

           scheduler = StdSchedulerFactory.getDefaultScheduler();

           scheduler.startDelayed(60);

//         SchedulerFactory sf = new StdSchedulerFactory();

//         scheduler =sf.getScheduler();

           System.out.println("任務調(diào)度啟動,延時1分鐘后開始執(zhí)行!");

       } catch (Exception e) {

           // TODO 自動生成 catch

           e.printStackTrace();

       }

 

    }

    //一個具體任務的設置,指定了要執(zhí)行的任務和執(zhí)行任務 的時間策略(用于定義任務的實例)

//  @Autowired

    private JobDetail jobDetail;

    private Trigger trigger;// 容器中任務調(diào)度器

 

  

   /**

     * 運行

     */

    @ServiceLog("運行定時任務")

    public void createRunJobByJobId(Long id) {

       try {

           SysJob sysJob=sysJobDao.selectByPrimaryKey(id);

           String name=sysJob.getJobName();

           boolean flag=true;

           if(name==null||sysJob.equals("")){

              flag=false;

           }else{

              flag=scheduler.checkExists(new JobKey(name, sysJob.getId()+""));

           }

           //不存在則執(zhí)行

           if(!flag){

              name=UUID.randomUUID().toString();

              sysJob.setJobName(name);

              jobDetail =newJob(SpringJobModel.class).withIdentity(name, sysJob.getId()+"").build();

              jobDetail.getJobDataMap().put(SpringJobModel.SRPTING_BEAN_NAME, sysJob.getBeanName());

              jobDetail.getJobDataMap().put(SpringJobModel.SRPTING_METHOD_NAME, sysJob.getMethodName());

              // 復雜 的任務調(diào)度

              TriggerBuilder<CronTrigger> builder = newTrigger().withIdentity(name, jobDetail.getKey().getGroup())

                     .withSchedule(cronSchedule(sysJob.getExpression()));

              // 若有起始時間,則設置

               String startTime=sysJob.getStarttime();

               String endTime=sysJob.getEndtime();

              if (startTime!=null && !startTime.equals("")) {

                  builder.startAt(DateUtil.stringToDate(startTime));

              }

              // 設置終止時間

              if (endTime!=null && !endTime.equals("")) {

                  builder.endAt(DateUtil.stringToDate(endTime));

              }

              trigger = builder.build();

              scheduler.scheduleJob(jobDetail, trigger);

              //更新

              sysJob.setState(1);//已運行

           }else{

              //恢復Job任務開始執(zhí)行

              scheduler.resumeJob(new JobKey(name, sysJob.getId()+""));

              sysJob.setState(1);//已運行

           }

           sysJobDao.updateByPrimaryKey(sysJob);

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

    /**

     * 停止

     */

    @Override

    @ServiceLog("停止定時任務")

    public void createStopJobByJobId(Long id) {

       SysJob sysJob=sysJobDao.selectByPrimaryKey(id);

       try {

           if(sysJob!=null){

              //暫停job

              scheduler.pauseJob(new JobKey(sysJob.getJobName(), sysJob.getId()+""));

           }

       } catch (UnableToInterruptJobException e) {

           e.printStackTrace();

       } catch (SchedulerException e) {

           e.printStackTrace();

       }

       sysJob.setState(2);//已停止

       sysJobDao.updateByPrimaryKey(sysJob);

    }

    /**

     * 刪除

     */

    @Override

    @ServiceLog("刪除定時任務")

    public void deleteByPrimaryKey(Long id) {

       SysJob sysJob=sysJobDao.selectByPrimaryKey(id);

       if(sysJob!=null){

           //刪除job

           try {

              boolean flag=true;

              String name=sysJob.getJobName();

              if(name==null||sysJob.equals("")){

                  flag=false;

              }else{

                  //判斷是否存在

                  flag=scheduler.checkExists(new JobKey(name, sysJob.getId()+""));

              }

              if(flag){

                  scheduler.deleteJob(new JobKey(name, sysJob.getId()+""));

              }

           } catch (SchedulerException e) {

              e.printStackTrace();

           }

       }

       sysJobDao.deleteSysJob(sysJob);

    }

}

BSysJob

   /**

     * 意義,目的和功能,以及被用到的地方<br>

     */

    private static final long serialVersionUID = -2800683486829288336L;

    @Id

    @GeneratedValue(strategy=GenerationType.AUTO)

    private Long id; //定時器JobKeygroup

    @Column

    private String name; //定時器名稱

    @Column(name="job_name")

    private String jobName; //定時器JobKeyName

    @Column(name="bean_name")

    private String beanName;//bean名稱

    @Column(name="method_name")

    private String methodName;//方法名稱

    @Column

    private String expression;// 調(diào)度表達式

    @Column

    private String starttime;// 開始時間

    @Column

    private String endtime;// 結束時間

    @Column

    private String remark;//備注

    @Column

    private String createtime;// 創(chuàng)建時間

    @Column

    private Integer state=2;// 運行狀態(tài):1、運行  2、停止

C、Controller

注:RequiresPermissions此注解是shiro的權限判斷注解,可以去掉

 

@Resource

    private SchedulerService schedulerService;

   

    @RequestMapping(value="/execute")

    @ResponseBody

    public String executeQuartz(String beanName, String methodName){

       String mes="已成功加入!";

       try {

           schedulerService.runBean(beanName, methodName);

           } catch (Exception e) {

           mes=e.getMessage();

       }

       return mes;

    }

   

    @RequiresPermissions("job:run")

    @RequestMapping(value="/{id}/execute")

    @ResponseBody

    public String executeQuartz(@PathVariable Long id){

       String mes="成功加入";

       try {

           schedulerService.createRunJobByJobId(id);

       } catch (Exception e) {

           mes=e.getMessage();

           logger.error(mes);

       }

       return mes;

    }

   

    @RequiresPermissions("job:run")

    @RequestMapping(value="/{id}/stop")

    @ResponseBody

    public String stopQuartz(@PathVariable Long id){

       String mes="成功加入";

       try {

           schedulerService.createStopJobByJobId(id);

       } catch (Exception e) {

           mes=e.getMessage();

           logger.error(mes);

       }

       return mes;

    }

   

    @RequiresPermissions("job:delete")

    @RequestMapping(value = "/{id}/delete", method = RequestMethod.POST)

    @ResponseBody

    public String delete(@PathVariable("id") Long id) {

        String message="刪除成功";

        try {

           schedulerService.deleteByPrimaryKey(id);

       } catch (Exception e) {

           message="刪除失敗";

           logger.error(e.getMessage());

       }

        return message;

    }

   

    @RequestMapping("/execute2")

    public void executeQuartz2(){

       schedulerService.runBean2();

    }

三、web頁面

1、     效果

 

新增頁面

2、     js代碼

注:用到的是jquery easyui插件

http://www./

http://www./easyui.html

 

var dialogWidth=700;

var dialogHeight=485;

 

var saveurl="";

 

/**

 * 表格

 */

$('#dg').datagrid( {

    width: clientWidth-200, 

    height: clientHeight-180,

    rownumbers : true,

    singleSelect : true,

    pagination : false,

    //pageSize : 20,

    fitColumns: true,

    url : basePath+'/sysjob/listPage'

});

//主列表查詢

function searchuser() {

    var username=$('#tb #name').val();

    var v="";

    if(username!=""){

        v+=" and name like '%"+username.trim()+"%' ";

    }

    $("#dg").datagrid("options").queryParams["param"] =v;

    $("#dg").datagrid("reload");

}

 

//新增

function addtn(){

    saveurl=basePath+'/sysjob/create';

    $('#dd').dialog({

       iconCls:'icon-user',

        title: '錄入',

        width: dialogWidth,

        height: dialogHeight,

        closed: false,

        cache: false,

        resizable:true,

        href: basePath+'/sysjob/addpage',

        modal: true,

        onLoad:function(){

        }

    });

    //$('#dd').dialog('refresh', 'addpwk.jsp');

}

function savedd(){

    save(saveurl);

}

 

//編輯

function bianji() {

    var row = $('#dg').datagrid('getSelected');

    if(row==null){

        $.messager.alert('提示信息','請選擇一條記錄!','info');

        return;

    }

    saveurl=basePath+'/sysjob/update';

    $('#dd').dialog({

           iconCls:'icon-user',

            title: '編輯',

            width: dialogWidth,

            height: dialogHeight,

            closed: false,

            cache: false,

            resizable:true,

            href: basePath+'/sysjob/addpage',

            modal: true,

            onLoad:function(){

                $('#form12').form('load', row);

            }

        });

        //$('#dd').dialog('refresh', 'addpwk.jsp');

}

 

function save(url) {

        $('#form12').form('submit', {

            url : url,

            onSubmit : function() {

                //進行表單驗證

                //如果返回false阻止提交

                var flag = $(this).form('validate');

                if (flag) {

                    showProcess(true, '溫馨提示', '正在提交數(shù)據(jù)...');

                }

                return flag

            },

            success : function(data) {

                showProcess(false);

                if (data=='錄入成功'||data=='修改成功') {

                        $.messager.alert('提示信息','提交成功!','info');

                        $('#dg').datagrid('reload');

                        $('#dd').dialog('close');

                }  else if (data=='1') {

                        $.messager.alert('提示信息','您輸入的bean不存在,請重新輸入!','error');

                }  else{

                        $.messager.alert('提示信息','提交失敗!','error');

                    }

                },

                error:function (data){

                    alert(data);

                }

        });

}

//刪除

function deleteRecord(){

    var row = $('#dg').datagrid('getSelected');

    if(row==null){

        $.messager.alert('提示信息','請選擇一條記錄!','info');

        return;

    }

    $.messager.confirm('刪除記錄', '確認刪除嗎?', function(r){

    if (r){

         showProcess(true, '溫馨提示', '正在提交數(shù)據(jù)...');

         $.post(basePath+'/quartz/'+row.id+'/delete',null,function(json){

                 showProcess(false);

                 if(json=="刪除成功"){

                      $.messager.alert('提示信息','刪除成功!','info',function () {

                        $('#dg').datagrid('reload');

                     });

                 }else{

                     $.messager.alert('提示信息','刪除失敗!','error');

                 }

            });

     }

    });

}

 

//啟動任務

function yunxing(id){

    $.messager.confirm('溫馨提示', '確認啟動嗎?', function(r){

    if (r){

         showProcess(true, '溫馨提示', '正在提交數(shù)據(jù)...');

         $.post(basePath+'/quartz/'+id+'/execute',null,function(json){

                 showProcess(false);

                 if(json=="成功加入"){

                      $.messager.alert('提示信息','啟動成功!','info',function () {

                        $('#dg').datagrid('reload');

                     });

                 }else{

                     $.messager.alert('提示信息','啟動失敗!','error');

                 }

            });

     }

    });

}

//停止

function  tingzhi(id){

    $.messager.confirm('溫馨提示', '確認停止嗎?', function(r){

        if (r){

             showProcess(true, '溫馨提示', '正在提交數(shù)據(jù)...');

             $.post(basePath+'/quartz/'+id+'/stop',null,function(json){

                     showProcess(false);

                     if(json=="成功加入"){

                          $.messager.alert('提示信息','已成功停止!','info',function () {

                            $('#dg').datagrid('reload');

                         });

                     }else{

                         $.messager.alert('提示信息','停止失敗!','error');

                     }

                });

         }

        });

}

3、     jsp頁面

主頁面:

 

<table id="dg" data-options="toolbar:'#tb'">

                                        <thead>

                                            <tr>

                                                <th data-options="field:'name',width:100" >定時器名稱</th>

                                                <th data-options="field:'beanName',width:80,align:'center'" >bean名稱</th>

                                                <th data-options="field:'methodName',width:80,align:'center'" >方法名稱</th>

                                                <th data-options="field:'expression',width:80,align:'center'" >調(diào)度表達式</th>

                                                <th data-options="field:'starttime',width:100,align:'center'" >開始時間</th>

                                               <th data-options="field:'endtime',width:100,align:'center'" >結束時間</th>

                                                <th data-options="field:'state',width:80,align:'center',formatter:stateformatter" >運行狀態(tài)</th>

                                                <th data-options="field:'remark',width:80" >備注</th>

                                                <shiro:hasPermission name="job:run">

                                                   <th data-options="field:'tools',width:120,align:'center',formatter:rowformater" >操作</th>

                                                </shiro:hasPermission>

                                            </tr>

                                        </thead>

                                    </table>

                                    <div id="tb" style="padding: 5px; height: auto;">

                                        <div >

                                        <span class="input-prepend"><span class="add-on">定時器名稱:</span>

                                            <input type="text" id="name" style="width:150px;" class="m-wrap" maxlength="20"

                                                      onkeypress="return noNumbers(event)">

                                        </span>

                                             

                                        <a href="#" onclick= "javascript: searchuser();" class="btn btn-info"><i class="icon-search"></i> 查詢</a>

                                        <shiro:hasPermission name="job:create">

                                            <a href="javascript:void(0);" onclick="addtn()" class="btn btn-warning" style="margin-left:50px;"><i class="icon-plus icon-white"></i>新增</a>

                                        </shiro:hasPermission>

                                        <shiro:hasPermission name="job:update">

                                           <a href="javascript:void(0);" onclick="bianji()" class="btn btn-primary" style="margin-left:10px;"><i class="icon-pencil"></i> 修改</a>

                                        </shiro:hasPermission>

                                   

                                          <shiro:hasPermission name="job:delete">

                                              <a href="javascript:void(0);" onclick="deleteRecord()" class="btn btn-danger" style="margin-left:10px;"><i class="icon-trash "></i> 刪除</a>

                                          </shiro:hasPermission>

                                    </div>

                                    <!-- 彈出框開始 -->

                                 <div id="dd" class="easyui-dialog" data-options="buttons: '#dd #dlg-buttons',closed:true">

                                    <div id="dlg-buttons">

                                        <button class="btn btn-success" onclick= "savedd()"><i class="icon-ok"></i>提交</button>

                                        <button class="btn btn-danger" onclick= "javascript: $('#dd').dialog('close');"><i class="icon-remove"></i>關閉</button>

                                    </div>

                                </div>

                                <!-- 彈出框結束 -->

 

彈出框頁面:

 <form action="#" method="post" id="form12">

                            <table class="table_jjval" style="width:99%;">

                                            <input type="hidden"  name="id" id="id"/>

                                            <input type="hidden"  name="state" id="state" value="2"/>

                                            <input type="hidden"  name="createtime" id="createtime"/>

                                            <tr height="45">

                                                <td style="width:20%;" class="td_left">任務名稱:</td>

                                                <td style="width:30%;">

                                                    <input style="margin-left:5px;width:90%;"  class="easyui-validatebox"

                                                    data-options="required:true" missingMessage="請輸入任務名稱"

                                                    type="text"  id="name" name="name" 

                                                    onkeypress="return noNumbers(event)"  maxlength="100" >

                                                </td>

                                            </tr>

                                            <tr height="45">

                                                <td style="width:20%;" class="td_left">bean名稱:</td>

                                                <td style="width:30%;">

                                                    <input style="margin-left:5px;width:90%;"  class="easyui-validatebox"

                                                    data-options="required:true" missingMessage="請輸入bean名稱"

                                                    type="text"  id="beanName" name="beanName" 

                                                    onkeypress="return noNumbers(event)"  maxlength="100" >

                                                </td>

                                            </tr>

                                            <tr height="45">

                                                <td style="width:20%;" class="td_left">方法名稱:</td>

                                                <td style="width:30%;">

                                                    <input style="margin-left:5px;width:90%;"  class="easyui-validatebox"

                                                    data-options="required:true" missingMessage="請輸入方法名稱"

                                                    type="text"  id="methodName" name="methodName" 

                                                    onkeypress="return noNumbers(event)"  maxlength="100" >

                                                </td>

                                            </tr>

                                            <tr height="45">

                                                <td style="width:20%;" class="td_left">調(diào)度表達式:</td>

                                                <td style="width:30%;">

                                                    <input style="margin-left:5px;width:90%;"  class="easyui-validatebox"

                                                    data-options="required:true" missingMessage="請輸入調(diào)度表達式"

                                                    type="text"  id="expression" name="expression" 

                                                    onkeypress="return noNumbers(event)"  maxlength="100" >

                                                </td>

                                            </tr>

                                            <tr height="45">

                                                <td style="width:20%;" class="td_left">開始時間:</td>

                                                <td style="width:30%;">

                                                    <input style="margin-left:5px;width:150px;"  

                                                    type="text"  id="starttime" name="starttime" 

                                                    onfocus="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" class="Wdate"  maxlength="100" >

                                                </td>

                                            </tr>

                                            <tr height="45">

                                                <td style="width:20%;" class="td_left">結束時間:</td>

                                                <td style="width:30%;">

                                                    <input style="margin-left:5px;width:150px

                                                    type="text"  id="endtime" name="endtime" 

                                                    onfocus="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" class="Wdate"  maxlength="100" >

                                                </td>

                                            </tr>

                                            <tr height="45">

                                                <td style="width:20%;" class="td_left">備注:</td>

                                                <td style="width:30%;">

                                                    <input style="margin-left:5px;width:90%;"  class="easyui-validatebox"

                                                    type="text"  id="remark" name="remark" 

                                                    onkeypress="return noNumbers(event)"  maxlength="100" >

                                                </td>

                                            </tr>

                                        </table>

                   </form>

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多