进来接手一个任务,需要做异步多线程数据源调用,数据源的配置和使用请阅读相关文章:

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 异步多线程的更多相关文章

  1. 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 ...

  2. Future 异步回调 大起底之 Java Future 与 Guava Future

    目录 写在前面 1. Future模式异步回调大起底 1.1. 从泡茶的案例说起 1.2. 何为异步回调 1.2.1. 同步.异步.阻塞.非阻塞 1.2.2. 阻塞模式的泡茶案例图解 1.2.3. 回 ...

  3. 初学Python之异步多线程:sockserver

    异步多线程:服务端 import socketserver class MyServer(socketserver.BaseRequestHandler): def setup(self): pass ...

  4. .NET 异步多线程,Thread,ThreadPool,Task,Parallel,异常处理,线程取消

    今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主,毕竟用的比较多的现在就是这些了,再往前去的,除非是老项目,不然真的应该是挺少了,大概有个概念,就当了解一 ...

  5. 异步多线程 Async

    进程:进程是一个程序在电脑运行时,全部资源的合集叫进程 线程:是程序的最小执行单位,包含计算资源,任何一个操作的响应都是线程完成的.   多线程:多个线程并发执行   Thread 是.net框架封装 ...

  6. PowerShell 中 RunspacePool 执行异步多线程任务

    在 PowerShell 中要执行任务脚本,现在通常使用 Runspace,效率很高:任务比较多时,用 Runspace pool 来执行异步操作,可以控制资源池数量,就像 C# 中的线程池一样 == ...

  7. .Net进阶系列(11)-异步多线程(委托BeginInvoke)(被替换)

    一. BeginInvoke最后两个参数的含义 倒数第二个参数:指该线程执行完毕后的回调函数:倒数第一个参数:可以向回调函数中传递参数. 下面以一段代码说明: /// <summary> ...

  8. .Net进阶系列(10)-异步多线程综述(被替换)

    一. 综述 经过两个多个周的整理,异步多线程章节终于整理完成,如下图所示,主要从基本概念.委托的异步调用.Thread多线程.ThreadPool多线程.Task.Parallel并行计算.async ...

  9. NET 异步多线程,THREAD,THREADPOOL,TASK,PARALLEL

    .NET 异步多线程,THREAD,THREADPOOL,TASK,PARALLEL,异常处理,线程取消 今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主 ...

随机推荐

  1. nginx常用模块(一)

    1.Nginx目录索引 1.1Nginx默认是不允许列出整个目录浏览下载.Syntax: autoindex on | off;Default: autoindex off;Context: http ...

  2. 显著水平|区间估计|假设检验|显著性|第一类错误|Ⅱ类错误|β错误|t检验|连续性矫正|二项分布的假设检验|样本百分率|

    第三章 假设检验 区间估计与假设检验的基本区别? 上一章中讨论了置信区间的估计方法.它是利用样本数据,以抽样总体的分布为理论基础,用一定的概率保证来计算出原总体中未知参数的区间范围.特别值得注意的是: ...

  3. 【YOLO学习】召回率(Recall),精确率(Precision),平均正确率(Average_precision(AP) ),交除并(Intersection-over-Union(IoU))

    摘要 在训练YOLO v2的过程中,系统会显示出一些评价训练效果的值,如Recall,IoU等等.为了怕以后忘了,现在把自己对这几种度量方式的理解记录一下. 这一文章首先假设一个测试集,然后围绕这一测 ...

  4. 绝对定位( Absolute positioning )

    绝对定位( Absolute positioning ) 之前在介绍定位体系的时候,已经简单的介绍了绝对定位和固定定位.一般情况下,这两种定位的元素, 在 3D 的可视化模型中,处于浮动元素的上方,或 ...

  5. 使用DataSnap Server环境搭建注意的问题。

    1.Data exploer 的MYSQL文件(Libmysql.dll)放到系统的system32目录即可

  6. C++ malloc()函数的注意点及使用示例

    1.malloc()函数的头文件是stdlib.h,其函数声明如下: void* malloc(size_t size); 其中参数size_t size表示动态内存分配空间的大小,以字节为单位. s ...

  7. Kubernetes系列二: 使用kubeadm安装k8s环境

    环境 三台主机,一台master,两台node 作为master 作为node节点 作为node节点 每台主机Centos版本使用 CentOS Linux release 7.6.1810 (Cor ...

  8. C# 查找其他应用程序并打开、显示、隐藏、关闭的API

    软件开发中,有时迫不得已要用到第三方的软件,这时就涉及到在C#应用程序需要对第三方软件打开.显示.隐藏以及关闭. 下面列举了几个常用的方式 打开应用程序,下面是2种简单用法: 第一种: public ...

  9. embed标签属性

    embed标签属性   (一).基本语法: embed src=url 说明:embed可以用来插入各种多媒体,格式可以是 Midi.Wav.AIFF.AU.MP3等等,    Netscape及新版 ...

  10. JacksonUtil

    package org.linlinjava.litemall.core.util; import com.fasterxml.jackson.core.type.TypeReference; imp ...