java - 如何解决“已达到 http.client.requests 的最大 URI 标签数”警告?
问题描述
我在我的应用程序上收到此警告。我正在同时阅读大约 30 位读者的 rfidtags。每次标签进入时,我都会访问数据库以查看它是否在其中。我有一个正在使用的休息 api。所以我使用一个休息模板来打休息api。关于如何解决这个问题的任何想法?谢谢!
这是我的一些代码:
private void vehicleRequests(List<Maybevehicle> vehicles){
//process list of unique tags to see if they are in the database and linked to a vehicle
List<Maybevehicle> foundMaybeVehs= new ArrayList<>();
List<Maybevehicle> notFound=new ArrayList<>();
if(!vehicles.isEmpty()){
for (Maybevehicle v: vehicles){
Future<Maybevehicle> r=aService.batchVehTags(v);
try{
Maybevehicle m=r.get(2000, TimeUnit.SECONDS);
if(r.isDone()){
if (!(m.getB().getVin().equals("notindb"))){
foundMaybeVehs.add(m);
}
}
}
}catch(InterruptedException | ExecutionException | TimeoutException e){
}
}
if(!foundMaybeVehs.isEmpty()){
addLocation(foundMaybeVehs);
}
}else{
log.info("no vehicles to check.");
}
}
@Override
public Future<Maybevehicle> batchVehTags(Maybevehicle v) {
Future<Maybevehicle> future=null;
try{
SimpleTaskMaybeveh task=new SimpleTaskMaybeveh(v, appRestTemplate);
future=dbService.submit(task);
}catch(Exception e){
e.printStackTrace();
}
return future;
}
}
public class SimpleTaskMaybeveh implements Callable<Maybevehicle>{
private RestTemplate appRestTemplate;
private Maybevehicle veh;
public SimpleTaskMaybeveh(Maybevehicle veh, RestTemplate appRestTemplate){
this.veh=veh;
this.appRestTemplate=appRestTemplate;
}
@Override
public Maybevehicle call(){
String url="http://url/"+veh.getB().getRfidtag();
String authString= "";
byte[] encodedAuth= Base64.encodeBase64(authString.getBytes(Charset.forName("US-ASCII")));
String authHeader="Basic "+new String(encodedAuth);
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.set("Authorization", authHeader);
HttpEntity<Bmwvehiclemain> requestEntity=new HttpEntity <Bmwvehiclemain>(headers);
ResponseEntity<Bmwvehiclemain> results=appRestTemplate.exchange(url, HttpMethod.GET, requestEntity, Bmwvehiclemain.class);
try{
Bmwvehiclemain n=results.getBody();
Maybevehicle d=new Maybevehicle(n,veh.getNewtaglocation());
return d;
}catch(Exception e){
Maybevehicle notveh=new Maybevehicle("notindb");
return notveh;
}
}
}
解决方案
因此,Spring 应用程序收集所有入站和出站 API 调用的指标。可以查询这些指标以查看某个 URL 被调用了多少次。
在您的public Maybevehicle call()
方法中,您通过附加到字符串来构建 url。这会将带有唯一 rfidtag 的每个 URL 放入其自己的 URI 标签桶中。
为了避免这个问题,您可以使用 uriVariables 映射:
String url = “http://url/{rfidtag}”;
Map<String, ?> uriVariables = new HashMap<>();
uriVariables.put(“rfidtag”, veh.getB().getRfidtag();
…
ResponseEntity<Bmwvehiclemain> results = appRestTemplate
.exchange(url, HttpMethod.GET, requestEntity, Bmwvehiclemain.class, uriVariables);
这让 Spring 收集指标,http://url/{rfidtag}
而不是为http://url/rfidtag1
、http://url/rfidtag2
、http://url/rfidtag3
等设置 URI 标记。
这应该会减少您的应用程序正在创建的 URI 标记的数量。
URI 标签的最大数量的默认值为 100。如果您想要更多的指标,您可以通过将其属性值设置为其他值来自定义它。例如,我的 Spring 应用程序配置了我的projectname-ws/src/main/resources/config/application.yml
文件。在这个文件中,我可以放一些类似的东西
management:
metrics:
web:
client:
max-uri-tags: 200
server:
max-uri-tags: 200
增加用于度量的 URI 标签的最大数量。
如果你根本不想要Reached the maximum number of URI tags for http.client.requests
警告,你可以把
@SpringBootApplication(exclude = HttpClientMetricsAutoConfiguration.class)
在您运行应用程序的任何类的顶部,这将使您摆脱警告消息,但可能无法解决潜在问题。
推荐阅读
- angular - Angular ng-bootstrap ngbNav 组件选项卡内容未显示在导航选项卡上单击
- javascript - 从对象数组中删除重复项并在 JavaScript 中添加新值(例如数量)
- javascript - 如何将 int 从 html 文件(模板)传递给 py 文件(flask)?
- react-native - React Navigation Stack 导航转换
- python - 如何获取子列表中某个单词的索引?
- c - 在函数中释放内存与在同一范围内
- java - 无法使用 Retrofit2 获取数据
- java - 如何用用户数据填充导航抽屉
- php - 如何仅显示 .mp4 文件?
- yaml - yaml中的破折号和缩进