如何解决“已达到 http.client.requests 的最大 URI 标记数”警告?

2022-09-04 01:41:38

我在我的应用上收到此警告。我正在同时阅读大约30个读者的RFIDTAG。每次有标签进来时,我都会点击数据库,看看它是否在那里。我有一个我正在使用的休息 API。所以我使用 rest 模板来命中 rest 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;
    }
}

}

答案 1

因此,Spring应用程序收集所有入站和出站API调用的指标。可以查询这些指标以查看某个 URL 被调用的次数。

在您的方法中,您是通过追加到字符串来构建 url。这会将每个具有唯一 rfidtag 的 URL 放在其自己的 URI 标记存储桶中。public Maybevehicle call()

为了避免此问题,您可以使用 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 收集指标,而不是为 、 、 等设置 URI 标记。http://url/{rfidtag}http://url/rfidtag1http://url/rfidtag2http://url/rfidtag3

这应该会减少应用程序正在创建的 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)

在运行应用程序的任何类的顶部,从中可以消除警告消息,但可能无法解决根本问题。


答案 2

推荐