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#学习笔记01——引用&类
数据类型 值类型 bool 布尔值 True 或 False False byte 8 位无符号整数 0 到 255 0 char 16 位 Unicode 字符 U +0000 到 U +ffff ...
- keras猫狗大战
先划分数据集程序训练集中猫狗各12500张现在提取1000张做为训练集,500张作为测试集,500张作为验证集: # -*- coding: utf-8 -*-import os, shutil or ...
- MySQL--mysqldump(数据导出工具)
mysqldump 客户端工具用来备份数据库或在不同数据库之间进行数据迁移.备份内容包含创建表或装载表的 SQL 语句.mysqldump 目前是 MySQL 中最常用的备份工具. 有 3 种方式来调 ...
- mysql 获取数据库和表结构信息
SELECT * FROM information_schema.`TABLES` where TABLE_SCHEMA = '数据库名';SELECT * FROM information_sche ...
- remove_if 的效率测试
#include <iostream> #include <functional> #include <vector> #include <algorithm ...
- python_数据类型_总结
- oracle_(第三课)网络服务配置
1.打开Net Manager 2.开始配置 3.检测 4.SQL Developer 检测 新创数据库连接,连接类型选择 TNS ,若在网络别名中能看到MYORCL,则证明你成功了
- 数据结构与算法——认识O(NlogN)的排序(2)
输入整型数组和排序标识,对其元素按照升序或降序进行排序 (一组测试用例可能会有多组数据) 接口说明 原型: void sortIntegerArray(Integer[] pIntegerArray, ...
- 37)PHP,获取数据库值并在html中显示(晋级2)
下面的是上一个的改进版,我知道为啥我的那个有问题了,因为我的__construct()这个函数的里面的那个变量名字搞错了,哎,这是经常犯得毛病,傻了吧唧,气死我了. 之前的那个变量的代码样子: cla ...
- 使用 Wintersmith + Serverless Framework 快速创建个人站点
首先我们来介绍下,Wintersmith 是一个简单而灵活的静态站点生成器.采用 markdown 构建,这个是我们的基础条件. Serverless Framework:在 GitHub 上有三万颗 ...