充值,提现功能涉及的多线程、队列问题

使用双乾第三方实现充值,提现功能。

思路

配置一个监听器在项目启动时初始化一个队列,开一个线程(run方法中检查队列中是否有值,有的话执行业务,没有的话线程等待)。充值,提现成功后回调方法时,填充队列,唤醒等待线程执行业务方法。

实现

web.xml中配置一个监听器

<listener>
  <listener-class>com.wjz.listener.MyWebConfigContextListener</listener-class> </listener>

MyWebConfigContextListener监听器

package com.wjz.listener;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;import com.wjz.queue.MyCashJobQueue;
import com.wjz.service.MyAccountService;
import com.wjz.service.MyUserService;public class MyWebConfigContextListener implements ServletContextListener {public void contextInitialized(ServletContextEvent sce) {ServletContext servletContext = sce.getServletContext();ApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);MyUserService userService = (MyUserService) context.getBean("userService");MyAccountService accountService = (MyAccountService) context.getBean("accountService");//初始化业务处理队列
        MyCashJobQueue.init(userService, accountService);}
}

MyCashJobQueue功能队列

package com.wjz.queue;import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;import com.wjz.model.MyCashModel;
import com.wjz.service.MyAccountService;
import com.wjz.service.MyUserService;
import com.wjz.task.MyTask;
import com.wjz.task.impl.MyCashTask;/*** @author wjz*/
public class MyCashJobQueue<T> {@SuppressWarnings({ "rawtypes", "unchecked" })private Queue<T> queue = new ConcurrentLinkedQueue();private MyTask task;public MyCashJobQueue(MyTask task) {this.task = task;}public static MyCashJobQueue<MyCashModel> CASH_QUEUE = null;
   // 初始化一个任务对象注入到功能队列中,任务对象开线程
public static void init(MyUserService userService, MyAccountService accountService) {CASH_QUEUE = new MyCashJobQueue<MyCashModel>(new MyCashTask(userService, accountService));}public int size() {return queue.size();}public synchronized T peek() {return (T) queue.peek();}public synchronized T remove(T model) {return queue.remove();}// 向队列中填充值,唤醒等待线程
   // 同步MyCashJobQueue的实例对象
public synchronized void offer(T model) {if (!queue.contains(model)) {queue.offer(model);
        // 同步内容
synchronized (task.getLock()) {task.execute();}}} }

MyTask任务接口

package com.wjz.task;public interface MyTask {public static final String CASH_STATUS = "cash_status";public void execute();public void doRun();public void doWait();public void stop();public Object getLock();}

充值,提现功能实现类

package com.wjz.task.impl;import com.wjz.model.MyCashModel;
import com.wjz.queue.MyCashJobQueue;
import com.wjz.service.MyAccountService;
import com.wjz.service.MyUserService;
import com.wjz.task.MyAbstractTask;
import com.wjz.task.MyTask;public class MyCashTask extends MyAbstractTask {private MyUserService userService;private MyAccountService accountService;@Overridepublic void doRun() {while (MyCashJobQueue.CASH_QUEUE != null && MyCashJobQueue.CASH_QUEUE.size() > 0) {// 取出队列中的任务MyCashModel cashModel = MyCashJobQueue.CASH_QUEUE.peek();try {if (cashModel != null) {// 业务处理
                    accountService.doRechargeTask();}} catch (Exception e) {} finally {// 去除队列中的任务
                MyCashJobQueue.CASH_QUEUE.remove(cashModel); } }}public MyCashTask(MyUserService userService, MyAccountService accountService) {super();this.userService = userService;this.accountService = accountService;}@Overridepublic Object getLock() {return MyTask.CASH_STATUS;}
}

 

转载于:https://www.cnblogs.com/BINGJJFLY/p/7476288.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-18359.html

如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网进行投诉反馈,一经查实,立即删除!


相关文章:

  • 始终显示滚动条
  • 16汇编第十讲完结Call变为函数以及指令的最后讲解
  • 流畅的python和cookbook学习笔记(五)
  • 第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表...
  • Effective Objective-C 的读书笔记
  • Kaldi语料的两种切分/组织方式及其处理
  • Head First设计模式之命令模式
  • 安装debian 9.1后,中文环境下将home目录下文件夹改为对应的英文
  • 加密算法IV的作用
  • SpringBoot 分布式session
  • 9,求整数的二进制中1的个数《剑指offer》
  • FastJson(阿里巴巴)基础
  • struts入门实例
  • 软件工程第二次作业——个人项目
  • C# 5.0 CallerMemberName CallerFilePath CallerLineNumber获取调用方法名称,路径,行号
  • 《结对-航空购票系统-开发环境搭建过程》
  • 20170831_安装软件
  • 寻找Harris、Shi-Tomasi和亚像素角点
  • qemu模拟器下编译运行基于riscv指令集的Linux操作系统
  • C# 文件上传
  • loadrunner要点总结
  • Spark总结1
  • 第一次作业_U201410737 _万学远
  • Eclipse在当前行之上插入一行
  • Android Studio运行程序出现Session ‘app’: Error Launching activity 解决办法
  • Git 分支及bug分支合并
  • C#参数详解
  • C#给图片加文字水印
  • Appium+python自动化17-启动iOS模拟器APP源码案例
  • sql server使用的注意点及优化点 自备
  • JDK编码
  • AssetPostprocessor.OnPreprocessModel
  • dedecms织梦让channelartlist标签支持currentstyle属性
  • 从github下载的项目如何运行??---------本文以vue的项目为例
  • openwrt源码下载移植
  • DC guide ---3
  • [hiho1160] 攻城略地
  • 题目整理0924
  • lumen安装后输出hello world
  • JS--微信浏览器复制到剪贴板实现
  • 网络对抗实验一
  • Vue-cli proxyTable 解决开发环境的跨域问题
  • HIVE基础操作
  • [Python] Different ways to test multiple flags at once in Python
  • vue实现侧边栏手风琴效果
  • js获取元素,窗口的宽度、高度
  • cCupcake---ToFu
  • 在Linux上显示某个进程的线程的几种方式
  • Yii2 upload
  • HDU 2014 - 青年歌手大奖赛_评委会打分