然後調用這個線程池中的schedule方法,該方法會在規定的時間段中創建線程,通過在這個方法中重寫runnable,創建線程,schedule方法其實會返回壹個對象,可以通過該對象停止生產線程,但是由於這個需求需要在匿名內部類中進行停止,所以方法外停止不可用,所以用遞歸進行判斷何時停止生產
源碼如下
package com.romens.order.service.impl;
import com.romens.order.Do.RefundOrderInfoDO;
import com.romens.order.Do.RefundOrderPayDO;
import com.romens.order.common.ResponseData;
import com.romens.order.domain.enums.FromEnum;
import com.romens.order.domain.enums.RefundOrderStateEnum;
import com.romens.order.domain.enums.RefundPayStateEnum;
import com.romens.order.domain.pay.RefundPaySMRequest;
import com.romens.order.domain.pay.RefundPaySMResponse;
import com.romens.order.repository.RefundOrderInfoRepository;
import com.romens.order.repository.RefundOrderPayRepository;
import com.romens.order.service.PayStateService;
import com.romens.order.service.PaymentForRefundService;
import com.romens.order.service.RefundOrderInfoService;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class PaymentStateSchedueServiceImplimplements PayStateService {
@Autowired
private ThreadPoolTaskSchedulerschedulerExcutor;
@Autowired
private PaymentForRefundServicepaymentForRefundService;
@Autowired
private RefundOrderPayRepositoryrefundOrderPayRepository;
@Autowired
private RefundOrderInfoServicerefundOrderInfoService;
@Autowired
private RefundOrderInfoRepositoryrefundOrderInfoRepository;
@Override
public void startSchedue(RefundPaySMRequest refundPaySMRequest, String secretKey, RefundOrderPayDO refundOrderPayDO) {
Trigger trigger =null;
schedulerExcutor.schedule(new Runnable() {
@Override
public void run() {
ResponseData response =paymentForRefundService.queryPaySMRefund(refundPaySMRequest, secretKey);
if (response.getCode().equals(200)) {
if (response.getData().getRefundState().equals("2")) {
//更新支付信息狀態
refundOrderPayDO.setRefundState(RefundPayStateEnum.REFUND_OK.getStateCode());
updateRefundInfo(refundOrderPayDO);
//醫館自動提單
RefundOrderInfoDO refundOrderInfoDO =refundOrderInfoRepository.getRefundOrderInfoByUid(refundOrderPayDO.getEntId(), refundOrderPayDO.getStoreCode(), refundOrderPayDO.getRefundOrderUid());
if (refundOrderInfoDO.getSource().equals(FromEnum.Hospital.getValue())) {
refundOrderInfoService.autoSubmitHospitalRefundOrderInfo(refundOrderPayDO.getEntId(), refundOrderPayDO.getStoreCode(), refundOrderInfoDO);
}
return;
}else if (response.getData().getRefundState().equals("3")) {
refundOrderPayDO.setRefundState(RefundPayStateEnum.REFUND_FAILED.getStateCode());
updateRefundInfo(refundOrderPayDO);
return;
}
}
startSchedue(refundPaySMRequest, secretKey, refundOrderPayDO);
}
}, DateTime.now().plus(5 *1000).toDate());
}
public void updateRefundInfo(RefundOrderPayDO refundOrderPayDO) {
try {
refundOrderPayRepository.updateRefundState(refundOrderPayDO);
RefundOrderStateEnum refundOrderStateEnum =refundOrderInfoService.getRefundOrderStateByPay(refundOrderPayDO.getEntId(), refundOrderPayDO.getStoreCode(), refundOrderPayDO.getRefundOrderUid());
refundOrderInfoRepository.updateRefundOrderState(refundOrderPayDO.getEntId(), refundOrderPayDO.getStoreCode(), refundOrderPayDO.getRefundOrderUid(), refundOrderStateEnum.getStateCode());
}catch (Exception e) {
log.info("PayStateService:", e);
}
}
}