Quellcode durchsuchen

1.新增一个商品最新信息接收与比较接口

2.新增商品信息和预警配置 白名单查询接口
wq_dev
wangqiang vor 1 Monat
Ursprung
Commit
1b24ea4ed3

+ 12
- 0
ruoyi-system/src/main/java/com/ruoyi/system/controller/ZsOperationGoodsController.java Datei anzeigen

@@ -4,10 +4,12 @@ import java.util.List;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;

import cn.dev33.satoken.annotation.SaIgnore;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.apache.http.HttpRequest;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.ruoyi.common.annotation.RepeatSubmit;
@@ -48,6 +50,16 @@ public class ZsOperationGoodsController extends BaseController {
return iZsOperationGoodsService.queryPageList(bo, pageQuery);
}

/**
* 查询商品配置列表
*/
@SaIgnore
@GetMapping("/noVerifyList")
public TableDataInfo<ZsOperationGoodsVo> listSpe(HttpRequest httpRequest, ZsOperationGoodsBo bo, PageQuery pageQuery) {

return iZsOperationGoodsService.queryPageList(bo, pageQuery);
}

/**
* 导出商品配置列表
*/

+ 13
- 0
ruoyi-system/src/main/java/com/ruoyi/system/controller/ZsOperationWarnconfigController.java Datei anzeigen

@@ -4,7 +4,10 @@ import java.util.List;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;

import cn.dev33.satoken.annotation.SaIgnore;
import lombok.RequiredArgsConstructor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
@@ -48,6 +51,16 @@ public class ZsOperationWarnconfigController extends BaseController {
return iZsOperationWarnconfigService.queryPageList(bo, pageQuery);
}

/**
* 查询预警配置列表
*/
@SaIgnore
@GetMapping("/noVerifyList")
public TableDataInfo<ZsOperationWarnconfigVo> listspe(HttpServletRequest request, ZsOperationWarnconfigBo bo, PageQuery pageQuery) {
//String secretKey = request.getHeader("secret_key");
return iZsOperationWarnconfigService.queryPageList(bo, pageQuery);
}

/**
* 导出预警配置列表
*/

+ 15
- 3
ruoyi-system/src/main/java/com/ruoyi/system/controller/ZsOperationWarnresultController.java Datei anzeigen

