DelayQueue 订单限时支付实例
1.订单实体
package com.zy.entity; import java.util.Date;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit; public class Order implements Delayed { String id;
String name;// 订单名称
Date creatTime;// 创建时间
int seconds; // 有效期n秒
Date endTime;// 过期时间 public Order(String id, String name, Date creatTime, int seconds) {
super();
this.id = id;
this.name = name;
this.creatTime = creatTime;
this.seconds = seconds;
this.endTime = new Date(creatTime.getTime() + seconds * 1000);// 过期时间
} // 排序(插入时根据这个方法排序)
@Override
public int compareTo(Delayed o) {
Order order = (Order) o;
return this.seconds - order.seconds > 0 ? 1 : (this.seconds - order.seconds < 0 ? -1 : 0);
} // 激活日期的剩余时间,时间单位由单位参数指定
@Override
public long getDelay(TimeUnit unit) {
long l = this.getEndTime().getTime() - System.currentTimeMillis();
return unit.convert(l,TimeUnit.MILLISECONDS);
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Date getCreatTime() {
return creatTime;
} public void setCreatTime(Date creatTime) {
this.creatTime = creatTime;
} public int getSeconds() {
return seconds;
} public void setSeconds(int seconds) {
this.seconds = seconds;
} public Date getEndTime() {
return endTime;
} public void setEndTime(Date endTime) {
this.endTime = endTime;
} }
2.下订单
package com.zy.service; import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Stack;
import java.util.concurrent.DelayQueue; import com.zy.entity.Order; public class OrderService implements Runnable {
// delay队列(先进先出)
DelayQueue<Order> queue = new DelayQueue<Order>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 添加订单(向队列中添加数据)
public void insertOder(Order order) {
System.out.println("向队列中添加订单(" + order.getName() + ")。。。。添加时间(" + sdf.format(order.getCreatTime()) + ")。。。。。"
+ "过期时间:" + sdf.format(order.getEndTime()));
queue.put(order);
} // 订单过期时间
@Override
public void run() {
while (true) {
System.out.println("检查");
try {
Order order = queue.take();// 当队列取出为空时,线程堵塞
if (order != null) {
System.out.println(order.getName() + "订单支付时间过期" + sdf.format(new Date()));
} else {
System.out.println("无过期订单");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) throws InterruptedException {
// 启动线程
OrderService orderService = new OrderService();
new Thread(orderService).start();
// 项队列中添加数据
Order order1 = new Order("1", "订单一", new Date(), 50);
Order order2 = new Order("2", "订单2", new Date(), 30);
Order order3 = new Order("1", "订单3", new Date(), 40);
orderService.insertOder(order1);
orderService.insertOder(order2);
orderService.insertOder(order3);
Thread.currentThread().sleep(35000);
Order order4 = new Order("4", "订单4", new Date(), 10);
orderService.insertOder(order4); }
}
3:结果
DelayQueue 订单限时支付实例的更多相关文章
- PHP原生代码写的微信扫码支付实例
一款PHP原生代码写的微信扫码支付,不基于任何框架,完全手写. 扫码支付只要授权域名对就OK,本地是无法测试.跟openid也没有关系,所以跟支付授权目录页没关系. 微信商户信息配置地址:weixin ...
- Java 编程 订单、支付、退款、发货、退货等编号主动生成类
订单.支付.退款.发货.退货等编号主动生成类 在商城网站中,订单编号的自动生成,ERP中各个单据的编号自动生成,都可以按照一下的方式来自动生成. 第一步:定义常量订单编号前缀.订单编号起始数.订单编号 ...
- html5手机浏览器启动微信客户端支付实例
html5手机浏览器启动微信客户端支付实例,外部浏览器html5微信支付技术,如何在手机浏览器微信支付,在微信客户端外的移动端网页使用微信支付 首先在微信支付官网https://pay.weixin. ...
- 苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功
苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功 这是苹果wwdc2021 推出的新功能 参考官网链接 App Store Server API | Apple Deve ...
- Java 实现订单未支付超时自动取消
在电商上购买商品后,如果在下单而又没有支付的情况下,一般提示30分钟完成支付,否则订单自动.比如在京东下单为完成支付: 超过24小时,就会自动取消订单,下面使用 Java 定时器实现超时取消订单功能. ...
- 微信支付之01------获取订单微信支付二维码的接口------Java实现
[ 前言:以前写过一个获取微信二维码支付的接口,发现最近公司新开的项目会经常用到,现在我又翻出代码看了一遍,觉得还是把整个代码流程记下来的好 ] 借鉴博客: 他这篇博客写得不错,挺全的:https:/ ...
- Orchard模块开发全接触7:订单与支付之Event Bus
在这部分,我们要完成的工作有: 1:将购物车内的商品变成真正的订单: 2:理解 父子及一对多关系: 3:写一个针对 Event Bus 的扩展点: 4:实现一个针对该扩展点的模拟的 支付服务: 一:创 ...
- 多线程demo,订单重复支付
背景描述,一个商城网站,一个订单支付方案有多个1.金额支付2.积分支付3.工资支付(分期和全额),所以一个订单的方案可能有1:有1.2,或1.2.3 状态,1.订单状态,2,支付状态==>多方案 ...
- PHP浮点数运算精度造成的,订单金额支付经常少1分的问题
最近碰见一个奇怪的问题,商城通过微信支付的订单经常少一分钱,经过排查是PHP浮点运算精度问题造成的 由PHP浮点数运算精度造成的,鸟哥的Bolg有详细的说明.http://www.laruence.c ...
随机推荐
- 记录一次向TiDB数据库导入数据的例子
导出数据 今天从Mysql的某个库中导出一个表大概有20分钟吧,等了一会终于导出成功了.查看一下文件的大小: [tidb@:vg_adn_CkhsTest ~]$du -h ./creative_ou ...
- Beta阶段第三次冲刺
Beta阶段第三次冲刺 严格按照Git标准来,组员有上传Git的才有贡献分没有的为0 代码签入图 1.part1 -站立式会议照片 2.part2 -项目燃尽图 3.part3 -项目进展 1.正在进 ...
- React-Native开发笔记 持续更新
1.css单位转换px2dp 在做页面开发的时候习惯了用rem去做css单位,处理各种尺寸数据,到了React-Native里面做app开发时,rem就不好用了,这个时候就需要转换成另外一个单位,基本 ...
- Atcoder 水题选做
为什么是水题选做呢?因为我只会水题啊 ( 为什么是$Atcoder$呢?因为暑假学长来讲课的时候讲了三件事:不要用洛谷,不要用dev-c++,不要用单步调试.$bzoj$太难了,$Topcoder$整 ...
- ERC 725 and ERC 735 的实现及关系
https://github.com/OriginProtocol/origin-playground 通过ERC 725 and ERC 735 的实现来说明它们到底是做什么的: 看了这个例子后才大 ...
- ethereumjs/ethereumjs-util
ethereumjs/ethereumjs-util Most of the string manipulation methods are provided by ethjs-util 更多的字符串 ...
- uniform_tree以及其变体
//判断一棵树是不是uniform-tree bool uniform_tree(TreeNode* root){ if(root == NULL) return true; return unifo ...
- CSS3页面布局方案
CSS3页面布局方案 Web页面中的布局,在css3之前,主要使用float属性或者position属性进行页面中的简单布局,但是使用它们也存在一些缺点,比如两栏或者多栏中如果元素的内容高度不一致,则 ...
- JAVA框架 Spring AOP底层原理
一:AOP(Aspect Oriented Programming)面向切面编程. 底层实现原理是java的动态代理:1.jdk的动态代理.2.spring的cglib代理. jdk的动态代理需要被代 ...
- 重写Override和重加载Overload
1.方法的重写规则 参数列表必须完全与被重写方法的相同: 返回类型必须完全与被重写方法的返回类型相同: 访问权限不能比父类中被重写的方法的访问权限更低.例如:如果父类的一个方法被声明为public,那 ...
