当前位置: 首页 > news >正文

网贷网站开发近几天的新闻摘抄

网贷网站开发,近几天的新闻摘抄,html5移动网站开发流程,wordpress点赞数修改Java实现订单超时未支付自动取消的8种方法总结 定时轮询 数据库定时轮询方式#xff0c;实现思路比较简单。启动一个定时任务#xff0c;每隔一定时间扫描订单表#xff0c;查询到超时订单就取消。优点#xff1a;实现简单。缺点#xff1a;轮询时间间隔不好确定#x…Java实现订单超时未支付自动取消的8种方法总结 定时轮询 数据库定时轮询方式实现思路比较简单。启动一个定时任务每隔一定时间扫描订单表查询到超时订单就取消。优点实现简单。缺点轮询时间间隔不好确定占用服务器资源影响数据库性能。 惰性取消 当查询订单信息时先判断该订单是否超时如果超时就先取消。优点实现简单。缺点影响查询之外的业务如统计、库存影响查询效率。 JDK延迟队列 JDK延时队列DelayQueue是一个无界阻塞队列该队列只有在延迟期满的时候才能从中获取元素。 简单实现代码demo如下实际生产过程中会有专门的线程负责消息的入队与消费。 import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit;public class OrderDelayed implements Delayed {/*** 延迟时间*/private final Long time;/*** 订单编号*/public String orderNo;public OrderDelayed(String orderNo, long time, TimeUnit unit) {this.orderNo orderNo;this.time System.currentTimeMillis() (time 0 ? unit.toMillis(time) : 0);}Overridepublic long getDelay(TimeUnit unit) {return time - System.currentTimeMillis();}Overridepublic int compareTo(Delayed o) {OrderDelayed orderDelayed (OrderDelayed) o;long diff this.time - orderDelayed.time;if (diff 0) {return -1;} else {return 1;}} }import java.util.concurrent.DelayQueue; import java.util.concurrent.TimeUnit;public class Test {public static void main(String[] args) {DelayQueueOrderDelayed delayQueue new DelayQueue();delayQueue.put(new OrderDelayed(220101001, 8, TimeUnit.SECONDS));delayQueue.put(new OrderDelayed(220101002, 4, TimeUnit.SECONDS));System.out.println(订单延迟队列开始执行);while (true) {// 取队列头部元素是否过期OrderDelayed task delayQueue.poll();if (task ! null) {// 取消订单业务逻辑System.out.println(订单 --- task.orderNo 已过期准备取消);}}} }优点效率高任务触发时间延迟低。 缺点异常恢复困难集群扩展麻烦内存占用。 时间轮 时间轮算法类似于时钟会按某一个方向按固定频率轮动。可以用Netty的HashedWheelTimer来实现时间轮方法。 dependencygroupIdio.netty/groupIdartifactIdnetty-all/artifactIdversion4.1.78.Final/version /dependencyimport io.netty.util.HashedWheelTimer; import io.netty.util.Timeout; import io.netty.util.Timer; import io.netty.util.TimerTask;import java.util.concurrent.TimeUnit;public class Test {public static void main(String[] args) {// 初始化时间轮Timer timer new HashedWheelTimer();// 定时任务TimerTask task1 new TimerTask() {public void run(Timeout timeout) throws Exception {// 取消订单业务逻辑System.out.println(订单1已过期准备取消);}};// 注册此定时任务延迟时间为5秒也就是说5秒后订单过期timer.newTimeout(task1, 5, TimeUnit.SECONDS);// 定时任务TimerTask task2 new TimerTask() {public void run(Timeout timeout) throws Exception {// 取消订单业务逻辑System.out.println(订单2已过期准备取消);}};// 注册此定时任务延迟时间为3秒也就是说3秒后订单过期timer.newTimeout(task2, 3, TimeUnit.SECONDS);} }优点效率高任务触发时间延迟更低。 缺点异常恢复困难集群扩展麻烦内存占用。 Redis过期回调 Redis的key过期回调事件也能达到延迟队列的效果。 在redis.conf加入一条配置 notify-keyspace-events Ex监听配置 Configuration public class RedisListenerConfig {BeanRedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);return container;} }Redis过期回调监听方法 Component public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}Overridepublic void onMessage(Message message, byte[] pattern) {// 过期key可以设置成订单号String expiredKey message.toString();// 取消订单业务逻辑System.out.println(订单 --- expiredKey 已过期准备取消);} }优点数据不易丢失集群扩展方便。 缺点需要额外维护redis。 Redis有序集合 Redis的数据结构Zset同样可以实现延迟队列的效果主要利用它的score属性redis通过score来为集合中的成员进行从小到大的排序。通过zadd命令向队列delayqueue 中添加元素并设置score值表示元素过期的时间。 消费端轮询队列delayqueue 将元素排序后取最小时间与当前时间比对如小于当前时间代表已经过期移除key。 public void pollOrderQueue() {while (true) {SetTuple set jedis.zrangeWithScores(delayqueue, 0, 0);String value ((Tuple) set.toArray()[0]).getElement();int score (int) ((Tuple) set.toArray()[0]).getScore();int nowSecond System.currentTimeMillis() / 1000);if (nowSecond score) {jedis.zrem(delayqueue, value);System.out.println(sdf.format(new Date()) removed key: value);}if (jedis.zcard(delayqueue) 0) {System.out.println(sdf.format(new Date()) zset empty );return;}Thread.sleep(1000);} }优点数据不易丢失集群扩展方便。\ 缺点可能重复消费同一key。 任务调度 使用任务调度中间件xxl-job、ScheduleX、Elastic-Job等来实现设置一个调度时间cron到达订单过期的调度时间时触发任务执行取消订单业务逻辑。 例如使用xxl-job实现订单创建时提交一个过期任务到xxl-job服务器下面时执行器方法 import com.xxl.job.core.handler.annotation.XxlJob; import org.springframework.stereotype.Component;Component public class JobHandler {XxlJob(payExpireJobHandler)public void payExpireJobHandler(String executorParam) {// 取消订单业务逻辑System.out.println(订单 --- executorParam 已过期准备取消);} }优点时效性强支持分布式。 缺点实现复杂维护成本高。 消息队列 使用RocketMQ、RabbitMQ、Kafka的延时消息消息在发送到消息队列服务端后并不会立马投递而是根据消息中的属性延迟固定时间后才投递给消费者。 RocketMQ发送延时消息的示例代码如下 import com.aliyun.openservices.ons.api.Message; import com.aliyun.openservices.ons.api.ONSFactory; import com.aliyun.openservices.ons.api.Producer; import com.aliyun.openservices.ons.api.PropertyKeyConst; import com.aliyun.openservices.ons.api.SendResult; import java.util.Properties;public class Test {public static void main(String[] args) {Properties properties new Properties();// AccessKey ID阿里云身份验证在阿里云RAM控制台创建。properties.put(PropertyKeyConst.AccessKey, XXX);// AccessKey Secret阿里云身份验证在阿里云RAM控制台创建。properties.put(PropertyKeyConst.SecretKey, XXX);// 设置TCP接入域名进入消息队列RocketMQ版控制台实例详情页面的接入点区域查看。properties.put(PropertyKeyConst.NAMESRV_ADDR,XXX);Producer producer ONSFactory.createProducer(properties);// 在发送消息前必须调用start方法来启动Producer只需调用一次即可。producer.start();Message msg new Message( // 您在消息队列RocketMQ版控制台创建的Topic。Topic,// Message Tag,可理解为Gmail中的标签对消息进行再归类方便Consumer指定过滤条件在消息队列RocketMQ版服务器过滤。tag,// Message Body可以是任何二进制形式的数据消息队列RocketMQ版不做任何干预需要Producer与Consumer协商好一致的序列化和反序列化方式。Hello MQ.getBytes());// 设置代表消息的业务关键属性请尽可能全局唯一。// 以方便您在无法正常收到消息情况下可通过控制台查询消息并补发。// 注意不设置也不会影响消息正常收发。msg.setKey(ORDERID_100);try {// 延时消息在指定延迟时间当前时间之后进行投递。最大可设置延迟40天投递单位毫秒ms。// 以下示例表示消息在3秒后投递。long delayTime System.currentTimeMillis() 3000;// 设置消息需要被投递的时间。msg.setStartDeliverTime(delayTime);SendResult sendResult producer.send(msg);// 同步发送消息只要不抛异常就是成功。if (sendResult ! null) {System.out.println(new Date() Send mq message success. Topic is: msg.getTopic() msgId is: sendResult.getMessageId());}} catch (Exception e) {// 消息发送失败需要进行重试处理可重新发送这条消息或持久化这条数据进行补偿处理。System.out.println(new Date() Send mq message failed. Topic is: msg.getTopic());e.printStackTrace();}// 在应用退出前销毁Producer对象。// 注意如果不销毁也没有问题。producer.shutdown();} } RocketMQ延时消息的订阅与普通消息订阅一致。 优点高效好扩展支持分布式。 缺点实现复杂维护成本高。
http://www.yutouwan.com/news/269267/

