`
xhpscdx
  • 浏览: 28625 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

在Spring中注入并使用quartz

 
阅读更多
配置

spring 配置文件:

<bean lazy-init="false">
   <constructor-arg>
    <props>
     <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
     <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
     <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
   
     <prop key="org.quartz.jobStore.dataSource">qzDS</prop>
     <prop key="org.quartz.dataSource.qzDS.driver">${jdbc.driverClassName}</prop>
     <prop key="org.quartz.dataSource.qzDS.URL">${jdbc.url}</prop>
     <prop key="org.quartz.dataSource.qzDS.user">${jdbc.username}</prop>
     <prop key="org.quartz.dataSource.qzDS.password">${jdbc.password}</prop>
     <prop key="org.quartz.dataSource.qzDS.maxConnections">30</prop>

     <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
     <prop key="org.quartz.threadPool.threadCount">10</prop>
     <prop key="org.quartz.threadPool.threadPriority">5</prop>
     <prop key="org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread">true</prop>
   
    </props>
   </constructor-arg>
</bean>


<bean id="scheduler" factory-bean="stdSchedulerFactory" factory-method="getScheduler" init-method="start" destroy-method="shutdown" lazy-init="false"/>


scheduler对象使用stdSchedulerFactory的getScheduler方法创建并且马上调用start方法启动quartz,在关闭时使用shutdown关闭quartz,设置scheduler的lazy-init="false"是为了令其在服务器启动时就创建该scheduler并启动服务。


stdSchedulerFactory的配置使用得不再需要quartz.properties文件。

如果要保留quartz.properties文件的配置方式,也可以将stdSchedulerFactory配置修改为:

<bean lazy-init="false">
      <constructor-arg index="0" value="/conf/quartz.properties"></constructor-arg>
</bean>


********************************************************************************************************************************

********************************************************************************************************************************

在Job中使用ServletContext的解决方法

因为quartz线程不是一个HTTP请求,不存在request对象,无法取得servletContext,但是可以通过定义一个静态变量:ServletContext context,通过在服务器启动的时候进行初始化(采用listener或者servlet)。

代码:


public class JobContextListener implements ServletContextListener
{

public void contextDestroyed(ServletContextEvent servletcontextevent)
{
   // TODO Auto-generated method stub
 
}

public void contextInitialized(ServletContextEvent servletcontextevent)
{
   // TODO Auto-generated method stub
   JobContext.getInstance().setContext(servletcontextevent.getServletContext());
}
}

public class JobContext
{
private final static JobContext instance = new JobContext();
private static ServletContext context;

private JobContext()
{
}

public static JobContext getInstance()
{
   return instance;
}

protected void setContext(ServletContext context2)
{
   context = context2;
}

public ServletContext getContext()
{
   return context;
}
}

在web.xml中添加

<!-- 任务监听程序 -->
<listener>
   <listener-class>cms.module.quartz.JobContextListener</listener-class>
</listener>

在Job类的excute方法中使用ServletContext scontext = JobContext.getInstance().getContext();即可取得ServletContext。


使用

ServletContext scontext = JobContext.getInstance().getContext();
    ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(scontext);
    quartzIndexPageService = (ISitePage)ctx.getBean("quartzIndexPageService");

就可以取得spring注入的bean实例

********************************************************************************************************************************

********************************************************************************************************************************

在Job中Spring注入的bean实例,bean实例使用了hibernate出现no session问题的解决方法

因为bean实例使用了hibernate去访问数据库,而且象关系映射使用延迟的对象初始化(也就是说,如果有某一个hibernate请求不是经由web request发起的,而是由quartz这样的定时任务发起的,那么quartz怎么样才能得到hibernate session呢?)


spring配置:

<bean >  
         <property name="sessionFactory">  
           <ref bean="sessionFactory"/>  
         </property>  
    </bean>
   
<!-- Manager template -->  
    <bean id="txProxyTemplate" abstract="true"  
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
        <property name="transactionManager" ref="transactionManager"/>  
        <property name="transactionAttributes">
            <props>  
                <prop key="save*">PROPAGATION_REQUIRED</prop>  
                <prop key="remove*">PROPAGATION_REQUIRED</prop>  
                <prop key="update*">PROPAGATION_REQUIRED</prop>                   
                <prop key="create*">PROPAGATION_REQUIRED</prop>      
                <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>  
            </props>  
        </property>  
        <property name="preInterceptors">  
            <list>  
             <ref bean="hibernateInterceptor"/>  
            </list>  
        </property>                           
    </bean>


<!-- 配置令columnService的方法在quartz的job中支持延迟加载 -->
<bean id="quartzColumnService" parent="txProxyTemplate" >
   <property name="target" ref="columnService"/>
</bean>
<!-- 配置令indexPageService的方法在quartz的job中支持延迟加载 -->
<bean id="quartzIndexPageService" parent="txProxyTemplate" >
   <property name="target" ref="indexPageService"/>
</bean>


<bean >
   <property name="tagClassMap" ref="tagMap" />
   <property name="siteService" ref="siteService" />
</bean>


这样一来,在job中就可以使用quartzIndexPageService和quartzColumnService这两个bean了,而且这两个bean的实现indexPageService和columnService中使用hibernate(就算hibernate对象使用延迟初始化)查询而不会引起no session 异常。
分享到:
评论

相关推荐

    SpringQuartz的使用文档

    Spring对Quartz进行了集成,使其更易于在Spring应用程序中使用。Spring提供了`FactoryBean`类,如`SchedulerFactoryBean`,用于创建和管理Quartz的`Scheduler`实例。这使得我们可以利用Spring的依赖注入(DI)和管理...

    spring+quartz demo

    Spring 提供了与 Quartz 集成的模块,使得在 Spring 应用程序中使用 Quartz 更加便捷,包括 Job 实例的管理、触发器的配置以及对 Quartz Scheduler 的控制。 在这个 "spring+quartz demo" 中,我们可以学习到如何将...

    quartz整合springbatch动态集群定时实现mysql参考

    通过这个项目,开发者可以学习到如何在分布式环境中使用Quartz进行定时任务调度,以及如何利用Spring Batch进行批量数据处理。同时,了解如何将这些组件与MySQL数据库相结合,实现高可用性和可扩展性。对于希望构建...

    spring的quartz使用实例

    在Spring中,通常会使用`org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean`来包装一个带有@Scheduled注解的方法。 5. **Cron表达式** CronTrigger允许使用Cron表达式来定义触发时间,如...

    Java_Spring与Quartz的整合

    - 在Spring配置中,使用`&lt;bean&gt;`标签定义Trigger,并关联Job。 4. **启动Scheduler** - 在Spring应用启动时,通过`SchedulerFactoryBean`的`start()`方法启动Scheduler,开始监控并执行Job。 5. **动态管理Job**...

    spring之定时任务实现(spring-task和quartz等不同方式)

    配置Quartz通常需要在Spring配置文件中声明`SchedulerFactoryBean`,并设置相关的bean。例如: ```xml &lt;bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&gt; &lt;!-- 这里...

    Quartz注入Spring的Bean

    3. **Spring注入Bean到Job**:在Job执行时,我们可以直接注入其他由Spring管理的Bean,无需在Job中创建这些对象,从而减少了代码的复杂性,增强了可重用性。 4. **JobFactory的自定义**:Quartz默认使用...

    spring2与quartz在Web整合

    3. **整合过程**:整合 Spring 2 和 Quartz 需要在 Spring 配置文件中声明 Job 和 Trigger 的 Bean,并指定它们的关联。Spring 可以通过其自身的 JobFactory 来创建 Job 实例,使得 Job 可以利用 Spring 的 DI 功能...

    spring+quartz使用jar包

    3. **Job和Trigger**:在Quartz中,Job是需要执行的任务,Trigger则是定义任务何时执行的规则。Spring可以通过实现`org.springframework.scheduling.quartz.JobDetailBean`和`org.springframework.scheduling.quartz...

    Spring4.X+Quartz2.X

    Spring4.X与Quartz2.X是两个在企业级Java应用中广泛使用的开源框架。Spring是一个全面的、模块化的应用开发框架,它简化了Java EE应用的开发,提供了强大的依赖注入、AOP(面向切面编程)以及丰富的数据访问支持。而...

    转:spring多个定时任务quartz配置

    3. **创建Job类**:Quartz中的任务由`Job`接口实现,你需要定义一个或多个实现了`org.quartz.Job`接口的类,每个类代表一个具体的任务。 4. **定义Trigger**:`Trigger`是决定任务何时运行的规则,可以是...

    quartz和spring-quartz

    而Spring-Quartz则是Spring框架对Quartz的集成,它使得在Spring应用中使用Quartz变得更加方便。 Quartz的核心概念包括Job(作业)、Trigger(触发器)和Calendar(日历)。Job是实际要执行的任务,Trigger定义了Job...

    Spring_QuartZDemo

    - Job:在Quartz中,任务被称为Job。我们可以通过实现`org.quartz.Job`接口或者继承`org.quartz.StatefulJob`(如果任务状态需要保留)来定义自己的Job。 ```java public class MyJob implements Job { @...

    spring注解Quartz定时执行功能

    在Spring框架中集成Quartz库可以实现强大的定时任务管理功能。Quartz是一个开源的作业调度框架,它允许程序创建和管理任务,以便在特定时间自动执行。Spring通过其优秀的依赖注入(DI)和AOP(面向切面编程)特性,...

    在spring中使用quartz

    在Quartz中,任务被称为“Job”,而执行时间的计划被称为“Trigger”。一个Job可以被多个Trigger触发,而一个Trigger也可以关联到多个Job。JobDetail代表了Job的具体实现,包含了Job类的信息和执行时所需的参数。...

    spring和quartz的定时器的启动和停止例子

    通过以上步骤,我们可以灵活地在Spring应用中使用Quartz实现定时任务的启动和停止。在实际项目中,还可以根据需求对任务进行分组、优先级排序、任务依赖设置等高级功能,以满足复杂的调度需求。记得在生产环境中,...

    quartz2.2.1 spring3.1.1

    Quartz 2.2.1 和 Spring 3.1.1 是两个在企业级Java应用开发中常用的开源框架。Quartz 是一个强大的、完全可定制的作业调度库,而 Spring 则是Java应用程序的全面框架,它提供了依赖注入、AOP(面向切面编程)、事务...

    spring quartz定时任务demo

    它具有高度的灵活性,可以在任何Java应用程序中使用,无论是Web应用还是独立的Java应用。 Spring框架则是一个广泛使用的全面的企业级应用开发框架,它简化了Java应用的开发,提供了依赖注入(DI)和面向切面编程...

    spring3整合quartz1.8和spring3整合quartz2.2两个版本示例

    4. **Scheduler 配置**:在 Spring 配置中,可以使用 `@Configuration` 类来定义 `SchedulerFactoryBean`,并设置相关的属性。 5. **监听器**:Quartz 2.x 提供了更丰富的监听器功能,可以在 Spring 配置中添加 ...

    Spring+Quartz example

    在Quartz中,Job是执行的任务,Trigger是触发任务的时间规则。Spring支持使用`@Component`注解定义Job类,然后通过`@DisallowConcurrentExecution`确保每次只有一个实例在执行。Trigger则是通过`@Scheduled`注解在...

Global site tag (gtag.js) - Google Analytics