quartz简单实例及Guice整合

首先 感谢github上面的大牛的实例。。https://github.com/halflite/guice-quartz-sample

最开始的时候 我是 新生成injector 实例化所有对象 来得到quartz里面需要的service类的。。

 

错误做法:!!!!!!!!!!!

  List<Module> modules = new ArrayList<Module>();
        
        //加载数据库配置文件
        modules.add(new XMLMyBatisModule() {
            @Override
            protected void initialize() {
                setEnvironmentId("screen");
                setClassPathResource("mybatis-config.xml");
            }
        });
        
        modules.add(new BindModule());        

        Injector injector =  Guice.createInjector(modules);  
        PopInfoService infoService = injector.getInstance(PopInfoService.class);

直到有一天 数据库爆掉了。。sleep的连接太多 。网上有人说 可以设置 wait_timeout(sql是set global wait_timeout=10 详情参看http://blog.sina.com.cn/s/blog_78ecbe330101332k.html),是个不错的方法,但更正统的做法是,guice本身就可以整合quartz ,不需要重新injector.getInstance。。

下面是正确的做法!!!!!!!!!!!!!!

 

maven依赖地址

    <dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</dependency>
    <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz-jobs</artifactId>
    <version>2.2.1</version>
</dependency>
    
    <!--解决报错 java.lang.NoClassDefFoundError: javax/transaction/UserTransaction -->
<dependency>
    <groupId>javax.transaction</groupId>
    <artifactId>jta</artifactId>
    <version>1.1</version>
</dependency>

 

 

下面是代码 

玩GUICE必备 

package gov.jiyuan.screen.guice;

import java.util.ArrayList;
import java.util.List;

import org.mybatis.guice.XMLMyBatisModule;

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.servlet.GuiceServletContextListener;

import gov.jiyuan.screen.module.BindModule;

/**
 * 
 * <p>
 * Title:ScreenServletContextListener
 * </p>
 * <p>
 * Description:
 * </p>
 * 
 * @author LiuSP
 * @date 2017年11月29日
 */
public class ScreenServletContextListener extends GuiceServletContextListener {

    @Override
    protected Injector getInjector() {
        
        List<Module> modules = new ArrayList<Module>();
        
        //加载数据库配置文件
        modules.add(new XMLMyBatisModule() {
            @Override
            protected void initialize() {
                setEnvironmentId("screen");
                setClassPathResource("mybatis-config.xml");
            }
        });
        
        modules.add(new BindModule());        

        return Guice.createInjector(modules);
    }
}
 

。。。。。。。。。。。。。。。。。。。。。。。下面开始整合

 

package gov.jiyuan.screen.common.quartz;

import javax.inject.Inject;
import javax.inject.Singleton;

import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.spi.JobFactory;
import org.quartz.spi.TriggerFiredBundle;

import com.google.inject.Injector;

 
@Singleton
public class GuiceJobFactory implements JobFactory {

    private final Injector guice;

    @Inject
    public GuiceJobFactory(final Injector guice) {
        this.guice = guice;
    }

    @Override
    public Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws SchedulerException {
        JobDetail jobDetail = bundle.getJobDetail();
        Class<? extends Job> jobClass = jobDetail.getJobClass();
        return guice.getInstance(jobClass);
    }
}
 

 

package gov.jiyuan.screen.common.quartz;

import javax.inject.Inject;
import javax.inject.Singleton;

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;


@Singleton
public class Quartz {

    private final Scheduler scheduler;

    @Inject
    public Quartz(final SchedulerFactory factory, final GuiceJobFactory jobFactory) throws SchedulerException {
        this.scheduler = factory.getScheduler();
        this.scheduler.setJobFactory(jobFactory);
        this.scheduler.start();
    }

 
    public final Scheduler getScheduler() {
        return this.scheduler;
    }
}
 

。。。。。。。。。。。。。。。。。。。。以上2个是整合用工具类 下面是整合类  bindMoudle 。。

他extends AbstractModule。。不明白这个类是干嘛的朋友 先去下个GUICE玩玩。。

 

/**
 * 
* <p>Title:BindModule </p>
* <p>Description: 访问绑定类</p>

* @author LiuSP
* @date 2017年12月7日
 */
public class BindModule extends AbstractModule {

    @Override
    protected void configure() {
        install(new ServletModule() {
            @Override
            protected void configureServlets() {

                //quartz
                try {
                    InputStream in = null;
                    Properties  p =new Properties();
                    in = getClass().getResourceAsStream("/" + "quartz.properties");
                    p.load(in);
                    bind(SchedulerFactory.class).toInstance(new StdSchedulerFactory(p));
                } catch (SchedulerException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } 
                bind(GuiceJobFactory.class);
                bind(Quartz.class).asEagerSingleton();
          

            }
        });

    }

}

 

下面是job类  job类需要在quartz_job.xml里面配置 在下面会提到

package gov.jiyuan.screen.quartz.taxi;

import java.text.ParseException;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import com.google.inject.Inject;
import com.google.inject.Singleton;

import gov.jiyuan.screen.service.taxi.TaxiGPSService; 
@Singleton
public class TaxiQuartz implements Job { 


    @Inject
    private TaxiGPSService infoService;
    
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
 
            try {
                infoService.insertData();
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
 
    }

附:

项目结构

171529_jIxm_3678539.png

171543_eIxC_3678539.png

具体配置

web.XML

 <servlet>    
        <servlet-name>QuartzInitializer</servlet-name>    
        <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>    
        <init-param>    
            <param-name>config-file</param-name>    
            <param-value>quartz.properties</param-value>    
        </init-param>    
        <init-param>    
            <param-name>shutdown-on-unload</param-name>    
            <param-value>true</param-value>    
        </init-param>    
        <init-param>    
            <param-name>start-scheduler-on-load</param-name>    
            <param-value>true</param-value>    
        </init-param>   
        <load-on-startup>1</load-on-startup>    
  </servlet>    

同时还需要在resource下面添加quartz-jobx.xml

<?xml version='1.0' encoding='utf-8'?>  
<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"  
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
   xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_2_0.xsd"  
   version="2.0">
    <schedule>
        <job>
            <name>my_job1</name>
            <group>my_group1</group>
            <description>配置定时任务1</description>
           <!-- 下面的是job类位置 -->
            <job-class>gov.jiyuan.screen.quartz.taxi.TaxiQuartz</job-class>            
            <durability>false</durability>
            <recover>false</recover>
        </job>
        <trigger>
            <cron>
                <name>my_trigger1</name>
                <group>my_trigger_group_1</group>
                <job-name>my_job1</job-name>
                <job-group>my_group1</job-group>
                <cron-expression>0 10 17 * * ? *</cron-expression><!-每天5点10分更新-!>
            </cron>
        </trigger>
        </schedule>
</job-scheduling-data>

。。。。。。。。。。。。。。。。。。。。。。。。。还需要在resource里添加quartz.properties

# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
#配置scheduler信息,这一部分基本一致,无需修改
org.quartz.scheduler.instanceName=DefaultQuartzScheduler
org.quartz.scheduler.rmi.export=false
org.quartz.scheduler.rmi.proxy=false
org.quartz.scheduler.wrapJobExecutionInUserTransaction=false
#线程池的配置
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
#Job存储方式的配置
#jobStore 方式为RAM存储没有实现持久化
org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore
#===============================================================    

#Configure Plugins     
#插件的配置 job和trigger的配置可以写在fileNames 定义的xml文件中
#比如这里是配置在quartz_jobx.xml 文件中,该文件也存放在classpath下
# 这样在启动Quartz的时候,Quartz 自动到quartz_jobx.xml 文件中获取#job 和trigger的配置.
#===============================================================      

org.quartz.plugin.jobInitializer.class=org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames=quartz_jobx.xml

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。以上就是全部操作了

又可以愉快的玩耍了~ 

转载于:https://my.oschina.net/u/3678539/blog/1608437

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值