public class Accumulator { private Map<String, Object> data = new HashMap<>(); // ընթացիկ տվյալների հավաքածու private List<Map<String, Object>> dataList = new ArrayList<>(); // տվյալների խմբաքանակ private Map<Instant, String> responses = new HashMap<>(); // պատասխաններ տվյալները ստացող սերվերից private int dataId; /** * ավելացնում է field դաշտը արժեքով value հավաքածուին */ public void add(String field, String value) { data.put(field, value); } /** * վերադարձնում է արժեքը դաշտի անվանով field */ public <T> T get(String field) { return (T) data.get(field); } /** * վերադարձնում է տվյալները ստացող սերվերի պատասխանները */ public String getResponses() { String out = ""; for (String resp : responses.values()) { out += "; " + resp; } return out; } /** * ավարտում է ընթացիկ տվյալների հավաքածուի հավաքագրումը և ուղարկում է */ public synchronized void push() { dataList.add(data); if (dataList.size() == 100) { send(); dataList.clear(); } data = new HashMap<>(); data.put("id", dataId++); } /** * ուղարկում է խմբաքանակը տվյալներ ստացող սերվերին */ private void send() { RestTemplate restTemplate = new RestTemplate(); HttpEntity<List<Map<String, Object>>> request = new HttpEntity<>(dataList); String url = "localhost:20808/msg/incoming"; ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class); responses.put(Instant.now(), response.getBody()); } }
sobes.tech AI
Պատասխան AI-ից
В данном классе есть несколько проблем и потенциальных улучшений:
-
Метод send() использует HTTP GET для отправки данных в теле запроса, что не соответствует стандартам HTTP. Для отправки данных следует использовать POST.
-
RestTemplate создается заново при каждом вызове send(), что неэффективно. Лучше создать один экземпляр и переиспользовать.
-
В методе getResponses() конкатенация строк через += в цикле неэффективна, лучше использовать StringBuilder.
-
В методе push() поле "id" добавляется в новый data после очистки, но dataId не инициализирован явно, что может привести к проблемам.
-
Отсутствует обработка ошибок при отправке данных.
Пример исправленного метода send():
private final RestTemplate restTemplate = new RestTemplate();
private void send() {
HttpEntity<List<Map<String, Object>>> request = new HttpEntity<>(dataList);
String url = "http://localhost:20808/msg/incoming";
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
responses.put(Instant.now(), response.getBody());
}
Также стоит добавить обработку исключений и инициализацию dataId в конструкторе.
Таким образом, класс аккумулирует данные в пачки по 100 элементов и отправляет их на сервер, сохраняя ответы с временными метками.