相关文章:

  • 常德地区网站建设可以用vs做网站建设吗
  • 网站怎做百度代码统计wordpress和微信公众号互通
  • 网站做业务赚钱特网站建设
  • 温州网站建设服务中心洛阳恒凯做的网站有哪些
  • 网站换空间商什么意思wordpress single 主题
  • 兰州网站定制公司梅州基建
  • 企业品牌网站营销做网站开发要注册
  • 经过学习网站开发后的心得体会网站建设哪里比较好
  • 写网站的教程wordpress网站怎么设置关键词
  • 书生网站找网站设计公司 看那些
  • 大型网站建设优化企业制作一款app需要多少钱
  • ppt模板网站排行网站建设方案200字
  • wordpress改图片aso安卓优化
  • 文章网站建设wordpress商城 淘宝客
  • 网站个人中心设计软件定制化开发公司
  • 宿迁市建设局网站首页文山专业网站建设报价
  • 建设网站的技术方案八桂云网站建设
  • 图片网站制作网站注册手机号安全吗
  • 做瞹瞹瞹免费网站哪个建设网站好
  • 在excel表里做网站模板室内设计联盟课堂
  • 手机网站设计只找亿企邦动画制作平台
  • 深圳建站公司推荐天津市网站建设
  • 宁夏做网站建设公司常德网站seo
  • 网站端网站开发凡科网微信小程序制作
  • 常州专门做网站的公司有哪些四川seo哪里有
  • seo网站优化推广网站离线浏览器 怎么做
  • 家电网站首页制作网站建设 贴吧
  • 网站域名到期怎么续费个人怎么建立微信公众号
  • 做网站老板嫌弃太丑谁的锅物流网站建设方案
  • 重庆网站建设开发公司大学生网站建设例题答案