Future 异步多线程
进来接手一个任务,需要做异步多线程数据源调用,数据源的配置和使用请阅读相关文章:
https://www.cnblogs.com/haoliyou/p/9604452.html
配置好数据源后,实质上其实就是需要做一个异步的调用查询
@Resource
private LoginTask loginTask; @Override
public JSONObject getLoginResult(String username, String password) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("ret", "-1");
jsonObject.put("msg", "用户名或密码错误");
Future<JSONObject> cmFutureTask = loginTask.handleCmLogin(jsonObject, username, password);
Future<JSONObject> csFutureTask = loginTask.handleCsLogin(jsonObject, username, password);
JSONObject taskJson = new JSONObject();
int count = 0;
while (count < LoginConstants.TASK_REQUEST_LIMIT) {
try {
if (cmFutureTask.isDone()) {
taskJson = cmFutureTask.get(LoginConstants.TASK_RESULT_LIMIT, TimeUnit.SECONDS);
if (StringUtils.equals(taskJson.getString("ret"), "0")) {
csFutureTask.cancel(true);
jsonObject = taskJson;
break;
}
}
if (cbsFutureTask.isDone()) {
taskJson = csFutureTask.get(LoginConstants.TASK_RESULT_LIMIT, TimeUnit.SECONDS);
if (StringUtils.equals(taskJson.getString("ret"), "0")) {
cmFutureTask.cancel(true);
jsonObject = taskJson;
break;
}
}
if (cmFutureTask.isDone() && csFutureTask.isDone()) {
if (checkAdUser(username, password)) {
jsonObject.put("ret", "0");
jsonObject.put("msg", "登录成功!");
break;
}
}
count++;
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
return jsonObject;
}
@Component
public class LoginTask { private static final Logger log = LoggerFactory.getLogger(LoginTask.class); @Resource
private UserInfoMapper userInfoMapper; @Resource
private UserMapper userMapper; /**
* 处理发起的请求
*
* @param request
* @param requestHeaders
* @param result
* @param jsonObject
* @param loginInfo
* @return
*/
@Async("taskExecutor")
public Future<JSONObject> handleCmLogin(JSONObject jsonObject, String username, String password) {
UserInfo userInfo = userInfoMapper.selectByUserId(username);
if (userInfo == null) {
jsonObject.put("ret", "20003");
jsonObject.put("msg", "抱歉,目前仅支持xxxxx账号登录");
return new AsyncResult<JSONObject>(jsonObject);
} else if (!password.equals(userInfo.getPassword())) {
log.info(userInfo.getUserName());
jsonObject.put("ret", "20002");
jsonObject.put("msg", "登录失败,请确认用户名和密码是否正确");
return new AsyncResult<JSONObject>(jsonObject);
}
jsonObject.put("data", userInfo);
jsonObject.put("ret", "0");
jsonObject.put("msg", "success");
log.info(userInfo.toString());
return new AsyncResult<JSONObject>(jsonObject);
} /**
* 处理的请求
*
* @param result
* @param requestHeaders
* @param jsonObject
* @param loginInfo
* @return
*/
@Async("taskExecutor")
public Future<JSONObject> handleCsLogin(JSONObject jsonObject, String username, String password) {
User user = userMapper.selectByUserId(username, password);
if (user == null) {
jsonObject.put("ret", "20002");
jsonObject.put("msg", "登录失败,请确认用户名和密码是否正确");
return new AsyncResult<JSONObject>(jsonObject);
}
log.info(user.toString());
jsonObject.put("data", user);
jsonObject.put("ret", "0");
jsonObject.put("msg", "success");
return new AsyncResult<JSONObject>(jsonObject);
}
}
Future 异步多线程的更多相关文章
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
c#中@标志的作用 参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...
- Future 异步回调 大起底之 Java Future 与 Guava Future
目录 写在前面 1. Future模式异步回调大起底 1.1. 从泡茶的案例说起 1.2. 何为异步回调 1.2.1. 同步.异步.阻塞.非阻塞 1.2.2. 阻塞模式的泡茶案例图解 1.2.3. 回 ...
- 初学Python之异步多线程:sockserver
异步多线程:服务端 import socketserver class MyServer(socketserver.BaseRequestHandler): def setup(self): pass ...
- .NET 异步多线程,Thread,ThreadPool,Task,Parallel,异常处理,线程取消
今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主,毕竟用的比较多的现在就是这些了,再往前去的,除非是老项目,不然真的应该是挺少了,大概有个概念,就当了解一 ...
- 异步多线程 Async
进程:进程是一个程序在电脑运行时,全部资源的合集叫进程 线程:是程序的最小执行单位,包含计算资源,任何一个操作的响应都是线程完成的. 多线程:多个线程并发执行 Thread 是.net框架封装 ...
- PowerShell 中 RunspacePool 执行异步多线程任务
在 PowerShell 中要执行任务脚本,现在通常使用 Runspace,效率很高:任务比较多时,用 Runspace pool 来执行异步操作,可以控制资源池数量,就像 C# 中的线程池一样 == ...
- .Net进阶系列(11)-异步多线程(委托BeginInvoke)(被替换)
一. BeginInvoke最后两个参数的含义 倒数第二个参数:指该线程执行完毕后的回调函数:倒数第一个参数:可以向回调函数中传递参数. 下面以一段代码说明: /// <summary> ...
- .Net进阶系列(10)-异步多线程综述(被替换)
一. 综述 经过两个多个周的整理,异步多线程章节终于整理完成,如下图所示,主要从基本概念.委托的异步调用.Thread多线程.ThreadPool多线程.Task.Parallel并行计算.async ...
- NET 异步多线程,THREAD,THREADPOOL,TASK,PARALLEL
.NET 异步多线程,THREAD,THREADPOOL,TASK,PARALLEL,异常处理,线程取消 今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主 ...
随机推荐
- c#学习笔记05——数组&集合
数组 声明数组 .一维数组的定义: 数据类型[] 数组名=new 数据类型[大小]; eg: ]; ,,,,}; ]; .多维数组的定义 ,];//定义二维数组 ,,];//定义三维数组 多维数组可以 ...
- dfs+剪枝 poj1011
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 113547 Accepted: 26078 问题描述 Ge ...
- Django搭建后篇——启动服务器及创建视图
开启服务器,Django开启服务器的方式有两种,一种是在Ubuntu在开启,另一种是直接在pycharm开启.就方便而言肯定是第二种,但由于pycharm版本的问题,可能有的人无法直接在pycharm ...
- Tooltips
#include<windows.h> #include<Commctrl.h> #include"resource.h" #pragma comment( ...
- visual studio2019下静态链接库的制作
创建静态库项目 项目名称为20199324lib // pch.h #ifndef __PCH__ #define __PCH__ extern int add(int a, int b);//ext ...
- Java字符串替换函数replace、replaceFirst、replaceAll
一.replace(String old,String new) 功能:将字符串中的所有old子字符串替换成new字符串 示例 String s="Hollow world!"; ...
- Web 手工测试
day 1 学习目标: 熟练搭建本地测试环境 掌握熟悉项目的步骤和内容 掌握项目基本的测试流程 基础环境介绍: 项目环境的组成部分: 操作系统 windows win7 win10 Linux Cen ...
- 安卓ButtomBar实现方法
这里ButtomBar有3个items,分别有icon和文字,在当前fragment时,所属的icon和文字会显示不同颜色. 1. 首先要准好ICON素材,命名规范要清楚. 2. 实现这个Buttom ...
- HttpServletReqeust、HttpServletResponse
HttpServletRequest:一次来自客户端的请求的相关信息 请求行 request.getMethod() 获取http请求方式 request.getR ...
- 系统学习Javaweb8----JavaScript4(结束)
学习内容: 1.DOM对象 1.2DOM对象--元素对象常见属性 2.JS事件 2.1JS事件--入门案例 2.2JS事件--驱动机制 2.3常见JS事件--点击事件 2.4常见JS事件--点击事件 ...