定时推送任务 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-8
    at 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:12
    at 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-8
                OkHttpClient 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;
}
### 回答1: okhttp3 jar是OkHttp库的Java编程语言实现中的一个jar包。OkHttp是一个用于与其它HTTP或HTTPS服务器进行通信的开源框架库。 它提供了一个简单的API来执行各种HTTP请求和相应的操作,包括同步和异步请求、响应缓存和重定向处理等。OkHttp3是HTTP/2的支持,这使它的性能比旧版本更快且更安全。 okhttp3的jar包通过Maven、Gradle或直接下载进行安装。一旦引入项目中,就可以轻松地创建OkHttpClient对象并调用它的方法来发出HTTP请求并处理响应。 总之,okhttp3 jar是一个基于Java的HTTP客户端库,它提供了一个简单而强大的API来处理HTTP请求和响应。它的出色性能和安全功能使得它成为许多Web应用程序主要的HTTP客户端框架。 ### 回答2: OkHttp3是一个基于Java的网络请求库,可以用来进行HTTP/2、HTTP/1.1、WebSocket的请求以及支持同步和异步请求。它是Square开发的一个轻量级HTTP客户端,可以用来替代HttpUrlConnection和Apache HttpClient这样的网络请求库。 OkHttp3的jar包可以直接下载并导入到Java项目中使用。使用OkHttp3发送HTTP请求十分方便,只需要简单的几行代码,就可以完成一个请求。OkHttp3支持Get、Post、Put、Delete等常用的HTTP请求方法,并可以设置请求头、请求参数、响应超时等相关参数。 OkHttp3的异步请求能够避免由于网络请求长时间时间阻塞导致的应用假死。OkHttp3还支持文件上传、下载、缓存等功能,可以大大简化一些网络请求相关的操作。 总的来说,OkHttp3是一款十分优秀的Java网络请求库,它使用简单,功能强大,且被广泛使用和推荐。如果需要在Java项目中进行网络请求,OkHttp3是一款不错的选择。 ### 回答3: OkHttp3 jar是一个基于HTTP/2.0协议的网络请求库,能够优化网络请求速度和性能。OkHttp3 jar可以用于Android和Java平台上的应用程序开发。它提供了简单易用的API,使得开发者可以轻松地构建网络请求,并处理响应结果。OkHttp3 jar的主要特点包括如下: 1. 支持HTTP/2.0协议,可以提高网络请求速度和性能; 2. 提供了同步和异步两种网络请求方式,能够满足不同业务场景的需求; 3. 支持自定义拦截器,能够灵活地处理请求和响应结果; 4. 提供了缓存功能,能够减少网络请求的频率和时间; 5. 具有良好的稳定性和可靠性,可以稳定运行在Android和Java平台上; 6. 支持WebSocket协议,能够实现实时通讯和数据推送的功能。 总之,OkHttp3 jar是一个功能强大、易用性高、性能可靠的网络请求库,适合于各种类型的Android和Java应用程序开发。使用OkHttp3 jar能够大大提高应用程序的网络请求效率和用户体验,是值得开发者尝试的一个好工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖成范德彪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值