Quartz学习之实现关闭超时2天未付款的订单

1、依赖:

<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>2.2.1</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>
2、 定义 job
package com.taotao.store.order.job;

import org.joda.time.DateTime;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.QuartzJobBean;

import com.taotao.store.order.mapper.OrderMapper;

/**
 * 扫描超过2天未付款的订单关闭
 */
public class PaymentOrderJob extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        ApplicationContext applicationContext = (ApplicationContext) context.getJobDetail().getJobDataMap()
                .get("applicationContext");
        //时间参数,当前时间向前推2天
        applicationContext.getBean(OrderMapper.class).paymentOrderScan(new DateTime().minusDays(2).toDate());
    }

}

3、配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

	<!-- 定义任务bean -->
	<bean name="paymentOrderJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
		<!-- 指定具体的job类 -->
		<property name="jobClass" value="com.taotao.store.order.job.PaymentOrderJob" />
		<!-- 指定job的名称 -->
		<property name="name" value="paymentOrder" />
		<!-- 指定job的分组 -->
		<property name="group" value="Order" />
		<!-- 必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中删除该任务  -->
		<property name="durability" value="true"/>
		<!-- 指定spring容器的key,如果不设定在job中的jobmap中是获取不到spring容器的 -->
		<property name="applicationContextJobDataKey" value="applicationContext"/>
	</bean>
	
	<!-- 定义触发器 -->
	<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail" ref="paymentOrderJobDetail" />
		<!-- 每一分钟执行一次 -->
		<property name="cronExpression" value="0 0/1 * * * ?" />
	</bean>
	
	<!-- 定义调度器 -->
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	    <property name="triggers">
	        <list>
	            <ref bean="cronTrigger" />
	        </list>
	    </property>
	</bean>

</beans>
4、OrderMapper
package com.taotao.store.order.mapper;

import java.util.Date;



import org.apache.ibatis.annotations.Param;

import com.taotao.store.order.pojo.Order;

public interface OrderMapper extends IMapper<Order>{
	
