Как устранить предупреждение «Достигнуто максимальное количество тегов URI для http.client.requests»?

Я получаю это предупреждение в своем приложении. Я читаю rfidtags примерно от 30 читателей одновременно. Каждый раз, когда приходит тег, я обращаюсь к базе данных, чтобы увидеть, есть ли он там. У меня есть 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;
    }
}

}

что том решил без кода? покажи код и объясни проблему

Deadpool 28.02.2019 18:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
12
1
9 153
1

Ответы 1

Итак, приложение Spring собирает метрики по всем входящим и исходящим вызовам API. Эти показатели могут быть запрошены, чтобы узнать, сколько раз вызывался определенный URL-адрес.

В вашем методе public Maybevehicle call() вы создаете URL-адрес, добавляя его к строке. Это поместит каждый URL-адрес с уникальным тегом rfid в свою собственную корзину тегов 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} вместо использования тега URI для http://url/rfidtag1, http://url/rfidtag2, http://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)

в верхней части любого класса, из которого вы запускаете свое приложение, что избавит вас от предупреждающего сообщения, но, вероятно, не решит основную проблему.

В моем случае использование переменных URI не решило мою проблему, потому что на самом деле проблема заключалась в /получении/запросов. (Также) исключив WebMvcMetricsAutoConfiguration.class, я наконец избавился от предупреждения!

Hayo Baan 31.10.2020 18:19

Другие вопросы по теме