乐趣区

tomcat-负载均衡三定时任务处理

一. 项目采用的是 quartz 框架做定时任务, 所以做的是 quart 分布式解决负载均衡下定时任务问题
1. 需要将定时任务持久化到数据库, 在数据库对应 sql 语句里面找到对应数据库, 生成对应的数据库表

2. 在项目中配置定时任务

  1. 创建 quartz.properties 文件, 文件内容如下
org.quartz.scheduler.instanceName = TestScheduler1  
org.quartz.scheduler.instanceId = AUTO 

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
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.maxMisfiresToHandleAtATime=10
org.quartz.jobStore.isClustered = true 
org.quartz.jobStore.clusterCheckinInterval = 20000

org.quartz.jobStore.dataSource = quartz
org.quartz.dataSource.quartz.provider=hikaricp
org.quartz.dataSource.quartz.driver=com.mysql.jdbc.Driver
org.quartz.dataSource.quartz.URL=jdbc:mysql:///purchase_order?serverTimezone=UTC 数据库地址
org.quartz.dataSource.quartz.user=root 用户名
org.quartz.dataSource.quartz.password=xx 密码
org.quartz.dataSource.quartz.maxConnections=5

2. 创建任务

@PersistJobDataAfterExecution
@DisallowConcurrentExecution// 不允许并发执行
public class QuartzDemo extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println("-----------111111111----------");
    }

}

配置任务

  <bean id="updateArrivedJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass">
            <value>com.creatooor.order.quartz.QuartzDemo</value>
        </property>
        <property name="requestsRecovery" value="true" />
        <property name="durability" value="true" />
    </bean>

    <bean id="updateArrivedJobDetailTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- 将任务类描述交给触发器 -->
        <property name="jobDetail" ref="updateArrivedJobDetail"></property>
        <!--Cron 表达式,定时规则 -->
        <property name="cronExpression" value="0 20 13 * * ?"></property>
    </bean>

    <!-- 总管理容器 -->
    <bean name="quartzScheduler"   class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
        <property name="configLocation" value="classpath:quartz.properties" />
<!--        重写任务配置信息,这样当修改任务执行时间后,不用清数据库表就会生效,程序会自动修改对应任务的执行时间 -->
        <property name="overwriteExistingJobs" value="true" />

        <property name="triggers">
            <list>
                <!--                <ref bean="updatePriceTrigger"/>-->
                <!--                <ref bean="updateArrivedJobDetailTrigger"/>-->
                <ref bean="updateArrivedJobDetailTrigger"/>
            </list>
        </property>
    </bean>

结果:

只有一个 tomcat 开启执行任务

退出移动版