定时推送任务 Apache HttpClient/okhttp3

定时推送任务

需求

需要定时推送我方的数据到对方那边

方法1 Apache HttpClient

此方法指定推送过去的信息转为utf-8格式的json字符串

@Scheduled(initialDelay = 1000 * 120, fixedDelay = 1000 * 60 * 5)
public void diseaseInterface() {String lockKey = "lock:diseaseInterface";String requestId = UUID.randomUUID().toString();boolean acquired = false;try {// 加锁,锁定时间为15分钟acquired = redisTemplate.opsForValue().setIfAbsent(lockKey, requestId, Duration.ofMinutes(15L));if (acquired) {MainBody mainBody = interfaceService.diseaseInterface(new WebServiceBO());if (mainBody != null) {String sendUrl = "对方的接口";// 如果在数据库中配置了接口信息,就从数据库中查询并赋值Code code = codeService.selectByPrimaryKey(DATABASE_CODE_PK_JXZ);if (code != null && StringUtils.isNotEmpty(code.getCode())) {sendUrl = code.getCode();}CloseableHttpClient httpClient = HttpClientBuilder.create().build();HttpPost httpPost = new HttpPost(sendUrl);StringEntity entity = new StringEntity(JSON.toJSONString(mainBody), "utf-8");entity.setContentEncoding("utf-8");entity.setContentType("application/json");httpPost.setEntity(entity);HttpResponse response;try {// 信息推送过去之后,对方会给返回值,结构就是常见的//     {//  code: 1,//接口返回码,成功0,失败1//  msg: '',//提示详细信息,可以为空,可以为中文提示信息//  data: {//返回结果对象//	}//}// data存放了已经同步过去的id,拿到id,我方这边更新字段,表示该信息已经同步,后续不用再同步response = httpClient.execute(httpPost);JSONObject resultJson = JSON.parseObject(EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8).trim());if (resultJson != null) {Utils.debug(resultJson.toJSONString());if (200 == resultJson.getInteger("code")) {// 更新字段recSubmitService.updateReportedStateByRecSubId(resultJson.getInteger("data"), STATUS_YES);}}} catch (IOException e) {e.printStackTrace();}}}} finally {// 释放锁Utils.debug("[释放锁]:" + lockKey);if (acquired) {redisTemplate.delete(lockKey);}}
}

方法2 okhttp3

第二个业主也我们需要推送信息过去,按照上面的写法遇到一个报错,

报错信息为

<!DOCTYPE html>
<html><head><title>Error - 415</title><meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0"><style>body {padding: 50px 80px;font: 14px "Helvetica Neue", Helvetica, sans-serif;}h1 {font-size: 2em;margin-bottom: 5px;}pre {font-size: .8em;}</style></head><body><div id="error"><h1>Error</h1><p>Looks like something broke!</p><pre><code>
Error: Unsupported Content-Encoding: utf-8at inflate (D:\项目\道路巡检-2\ai-node-1\node_modules\inflation\index.js:35:15)at module.exports [as json] (D:\项目\道路巡检-2\ai-node-1\node_modules\co-body\lib\json.js:39:25)at parseBody (D:\项目\道路巡检-2\ai-node-1\node_modules\koa-bodyparser\index.js:87:26)at bodyParser (D:\项目\道路巡检-2\ai-node-1\node_modules\koa-bodyparser\index.js:67:25)at dispatch (D:\项目\道路巡检-2\ai-node-1\node_modules\koa-compose\index.js:42:32)at D:\项目\道路巡检-2\ai-node-1\node_modules\koa-compose\index.js:34:12at Application.handleRequest (D:\项目\道路巡检-2\ai-node-1\node_modules\koa\lib\application.js:186:12)at Server.handleRequest (D:\项目\道路巡检-2\ai-node-1\node_modules\koa\lib\application.js:157:21)at Server.emit (node:events:518:28)at parserOnIncoming (node:_http_server:1143:12)at HTTPParser.parserOnHeadersComplete (node:_http_common:119:17)</code></pre></div></body>
</html>

直接返回了一个网页,看报错信息好像是node报错,不支持utf-8格式,具体怎么解决要看甲方那边调试。

有个现象就是将需要的信息用postman发送过去是正常了,但是写成方法一的代码就出错了,postman支持代码生成,看它提供了 okhttp3 的方法,直接拿来用了

@Scheduled(initialDelay = 1000 * 120, fixedDelay = 1000 * 60 * 5)
public void diseaseInterfaceXC() {String lockKey = "lock:diseaseInterfaceOfXC";String requestId = UUID.randomUUID().toString();boolean acquired = false;try {// 加锁,锁定时间为15分钟acquired = redisTemplate.opsForValue().setIfAbsent(lockKey, requestId, Duration.ofMinutes(15L));if (acquired) {MainBody mainBody = interfaceService.diseaseInterfaceXC(new WebServiceBO());if (mainBody != null) {String sendUrl = "对方的接口";Code code = codeService.selectByPrimaryKey(DATABASE_CODE_PK_XC);if (code != null && StringUtils.isNotEmpty(code.getCode())) {sendUrl = code.getCode();}// 换一种写法,不指定编码格式为utf-8OkHttpClient client = new OkHttpClient().newBuilder().build();MediaType mediaType = MediaType.parse("application/json");RequestBody body = RequestBody.create(mediaType,JSON.toJSONString(WebResponse.ok(mainBody)));Request request = new Request.Builder().url(sendUrl).method("POST", body).addHeader("Content-Type", "application/json").build();Response response = client.newCall(request).execute();String responseBody = response.body().string();ObjectMapper objectMapper = new ObjectMapper();// 用实体类接受返回值ResultVO resultVO = objectMapper.readValue(responseBody, ResultVO.class);if (resultVO.getCode() == 200) {recSubmitService.updateReportedStateByRecSubId(resultVO.getTaskId(), STATUS_YES);}}}} catch (JsonMappingException e) {throw new RuntimeException(e);} catch (JsonProcessingException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);} finally {// 释放锁Utils.debug("[释放锁]:" + lockKey);if (acquired) {redisTemplate.delete(lockKey);}}
}

ResultVO

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResultVO<T> {private Integer code;private Integer taskId;private T msg;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/788518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】——指针七:数组和指针试题解析

【C语言】——指针七&#xff1a; 前言一、 s i z e o f sizeof sizeof 与 s t r l e n strlen strlen 的对比1.1、 s i z e o f sizeof sizeof1.2、 s t r l e n strlen strlen1.3、 s i z e o f sizeof sizeof 和 s t r l e n strlen strlen 对比 二、数组和指针笔试题解析…

SparkSQL 和 HiveSQL的区别

相同点 1. 都可以通过SQL分析数据.2. 都可以处理大规模的数据.3. 都是处理结构化的数据.4. 都是提交到Yarn平台来使用. 不同点 1. SparkSQL是基于内存的迭代计算, HiveSQL它是基于磁盘的迭代计算.2. HiveSQL仅仅能用SQL语言操作, SparkSQL除了能用SQL语句外, 还可以写DSL代码. …

算法打卡day32|贪心算法篇06|Leetcode 738.单调递增的数字、968.监控二叉树

算法题 Leetcode 738.单调递增的数字 题目链接:738.单调递增的数字 大佬视频讲解&#xff1a;单调递增的数字视频讲解 个人思路 这个题目就是从例子中找规律&#xff0c;例如 332&#xff0c;从后往前遍历&#xff0c;32不是单调递增将2变为9,3减1&#xff0c;变成了329&…

ES-7.12-官网阅读-ILM-index lifecycle actions

官方文档地址&#xff1a;Index lifecycle actions | Elasticsearch Guide [7.12] | Elastic 索引生命周期操作&#xff08;index lifecycle actions&#xff09; Allocate 将分片移动到具有不同性能特征的节点并减少副本数量 Delete 永久删除索引。 Force merge 减少索…

Marin说PCB之电源完整性之电源网络的PDN仿真CST---01

最近朋友圈最火的消息我感觉是除了开封的王婆外莫过于是小米SU7汽车发布这件事情了&#xff0c;小编我也是一位资深的米粉&#xff0c;我在上个月28号的时候守在电脑前直播看小米SU7汽车的发布会&#xff0c;其中雷总演讲的一段话很打动我&#xff1a;不甘于平庸&#xff0c;还…

微信小程序-文字转语音(播放及暂停)

1、使用微信小程序的同声传译功能 小程序平台-设置-第三方设置-插件管理-新增同声传译插件 小程序app.json文件配置 "plugins": {"WechatSI": {"version": "0.3.5","provider": "wx069ba97219f66d99"}},小程序中…

VMware-16.0配置虚拟机网络模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、为什么要配置网络&#xff1f;二、配置步骤1.检查VMware服务2.进入配置页面3.添加网络模式1.Bridge2.NAT3.Host-only 4.DHCP租约5.静态IP 三、使用总结 前言…

Java数据结构算法-动态规划算法

Java算法基础 算法是解决问题的一系列步骤或指令。在Java中&#xff0c;常见的算法包括排序算法&#xff08;如冒泡排序、快速排序等&#xff09;、查找算法&#xff08;如顺序查找、二分查找等&#xff09;以及递归和分治策略等。这些算法在实际编程中经常被使用&#xff0c;…

JS-23-原型继承

一、JS的原型继承 在传统的基于Class的语言如Java、C中&#xff0c;继承的本质是扩展一个已有的Class&#xff0c;并生成新的Subclass。 但是&#xff0c;JavaScript由于采用原型继承&#xff0c;根本不存在Class这种类型。 但是办法还是有的。我们先回顾Student构造函数&am…

ActiViz中的图像处理vtkImageActor

文章目录 前言一、vtkImageActor的基本特性1、支持的数据类型:2、 图像显示的位置和大小控制:3、 颜色和不透明度控制:4、图像剪裁和截取功能:二、vtkImageActor的使用方法1、创建vtkImageActor实例2、将图像数据设置给vtkImageActor3、 将vtkImageActor添加到渲染场景中4、…

手机真机连接USB调试adb不识别不显示和TCPIP连接问题

手机真机连接USB调试adb devices不显示设备和TCPIP连接 本文手机型号为NOVA 7 &#xff0c;其他型号手机在开发人员模式打开等方式可能略有不同&#xff0c;需根据自己的手机型号修改。 文章目录 1. 打开和关闭开发者模式2. 真机USB连接调试adb不显示设备问题的若干解决方法3…

dm8修改sysdba用户的密码

1 查看达梦数据库版本 SQL> select * from v$version;LINEID BANNER ---------- --------------------------------- 1 DM Database Server 64 V8 2 DB Version: 0x7000c 3 03134283904-20220630-163817-200052 …

苦难调剂之路:网暴与贵人

这篇文章是抖音、b站、小红书上上传的同名视频的原文稿件&#xff0c;感兴趣的csdn用户可以关注我的抖音、b站、小红书账号&#xff08;GeekPower极客力量&#xff09;。同时这篇文章也为视频观众提供方便&#xff0c;可以更加冷静地分析和思考。文章同时在知乎发表。 最近各个…

数据分析之Logistic回归分析中的【多元有序逻辑回归】

1、定义 多元有序逻辑回归用于分析有序分类因变量与一个或多个自变量之间的关系。有序逻辑回归适用于因变量具有自然排序但没有固定间距的类别&#xff0c;例如疾病严重程度&#xff08;轻度、中度、重度&#xff09;或调查问卷中的满意度评分&#xff08;非常不满意、不满意、…

前端调试工具之Chrome Elements、Network、Sources、TimeLine调试

常用的调试工具有Chrome浏览器的调试工具&#xff0c;火狐浏览器的Firebug插件调试工具&#xff0c;IE的开发人员工具等。它们的功能与使用方法大致相似。Chrome浏览器简洁快速&#xff0c;功能强大这里主要介绍Chrome浏览器的调试工具。 打开 Google Chrome 浏览器&#xff0c…

Linux(centos) 安装GraalVM

文章目录 版权声明GraalVM 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用&#xff0c;并非商业用途。我在整理学习笔记的过程中尽力确保准确性&…

视频汇聚/安防监控/EasyCVR平台播放器EasyPlayer更新:新增【性能面板】

视频汇聚/安防监控/视频存储平台EasyCVR基于云边端架构&#xff0c;可以在复杂的网络环境中快速、灵活部署&#xff0c;平台视频能力丰富&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云…

物联网行业中,我们如何选择数据库?

在当今数字化潮流中&#xff0c;我们面对的不仅是海量数据&#xff0c;更是时间的涟漪。从生产线的传感器到金融市场的交易记录&#xff0c;时间序列数据成为了理解事物演变和趋势的关键。在面对这样庞大而动态的数据流时&#xff0c;我们需要深入了解一种强大的工具——时序数…

素数的判断方法总结

目录 素数介绍 试除法 埃氏筛 欧拉筛 素数介绍 判断一个数n是不是素数&#xff1a;当时&#xff0c;用试除法&#xff1b;当时&#xff0c;试除法不够用&#xff0c;需要用高级算法。 试除法 把内的所有数去试除n&#xff0c;如果都不能整除&#xff0c;就是素数。 boo…

谷粒商城实战(008 缓存)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第151p-第p157的内容 简介 数据库承担落盘&#xff08;持久化&#xff09;工作 拿map做缓存 这种是本地缓存&#xff0c;会有一些问题 分布…