@@ -1,7 +1,9 @@
package com.ruoyi.system.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import cn.dev33.satoken.annotation.SaIgnore;
@@ -11,6 +13,7 @@ import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
@@ -39,6 +42,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/operationWarnresult")
@Slf4j
public class ZsOperationWarnresultController extends BaseController {

private final IZsOperationWarnresultService iZsOperationWarnresultService;
@@ -112,9 +116,17 @@ public class ZsOperationWarnresultController extends BaseController {

//立即调用预警监控
@SaIgnore
@GetMapping("/monitorWarn")
public void monitorWarn() {
iZsOperationWarnresultService.monitorWarn();
@PostMapping("/receiveLatestGoodsInfo")
public Map receiveLatestGoodsInfo(@RequestBody Map map) {
try {
return iZsOperationWarnresultService.receiveLatestGoodsInfo(map);
} catch (Exception e) {
Map reMap = new HashMap();
reMap.put("success",false);
reMap.put("message","失败");
log.error("最新商品信息接收失败!=:",e);
return reMap;
}
}

}

+ 2
- 1
ruoyi-system/src/main/java/com/ruoyi/system/service/IZsOperationWarnresultService.java Datei anzeigen

@@ -8,6 +8,7 @@ import com.ruoyi.common.core.domain.PageQuery;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
* 预警结果Service接口
@@ -47,5 +48,5 @@ public interface IZsOperationWarnresultService {
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

void monitorWarn();
Map receiveLatestGoodsInfo(Map map);
}

+ 210
- 8
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ZsOperationWarnresultServiceImpl.java Datei anzeigen

@@ -1,27 +1,38 @@
package com.ruoyi.system.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.system.domain.ZsOperationWarnconfig;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.mapper.ZsOperationGoodsMapper;
import com.ruoyi.system.mapper.ZsOperationSendconfigMapper;
import com.ruoyi.system.mapper.ZsOperationWarnconfigMapper;
import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.system.task.MonitorTaskScheduler;
import com.ruoyi.system.utils.EmailUtils;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.domain.bo.ZsOperationWarnresultBo;
import com.ruoyi.system.domain.vo.ZsOperationWarnresultVo;
import com.ruoyi.system.domain.ZsOperationWarnresult;
import com.ruoyi.system.mapper.ZsOperationWarnresultMapper;
import com.ruoyi.system.service.IZsOperationWarnresultService;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;

import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.LocalTime;
import java.util.*;

/**
* 预警结果Service业务层处理
@@ -31,6 +42,7 @@ import java.util.Collection;
*/
@RequiredArgsConstructor
@Service
@Slf4j
public class ZsOperationWarnresultServiceImpl implements IZsOperationWarnresultService {

private final ZsOperationWarnresultMapper baseMapper;
@@ -38,6 +50,21 @@ public class ZsOperationWarnresultServiceImpl implements IZsOperationWarnresultS
private MonitorTaskScheduler monitorTaskScheduler;
@Autowired
private ZsOperationWarnconfigMapper zsOperationWarnconfigMapper;
@Autowired
private ZsOperationGoodsMapper zsOperationGoodsMapper;
@Autowired
private ZsOperationWarnresultMapper zsOperationWarnresultMapper;

@Autowired
private ZsOperationSendconfigMapper zsOperationSendconfigMapper;

@Autowired
private ISysDictDataService iSysDictDataService;

@Autowired
private SpringTemplateEngine templateEngine;
@Autowired
private EmailUtils emailUtils;
/**
* 查询预警结果
*/
@@ -118,13 +145,188 @@ public class ZsOperationWarnresultServiceImpl implements IZsOperationWarnresultS
}
return baseMapper.deleteBatchIds(ids) > 0;
}
//拉取商品 进行比对

//接收预警数据
@Override
public void monitorWarn() {
public Map receiveLatestGoodsInfo(Map dataMap) {
Map reMap =new HashMap();
boolean success = true;
String message = "成功";
//1.查询预警配置
List<ZsOperationWarnconfig> zsOperationWarnconfigs = zsOperationWarnconfigMapper.selectList();
if (zsOperationWarnconfigs!=null&&zsOperationWarnconfigs.size()>0) {
ZsOperationWarnconfig zsOperationWarnconfig = zsOperationWarnconfigs.get(0);
monitorTaskScheduler.monitorWarn(zsOperationWarnconfig);
//2.更新商品表和预警结果表信息
String curUrl = (String)dataMap.get("url");
String newName = (String)dataMap.get("title");
String newSn = (String)dataMap.get("sku");
String newRemark = (String)dataMap.get("remark");
UpdateWrapper goodsUpdateWrapper = new UpdateWrapper<>();
goodsUpdateWrapper.eq("goods_sku_url",curUrl);
goodsUpdateWrapper.set("goods_sku_name",newName);
goodsUpdateWrapper.set("goods_sku_sn",newSn);
goodsUpdateWrapper.set("remark",newRemark);
int j = zsOperationGoodsMapper.update(null,goodsUpdateWrapper);
UpdateWrapper<ZsOperationWarnresult> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("goods_sku_url",curUrl);
updateWrapper.set("goods_sku_name",newName);
updateWrapper.set("goods_sku_sn",newSn);
int i = zsOperationWarnresultMapper.update(null,updateWrapper);

//3.查询商品基准价格
QueryWrapper<ZsOperationGoods> goodsQueryWrapper = new QueryWrapper();
goodsQueryWrapper.eq("goods_sku_url",curUrl);
List<ZsOperationGoods> goodsList = zsOperationGoodsMapper.selectList(goodsQueryWrapper);
//4.比较基准价格和最新的价格是否相差大于等于 设定的阈值
if (goodsList!=null&&goodsList.size()>0) {
ZsOperationGoods zsOperationGoods =goodsList.get(0);
String newPriceStr = (String)dataMap.get("price");
if (org.apache.commons.lang3.StringUtils.isNotBlank(newPriceStr)) {
newPriceStr =newPriceStr.replace(",","").trim();
BigDecimal newPrice = new BigDecimal(newPriceStr);
//如果新价格大于0
if (newPrice.compareTo(BigDecimal.ZERO) > 0) {
//判断这个商品最新的价格是否已经存在预警结果表了,如果在不发送消息和生成结果
if (checkIsExistsWarnResult(curUrl,newPrice)) {
message = "已经存在预警结果表,并且价格没有再次变化,不记录 url=:"+curUrl;
log.info(message);
} else {
//获取基准价格
BigDecimal initPrice = zsOperationGoods.getInitPrice();
//获取基准价格和最新价格的差值比例
BigDecimal percentageChange= getChangeThreshold(initPrice,newPrice);
//我们设置的预警阈值
BigDecimal priceChange = new BigDecimal(zsOperationWarnconfig.getPriceChangeThreshold());
// 比较差值比例是否大于等于我们设置的预警阈值
if (percentageChange.compareTo(priceChange) >= 0) {
//5.生成 预警结果数据
String warnTypes = zsOperationWarnconfig.getWarnTypes();
ZsOperationWarnresult zsOperationWarnresult = new ZsOperationWarnresult();
zsOperationWarnresult.setWarnTime(new Date());
zsOperationWarnresult.setGoodsSkuName(zsOperationGoods.getGoodsSkuName());
zsOperationWarnresult.setGoodsSkuSn(zsOperationGoods.getGoodsSkuSn());
zsOperationWarnresult.setGoodsSkuUrl(curUrl);
zsOperationWarnresult.setInitPrice(initPrice);
zsOperationWarnresult.setCurPrice(newPrice);
zsOperationWarnresult.setPriceChangeRatio(percentageChange.toString());
zsOperationWarnresult.setWarnTypes(warnTypes);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String warnDate = sdf.format(zsOperationWarnresult.getWarnTime());

//根据平台编码获取平台名称
String platformName = iSysDictDataService.selectDictLabel("zs_operation_platform",zsOperationGoods.getPlatform());
String title = "Digital System 系统提醒:您所监控的 "+platformName+" 商品已发生价格波动";
WarnEmail warnEmail = new WarnEmail();
warnEmail.setPlatformName(platformName);
warnEmail.setSkuName(zsOperationGoods.getGoodsSkuName());
warnEmail.setSkuSn(newSn);
warnEmail.setSkuUrl(curUrl);
warnEmail.setWarnTime(warnDate);
warnEmail.setCurPrice(initPrice.toString());
warnEmail.setNewPrice(newPrice.toString());
warnEmail.setImagePath((String)dataMap.get("screenshotUrl"));
//读取邮件模板
Context context = new Context();
context.setVariable("warnEmail", warnEmail);
String warnContentHtml = templateEngine.process("warnEmail", context);

zsOperationWarnresult.setWarnContent(warnContentHtml);
zsOperationWarnresult.setSnapshotUrl((String)dataMap.get("screenshotUrl"));
zsOperationWarnresult.setStatus(0);
zsOperationWarnresult.setPlatform(zsOperationGoods.getPlatform());
zsOperationWarnresult.setCompareStatus(1);
zsOperationWarnresultMapper.insert(zsOperationWarnresult);

//6.发送邮件
QueryWrapper<ZsOperationSendconfig> sendWrapper= new QueryWrapper<>();
sendWrapper.eq("module",0);
sendWrapper.in("code",warnTypes.split(","));
//根据预警编码 查询出对应的预警信息接收地址
List<ZsOperationSendconfig> zsOperationSendconfigList = zsOperationSendconfigMapper.selectList(sendWrapper);
if (zsOperationSendconfigList!=null&&zsOperationSendconfigList.size()>0) {
for (ZsOperationSendconfig zsOperationSendconfig : zsOperationSendconfigList) {
String receiveEmailStr = zsOperationSendconfig.getConfigValue();
String[] receiveEmails = receiveEmailStr.split(",");
for (String receiveEmail : receiveEmails) {
//发送数据 1立刻发送 0 9:00-18:00 发送
String warnTimeRange = zsOperationWarnconfig.getWarnTimeRange();
if ("1".equals(warnTimeRange)) {
emailUtils.sendMailByTransportHtml(zsOperationSendconfig.getSendEmail(),receiveEmail,title,warnContentHtml,zsOperationSendconfig.getSmtpId());
} else {
if (isBetween9And18()) {
emailUtils.sendMailByTransportHtml(zsOperationSendconfig.getSendEmail(),receiveEmail,title,warnContentHtml,zsOperationSendconfig.getSmtpId());
}
}
}
}
} else {
message = "预警接收配置为空,不发送邮件";
log.info(message);
}
} else {
message = "商品:"+newName+";价格变动小于阈值,不生成比对结果;本次变动幅度=:"+percentageChange;
log.info(message);
}
}
} else {
log.info("商品:"+newName+";新价格为0,不生成比对结果");
}
}
} else {
success = false;
message = "商品不存在";
}
} else {
success = false;
message = "预警配置为空";
}
reMap.put("success",success);
reMap.put("message",message);
return reMap;
}


public boolean checkIsExistsWarnResult(String url,BigDecimal newPrice) {
boolean isExists = false;
QueryWrapper<ZsOperationWarnresult> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("goods_sku_url",url);
queryWrapper.eq("status",0);
queryWrapper.orderByDesc("warn_time");
List<ZsOperationWarnresult> list = zsOperationWarnresultMapper.selectList(queryWrapper);
if (list!=null&&list.size()>0) {
ZsOperationWarnresult zsOperationWarnresult = list.get(0);
BigDecimal curPrice = zsOperationWarnresult.getCurPrice();
if (curPrice!=null&&newPrice.compareTo(curPrice)==0) {
isExists = true;
}
}
return isExists;
}

/**
* 判断价格变化是否超过阈值
* @param curPrice 当前价格(基准价)
* @param newPrice 新价格
* @return 变化幅度超过阈值返回true,否则false
*/
public BigDecimal getChangeThreshold(BigDecimal curPrice,BigDecimal newPrice) {
// 参数校验
if (curPrice == null || newPrice == null ) {
throw new IllegalArgumentException("参数不能为空");
}
// 计算价格变化绝对值
BigDecimal diff = newPrice.subtract(curPrice).abs();
// 计算百分比变化(保留4位小数)
BigDecimal percentageChange = diff.divide(curPrice, 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal("100"));
return percentageChange;
}
public boolean isBetween9And18() {
LocalTime currentTime = LocalTime.now();
LocalTime startTime = LocalTime.of(9, 0); // 9:00
LocalTime endTime = LocalTime.of(18, 0); // 18:00
// 判断当前时间是否在 [9:00, 18:00] 区间(包含边界)
return !currentTime.isBefore(startTime) && !currentTime.isAfter(endTime);
}

}

+ 38
- 12
ruoyi-system/src/main/java/com/ruoyi/system/task/MonitorTaskScheduler.java Datei anzeigen

@@ -2,14 +2,12 @@ package com.ruoyi.system.task;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.ruoyi.system.domain.ZsOperationGoods;
import com.ruoyi.system.domain.ZsOperationSendconfig;
import com.ruoyi.system.domain.ZsOperationWarnconfig;
import com.ruoyi.system.domain.ZsOperationWarnresult;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.mapper.ZsOperationGoodsMapper;
import com.ruoyi.system.mapper.ZsOperationSendconfigMapper;
import com.ruoyi.system.mapper.ZsOperationWarnconfigMapper;
import com.ruoyi.system.mapper.ZsOperationWarnresultMapper;
import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.system.utils.EmailUtils;
import com.ruoyi.system.utils.HttpUtil;
import lombok.extern.slf4j.Slf4j;
@@ -18,6 +16,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;

import javax.annotation.PostConstruct;
import java.math.BigDecimal;
import java.math.RoundingMode;
@@ -32,7 +33,7 @@ import java.util.concurrent.ScheduledFuture;
@Slf4j
public class MonitorTaskScheduler {

private final ThreadPoolTaskScheduler taskScheduler;
// private final ThreadPoolTaskScheduler taskScheduler;
private ScheduledFuture<?> scheduledTask;
@Autowired
private ZsOperationWarnconfigMapper zsOperationWarnconfigMapper;
@@ -45,13 +46,18 @@ public class MonitorTaskScheduler {
@Autowired
private EmailUtils emailUtils;

public MonitorTaskScheduler( ) {
@Autowired
private ISysDictDataService iSysDictDataService;

@Autowired
private SpringTemplateEngine templateEngine;
/* public MonitorTaskScheduler( ) {
this.taskScheduler = new ThreadPoolTaskScheduler();
this.taskScheduler.setPoolSize(1);
this.taskScheduler.initialize();
}
}*/

@PostConstruct
/* @PostConstruct
public void init() {
// 启动时从数据库加载初始配置
rescheduleTask();
@@ -79,7 +85,7 @@ public class MonitorTaskScheduler {
new CronTrigger(cron)
);
}
}
}*/

//比对商品价格编号是否超过了阈值 并记录
public void monitorWarn(ZsOperationWarnconfig zsOperationWarnconfig) {
@@ -93,8 +99,13 @@ public class MonitorTaskScheduler {
String curUrl = zsOperationGoods.getGoodsSkuUrl();
//3.根据url 获取商品最新信息
log.info("调用接口开始");
Map<String, Object> reMap = HttpUtil.sendGetRequest(curUrl,true,zsOperationGoods.getPlatform());
Map<String, Object> reMap = HttpUtil.sendGetRequest(curUrl,false,zsOperationGoods.getPlatform());
log.info("调用接口结束");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if ((boolean)reMap.get("success")) {
List dataList = (List)reMap.get("data");
Map dataMap = (Map)dataList.get(0);
@@ -180,13 +191,28 @@ public class MonitorTaskScheduler {
String receiveEmailStr = zsOperationSendconfig.getConfigValue();
String[] receiveEmails = receiveEmailStr.split(",");
for (String receiveEmail : receiveEmails) {
String platformName = iSysDictDataService.selectDictLabel("zs_operation_platform",zsOperationGoods.getPlatform());
String title = "Digital System 系统提醒:您所监控的 "+platformName+" 商品已发生价格波动";

WarnEmail warnEmail = new WarnEmail();
warnEmail.setPlatformName(platformName);
warnEmail.setSkuName(zsOperationGoods.getGoodsSkuName());
warnEmail.setSkuSn(newSn);
warnEmail.setSkuUrl(curUrl);
warnEmail.setWarnTime(warnDate);
warnEmail.setCurPrice(initPrice.toString());
warnEmail.setNewPrice(newPrice.toString());
warnEmail.setImagePath((String)dataMap.get("screenshotUrl"));
Context context = new Context();
context.setVariable("warnEmail", warnEmail);
String warnContentHtml = templateEngine.process("warnEmail", context);
//发送数据 1立刻发送 0 9:00-18:00 发送
String warnTimeRange = zsOperationWarnconfig.getWarnTimeRange();
if ("1".equals(warnTimeRange)) {
emailUtils.sendMailByTransportHtml(zsOperationSendconfig.getSendEmail(),receiveEmail,"商品价格变化预警 商品名=:"+zsOperationGoods.getGoodsSkuName(),warnContent,zsOperationSendconfig.getSmtpId());
emailUtils.sendMailByTransportHtml(zsOperationSendconfig.getSendEmail(),receiveEmail,title,warnContentHtml,zsOperationSendconfig.getSmtpId());
} else {
if (isBetween9And18()) {
emailUtils.sendMailByTransportHtml(zsOperationSendconfig.getSendEmail(),receiveEmail,"商品价格变化预警 商品名=:"+zsOperationGoods.getGoodsSkuName(),warnContent,zsOperationSendconfig.getSmtpId());
emailUtils.sendMailByTransportHtml(zsOperationSendconfig.getSendEmail(),receiveEmail,title,warnContentHtml,zsOperationSendconfig.getSmtpId());
}
}
}

+ 39
- 3
ruoyi-system/src/main/java/com/ruoyi/system/utils/HttpUtil.java Datei anzeigen

@@ -2,7 +2,11 @@ package com.ruoyi.system.utils;

import com.amazonaws.retry.v2.SimpleRetryPolicy;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
@@ -49,17 +53,23 @@ public class HttpUtil {

// 发送GET请求
log.info("开始时间="+getdate());
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create().build());
/* HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create().build());
factory.setConnectTimeout(300000); // 连接超时,单位为毫秒
factory.setReadTimeout(300000); // 读取超时,单位为毫秒
RestTemplate restTemplate = new RestTemplate(factory);
ResponseEntity<Map> response = restTemplate.getForEntity(builder.toUriString(), Map.class);*/

RestTemplate restTemplate = createRobustRestTemplate();
ResponseEntity<Map> response = restTemplate.getForEntity(builder.toUriString(), Map.class);
log.info("成功结束时间="+getdate());
Map body = response.getBody();
Long end = System.currentTimeMillis();
log.info("调用获取商品最新信息接口耗时=:"+(end-start));
log.info("调用获取商品最新信息接口成功耗时=:"+(end-start));
return body;
} catch (Exception e) {
log.info("结束时间="+getdate());
log.info("失败结束时间="+getdate());
Long end = System.currentTimeMillis();
log.info("调用获取商品最新信息接口失败耗时=:"+(end-start));
/* if (count<1) {
count++;
send(url,needScreenshot,platform,count);
@@ -84,4 +94,30 @@ public class HttpUtil {
return formattedTime;
}


public static RestTemplate createRobustRestTemplate() {
// 配置连接池
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(10); // 最大连接数:ml-citation{ref="3" data="citationList"}
connectionManager.setDefaultMaxPerRoute(10); // 每个路由最大连接数:ml-citation{ref="3" data="citationList"}

// 配置重试策略(最多重试3次)
HttpRequestRetryHandler retryHandler = (exception, executionCount, context) ->
executionCount <= 0 && exception instanceof org.apache.http.NoHttpResponseException;

// 构建HttpClient
HttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.setRetryHandler(retryHandler) // 失败重试策略:ml-citation{ref="5" data="citationList"}
.setKeepAliveStrategy((response, context) -> 180_000) // Keep-Alive策略:ml-citation{ref="3" data="citationList"}
.build();

// 配置请求工厂
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
factory.setConnectTimeout(120000); // 连接超时
factory.setReadTimeout(300000); // 读取超时
factory.setConnectionRequestTimeout(120000); // 从连接池获取连接超时

return new RestTemplate(factory);
}
}

Laden…
Abbrechen
Speichern