利用延迟队列反复调用查询接口。
执行策略:
选择支付渠道后,点击支付后提交到延迟队列,每隔一分钟执行一次查询操作,查询三次。
首先在消息队列中打开延迟队列配置:在activemq的conf目录下activemq.xml中
![](https://img-blog.csdnimg.cn/img_convert/c8ceab53f04d79fa0e677d70373104c9.png)
开启 schedulerSupport=”true”
发送延迟队列
public void sendDelayPaymentResult(String outTradeNo,int delaySec,int checkCount){ //发送支付结果 Connection connection = activeMQUtil.getConnection(); try { connection.start(); Session session = connection.createSession(true, Session.SESSION_TRANSACTED); Queue paymentResultQueue = session.createQueue(“PAYMENT_RESULT_CHECK_QUEUE”); MessageProducer producer = session.createProducer(paymentResultQueue); producer.setDeliveryMode(DeliveryMode.PERSISTENT); MapMessage mapMessage= new ActiveMQMapMessage(); mapMessage.setString(“outTradeNo”,outTradeNo); mapMessage.setInt(“delaySec”,delaySec); mapMessage.setInt(“checkCount”,checkCount); mapMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY,delaySec*1000); producer.send(mapMessage); session.commit(); producer.close(); session.close(); connection.close(); } catch (JMSException e) { e.printStackTrace(); } } |
接收延迟队列的消费端
@Component public class PaymentConsumer { @Autowired PaymentService paymentService; @JmsListener(destination = “PAYMENT_RESULT_CHECK_QUEUE”,containerFactory = “jmsQueueListener”) public void consumeCheckResult(MapMessage mapMessage) throws JMSException { int delaySec = mapMessage.getInt(“delaySec”); String outTradeNo = mapMessage.getString(“outTradeNo”); int checkCount = mapMessage.getInt(“checkCount”); PaymentInfo paymentInfo=new PaymentInfo(); paymentInfo.setOutTradeNo(outTradeNo); PaymentStatus paymentStatus = paymentService.checkAlipayPayment(paymentInfo); if(paymentStatus==PaymentStatus.UNPAID&&checkCount>0){ System.out.println(“checkCount = ” + checkCount); paymentService.sendDelayPaymentResult(outTradeNo,delaySec,checkCount-1); } } } |