定时推送任务 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;
}
相关文章:
定时推送任务 Apache HttpClient/okhttp3
定时推送任务 需求 需要定时推送我方的数据到对方那边 方法1 Apache HttpClient 此方法指定推送过去的信息转为utf-8格式的json字符串 Scheduled(initialDelay 1000 * 120, fixedDelay 1000 * 60 * 5) public void diseaseInterface() {String lockKey "lock:dise…...
centos7 安装 mysql
命令记录,未整理; 1. 下载mysql5.7的安装包,上传到linux系统某个目录中 2. 使用tar -xvf 解压 tar包 tar -xvf mysql-5.7.35-1.el7.x86_64.rpm-bundle.tar 3. 使用 rpm -ivh 安装 mysql rpm -ivh mysql-community-common-5.7.35-1.el7.x8…...
src挖掘技巧总结分享
src挖洞技术分享 src推荐刚入门的新手首选公益src如漏洞盒子、补天src,因为漏洞盒子收录范围广,只要是国内的站点都收入,相比其它src平台挖掘难度非常适合新手。后续可以尝试先从一些小的src厂商入手。 首先是熟能生巧,我一开始挖…...
【面试八股总结】传输控制协议TCP(一)
一、什么是TCP协议 TCP是传输控制协议Transmission Control Protocol TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。 面向连接的:每条TCP连接杜只能有两个端点,每一条TCP连接只能是点对点的(一对一)可靠的:…...
【系统架构师】-第13章-层次式架构设计
层次式体系结构设计是将系统组成一个层次结构,每一层 为上层服务 ,并作为下层客户。 在一些层次系统中,除了一些精心挑选的输出函数外, 内部的层接口只对相邻的层可见 。 连接件通过决定层间如何交互的协议来定义,拓扑…...
【操作系统】想要更好的学习计算机,操作系统的知识必不可少!!!
操作系统的概念 导言一、日常生活中的操作系统二、计算机系统层次结构三、操作系统的定义3.1 控制和管理计算机资源3.2 组织、调度计算机的工作与资源的分配3.3 给用户和其他软件提供方便接口与环境3.4 总结 四、操作系统的目标和功能4.1 作为管理者4.1.1 处理机管理4.1.2 存储…...
AtCoder Grand Contest 066 B. Decreasing Digit Sums(构造 打表找规律)
题目 给定一个n(n<50),记f(x)是x各数位的加和,例如f(331)3317 要求输出一个x(),且对于任意i∈[1,n],均有成立 思路来源 jiangly B站讲解 题解 首先n没啥用,构造一个n50成立的case即可, 给定一个x…...
Hadoop系列总结
一、Hadoop linux基本操作 前提掌握Linux基本操作 参考 Linux基本操作-CSDN博客 1、查看hadoop指定路径下文件大小前6的文件信息 hdfs dfs[hadoop fs] -du -h /path/to/directory|sort -hr|head -n 6...
【第三方登录】Twitter
创建应用 APPID 和 相关回调配置 重新设置api key 和 api secret 设置回调和网址 还有 APP的类型 拿到ClientID 和 Client Secret 源码实现 获取Twitter 的登录地址 public function twitterUrl() {global $db,$request,$comId;require "inc/twitter_client/twitte…...
C++经典面试题目(十七)
1、请解释拷贝构造函数的作用,并说明其调用时机。 拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,其内容与另一个对象相同。它将一个已存在的对象作为参数,并使用该对象的值来初始化新创建的对象。拷贝构造函数的调用时机…...
DFS2 C++
一、指数型枚举 1、题目: 从 1∼n1∼ 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。 输入格式 输入一个整数 n。 输出格式 每行输出一种方案。 同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。 对于没有选任何…...
2021-08-06
yarn的简介: Yarn是facebook发布的一款取代npm的包管理工具。 yarn的特点: 速度超快。 Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。 在执行代码…...
Centos服务器Open Gauss 部署
近期很多的项目由于信创要求使用一些国产的数据库,比如OpenGauss。OpenGuass是华为高斯DB的开源版,内核还是PostgreSQL,商业版是收费的。这里记录一下是如何安装部署 的。 官方中文文档 官方下载地址 部署要求 操作系统要求 ARMÿ…...
Vue与Electron融合之道:从Web App到桌面App的华丽转身
Vue与Electron融合之道:从Web App到桌面App的华丽转身 引言Vue 与 Electron 的天然契合共享技术栈高效开发与部署用户体验升级 Vue 与 Electron 融合实战初始化项目调整Vue项目结构利用 Electron API 增强功能定制桌面应用外观构建与部署 结语 引言 Vue.js 作为一款…...
Higress 基于自定义插件访问 Redis
作者:钰诚 简介 基于 wasm 机制,Higress 提供了优秀的可扩展性,用户可以基于 Go/C/Rust 编写 wasm 插件,自定义请求处理逻辑,满足用户的个性化需求,目前插件已经支持 redis 调用,使得用户能够…...
Mysql的库函数
MySQL是一个流行的开源关系型数据库管理系统,它提供了大量的内置库函数,用于在查询时执行各种操作。这些函数可以帮助开发者在数据检索、转换和处理过程中实现更复杂的逻辑。 1 字符串函数 函数描述ASCII(s)返回字符串 s 的第一个字符的 ASCII 码。CHA…...
绿联 安装onlyoffice容器并启用Cloudreve的office在线预览与编辑功能
原文:绿联 安装onlyoffice容器并启用Cloudreve的office在线预览与编辑功能 本篇教程以配合Cloudreve扩展文档预览/编辑为目的编写,OnlyOffice的其他用途未深入研究也不做探讨,仅使用WOPI能力。 硬件要求 镜像大小:2.91Gb或更大 …...
金钱卦起卦
前言 本文目的: 1.了解什么是《易经》 2.了解什么是八卦/六十四卦 3.金钱卦起卦方法 4.如何解卦 一、什么是易经? 1、易经就是一本书、一本著作 2、它的成书经历了三个阶段 第一阶段:在5000多年前,由人类的始祖伏羲通过观察时…...
学透Spring Boot 003 —— Spring 和 Spring Boot 常用注解(附面试题和思维导图)
这是 学透 Spring Boot 专栏 的第三篇,欢迎关注我,与我一起学习和探讨 Spring Boot 相关知识,学透 Spring Boot。 从面试题说起 今天我们通过一道和Spring Boot有关的常见面试题入手。 面试题:说说 Spring Boot 中有哪些常用注解…...
新能源汽车充电桩常见类型及充电桩站场的智能监管方案
随着新能源汽车市场的迅猛发展,充电桩作为支持其运行的基础设施,也呈现出多样化的类型。这些充电桩不仅在外形和功能上存在差异,更在充电速度、充电方式以及使用场景等方面展现出独特的优势。 一、充电桩类型及区别 1、慢充桩(交…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
