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

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

思路

配置一个监听器在项目启动时初始化一个队列,开一个线程(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;

    @Override
    public 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;
    }

    @Override
    public Object getLock() {
        return MyTask.CASH_STATUS;
    }
}
时间: 2024-10-24 17:22:10

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

电商支付,打赏支付,钱包充值提现的原型模板都在这儿了!可直接使用!

在几年前,在国外,看到老外出门只需要带一张信用卡,就可!做梦也想不到,几年后的现在,在中国,出门只需要带一部智能手机就dei!这样的便捷离不开移动互联网和各种电商类.社交类等产品的支付功能的支持. 对现在很多app来说,“支付”是其盈利的关键一环.一个便捷的[支付页面]更能支持资金滚滚来~ 本文整理了不同企业正在使用的电商支付,打赏支付,钱包充值提现功能页面的原型模板,都在这里啦!直接复用吧! 原型模板介绍 小红书app中的[订单支付-支付宝]页面,其中包括“商品详情”.“支付方式”和“收货时间

多线程队列下载天涯帖子

版本一: #coding:utf-8 import Queue import threading import time import urllib2 import re exitFlag = 0 class myThread (threading.Thread): def __init__(self, threadID, name, q, txt_dict): threading.Thread.__init__(self) self.threadID = threadID self.name

payoneer注册充值提现海外收款费用官方解答

从事海外贸易的朋友,会发现收款是一大难题.Paypal是老牌支付平台,但费率高昂.其实,Payoneer是新兴的收款工具,非常适合做外贸的卖家使用,提现灵活,费率低,免费注册账号后,可直接获得美国.英国等国家的银行账户使用. 官方网站:www.payoneer.com 相关教程: Payoneer官网注册教程,免费申请美国银行账号,轻松赚25美元 Payoneer充值转账教程,如何赚取25美金? Paypal不能添加payoneer账号,Paypal提现15美元手续费优惠 Q:我注册payone

JAVA-初步认识-第十三章-单例模式涉及的多线程问题

一. 单例设计模式之前在谈论的时候,有一部分涉及线程的问题,因此只讲述了一半.现在将其重新描述一下. 单例分为两种表现形式,懒汉和饿汉. 二. 多线程下的单例:饿汉式 懒汉式(延迟加载单例设计模式) 什么时候用到这个对象,再加载它.这个例子并不准备运行,知道就可以. 现在准备将其结合到多线程基础上来,来思考另外一部分内容,叫在多线程情况下,有没有安全隐患. 如果上图的getInstance()方法加入到run方法当中,意味着它将被多线程所执行.多线程执行的时候,涉及到了共享数据(return s

python之多线程队列

# 一共有以下3种队列# 1.先进先出# 2.后进先出# 3.存储数据的时候可设置优先级的队列,设置不同的优先级,取的时候按照优先级的顺序来取 下面介绍一下队列的方法,如果要使用队列,则需要导入一个模块queue import queue q = queue.Queue(maxsize=3) #创建一个队列的实例,该是对象的size是3 # q.get() #从队列中获取值,如果队列中没有值,则会一直阻塞 # q.qsize() #获取队列的size # q.get(timeout=3) #c从

JAVA学习第二十五课(多线程(四))- 单例设计模式涉及的多线程问题

一.多线程下的单例设计模式 利用双重判断的形式解决懒汉式的安全问题和效率问题 //饿汉式 /*class Single { private static final Single t = new Single(); private Single(){} public static Single getInstance() { return t; } } */ //懒汉式 class Single { private static Single t = null; private Single()

python多线程队列使用

#线程1 -> 队列 -> 线程2 -> url_web # # # #!/usr/bin/env python #! coding=utf-8 #!by=xiaohe import Queue,threading,time,random from moniItems import mon import urllib2 from flask import Flask,request,json queueLock = threading.Lock() class t1(threading.

c语言多线程队列读写

最近用c语言写了个简单的队列服务,记录一下,文件结构为 main.c queue.c queue.h,代码如下: 主函数 #define NUM_THREADS 200 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <queue.h> #include <pthread.h> #include <sys/time.h> #include <

wlpt的提现功能

1.<transaction id="WithdrawPre" template="pageLoaderTemplate"> <actions> <ref name="action">WithdrawAction</ref> </actions> <channels> <channel type="http"> <param name=&