Я получаю это предупреждение в своем приложении. Я читаю 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;
}
}
}




Итак, приложение 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, я наконец избавился от предупреждения!
что том решил без кода? покажи код и объясни проблему