基于 SpringBoot 异步接口请求的实现 2021-12-23 程序之旅 暂无评论 601 次阅读 ## 异步接口请求的实现 ### 开发思路 ```sequence 客户端-服务端: 请求接口 服务端--客户端: 响应异步编码 UUID note left of 客户端: 等待结果 客户端-服务端: UUID 请求异步数据 服务端--客户端: 响应等待指令 服务端-服务端: 业务处理 服务端-缓存: 保存业务数据 UUID:value 客户端-服务端: UUID 请求异步数据 服务端--客户端: 响应缓存数据 ``` #### JedisUtil 缓存工具 定义连接 redis 工具类 ```java @Component public class JedisUtil { @Autowired private JedisPool jedisPool; /** * 获取Jedis */ public Jedis getJedis() { return jedisPool.getResource(); } /** * 获取指定key的值,如果key不存在返回null,如果该Key存储的不是字符串,会抛出一个错误 * * @param key * @return java.lang.String * @Author liurui * @Description 获取指定key的值, 如果key不存在返回null,如果该Key存储的不是字符串,会抛出一个错误 * @Date 11:24 2020/8/17 **/ public Object get(String key) { Jedis jedis = getJedis(); Object value = SerializeUtil.unserialize(jedis.get(key.getBytes())); return value; } /** * 设置key的值为value * * @param key * @param value * @return java.lang.String * @Author liurui * @Description 设置key的值为value * @Date 11:25 2020/8/17 **/ public Object set(String key, Object value) { Jedis jedis = getJedis(); return jedis.set(key.getBytes(), SerializeUtil.serialize(value)); } /** * 关闭Jedis连接 */ public void close(Jedis jedis) { if (jedis != null) { jedis.close(); } } } ``` #### 异步响应接口控制类 用于客户端轮询获取处理结果 ```java @ApiRestController public class AsyncHandleResultController { @Autowired private JedisUtil jedisUtil; @ApiOperation(value = "异步接口查询", notes = "异步接口查询") @PostMapping(headers = "method=AsyncHandleResult.Query") public JsonResult requestSerialCode(@RequestBody Map map) { JsonResult jsonResult = ApiResponseUtil.ok(jedisUtil.get(map.get("requestSerialCode"))); if (jsonResult == null){ return ApiResponseUtil.error("获取信息错误!"); } return jsonResult; } } ``` #### 控制层使用 接口请求后返回获取异步数据的 UUID ```java @Autowired private JedisUtil jedisUtil; @GetMapping(headers = "method=AsyncTest.Test") public JsonResult AsyncTest() { try { // 请求序列码 String requestSerialCode = UUIDUtil.getUUIDString(); // TODO 业务数据,处理结构可以放在 jedisUtil 中 return ApiResponseUtil.ok(requestSerialCode); } catch (Exception e) { log.error("请求异常\n", e); return ApiResponseUtil.error(); } } ``` #### 改进结构 可以使用 Spring 中的 AOP 进行切面控制 打赏: 微信, 支付宝 标签: spring boot, 异步 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。