	public void paymentOrderScan(@Param("date") Date date);

}
5、orderMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.taotao.store.order.mapper.OrderMapper">

	<sql id="tableName">tb_order</sql>
	
	<resultMap type="Order" id="pojoResultMap" autoMapping="true">
		<id column="order_id" property="orderId"/>
		<association property="orderShipping" javaType="OrderShipping" column="order_id" select="queryOrderShippingByOrderId" autoMapping="true"></association>
		<collection property="orderItems" javaType="Arraylist" ofType="OrderItem" autoMapping="true" select="queryOrderItemByOrderId" column="order_id">
		</collection>
	</resultMap>
	
	<select id="queryOrderItemByOrderId" resultType="OrderItem" parameterType="String">
		SELECT * FROM tb_order_item WHERE order_id = #{orderId};
	</select>
	
	<select id="queryOrderShippingByOrderId" resultType="OrderShipping" parameterType="String">
		SELECT * FROM tb_order_shipping WHERE order_id = #{orderId};
	</select>

	<select id="queryList" resultMap="pojoResultMap">
		SELECT
			*
		FROM
			<include refid="tableName"/>
	</select>
	
	<select id="queryByID" resultMap="pojoResultMap">
		SELECT
			*
		FROM
			<include refid="tableName"/>
		WHERE order_id = #{id};
	</select>
	
	<select id="queryByWhere" parameterType="Where" resultMap="pojoResultMap">
		SELECT
			*
		FROM
			<include refid="tableName"/>
		WHERE  ${where.column} ${where.operater} #{where.value} LIMIT 1;
	</select>
	
	<select id="queryListByWhere" parameterType="Where" resultMap="pojoResultMap">
		SELECT
			*
		FROM
			<include refid="tableName"/>
		WHERE  ${where.column} ${where.operater} #{where.value};
	</select>
	
	<insert id="save"> 
		INSERT INTO <include refid="tableName"/> VALUES (#{orderId},#{payment},#{paymentType},#{postFee},#{status},#{createTime},#{updateTime},#{paymentTime},#{consignTime},#{endTime},#{closeTime},#{shippingName},#{shippingCode},#{userId},#{buyerMessage},#{buyerNick},#{buyerRate});
		INSERT INTO tb_order_item VALUES 
		<foreach collection="orderItems" item="item" separator=",">
			(#{item.itemId},#{orderId},#{item.num},#{item.title},#{item.price},#{item.totalFee},#{item.picPath})
		</foreach>
		;
		INSERT INTO tb_order_shipping VALUES (#{orderId},#{orderShipping.receiverName},#{orderShipping.receiverPhone},#{orderShipping.receiverMobile},#{orderShipping.receiverState},#{orderShipping.receiverCity},#{orderShipping.receiverDistrict},#{orderShipping.receiverAddress},#{orderShipping.receiverZip},NOW(),NOW());
	</insert>
	
	<update id="update">
		UPDATE <include refid="tableName"/> 
		<set>
			<if test="payment !=null and payment != ''">
				payment = #{payment},
			</if>
			<if test="postFee !=null and postFee != ''">
				post_fee = #{postFee},
			</if>
			<if test="status !=null and status != ''">
				status = #{status},
			</if>
			<if test="updateTime !=null and updateTime != ''">
				update_time = #{updateTime},
			</if>
			<if test="paymentTime !=null and paymentTime != ''">
				payment_time = #{paymentTime},
			</if>
			<if test="consignTime !=null and consignTime != ''">
				consign_time = #{consignTime},
			</if>
			<if test="endTime !=null and endTime != ''">
				end_time = #{endTime},
			</if>
			<if test="closeTime !=null and closeTime != ''">
				close_time = #{closeTime},
			</if>
			<if test="shippingName !=null and shippingName != ''">
				shipping_name = #{shippingName},
			</if>
			<if test="shippingCode !=null and shippingCode != ''">
				shipping_code = #{shippingCode},
			</if>
			<if test="buyerMessage !=null and buyerMessage != ''">
				buyer_message = #{buyerMessage},
			</if>
			<if test="buyerRate !=null and buyerRate != ''">
				buyer_rate = #{buyerRate},
			</if>
		</set>
		WHERE order_id = #{orderId};
	</update>
	
	<delete id="deleteByID" parameterType="Long">
		DELETE FROM <include refid="tableName"/> WHERE order_id = #{orderId};
		DELETE FROM tb_order_item WHERE order_id = #{orderId};
	</delete>
	
	<delete id="deleteByIDS" parameterType="list">
		DELETE FROM <include refid="tableName"/> WHERE order_id IN 
		<foreach collection="ids" item="id" open="(" close=")" separator=",">
			#{id}
		</foreach>;
		DELETE FROM tb_order_item WHERE order_id IN 
		<foreach collection="ids" item="id" open="(" close=")" separator=",">
			#{id}
		</foreach>;
	</delete>
	
	<update id="paymentOrderScan" parameterType="Date">
		UPDATE tb_order SET
			status = 6,
			update_time = NOW(),
			close_time = NOW(),
			end_time = NOW()
		WHERE status = 1 AND payment_type = 1 AND create_time <= #{date}
	</update>
	
</mapper>





  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要设置Quartz的默认启动和关闭,可以通过以下步骤实现: 1. 在项目中引入Quartz依赖包,例如quartz-all-2.3.2.jar。 2. 创建一个Quartz定时任务管理类,例如: ``` import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; public class QuartzManager { private static Scheduler scheduler; static { try { scheduler = StdSchedulerFactory.getDefaultScheduler(); } catch (SchedulerException e) { e.printStackTrace(); } } public static void start() { try { scheduler.start(); } catch (SchedulerException e) { e.printStackTrace(); } } public static void shutdown() { try { scheduler.shutdown(); } catch (SchedulerException e) { e.printStackTrace(); } } } ``` 3. 在应用启动时调用QuartzManager的start()方法启动Quartz定时任务管理器。 4. 在应用关闭时调用QuartzManager的shutdown()方法关闭Quartz定时任务管理器。 例如,在Spring Boot中可以通过以下方式实现: ``` import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class MyApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(MyApplication.class, args); context.getBean(QuartzManager.class).start(); context.registerShutdownHook(); } } ``` 在这个例子中,我们首先通过SpringApplication.run()方法启动Spring Boot应用,并获取应用上下文对象。 然后,我们调用上下文对象中的getBean()方法获取QuartzManager对象,并调用其start()方法启动Quartz定时任务管理器。 最后,我们调用上下文对象的registerShutdownHook()方法注册一个JVM关闭钩子,以便在应用关闭时自动调用QuartzManager的shutdown()方法关闭Quartz定时任务管理器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值