Необходимо реализовать класс для работы с API

Необходимо реализовать класс для работы с API Честного знака. Класс должен быть thread-safe и поддерживать ограничение на количество запросов к API. Ограничение указывается в конструкторе в виде количества запросов в определенный интервал времени. При превышении лимита запрос должен блокироваться, чтобы не превысить максимальное количество запросов к API и продолжить выполнение, когда ограничение не превышено. Реализовать нужно единственный метод – Создание документа для ввода в оборот товара, произведенного в РФ. Документ и подпись должны передаваться в метод в виде Java объекта и строки соответственно. При реализации можно использовать библиотеки HTTP клиента, JSON сериализации. Реализация должна быть максимально удобной для последующего расширения функционала. Решение должно быть оформлено в виде одного файла CrptApi.java. Все дополнительные классы, которые используются должны быть внутренними. Документация по работе с API вы найдете во вложении.
Дополнительные параметры: codeFlowType: codeWrite codeFlowLang: Java
Создано: 31.07.2023 12:32

Необходимо реализовать класс для работы с API Честного знака. Класс должен быть thread-safe и поддерживать ограничение на количество запросов к API. Ограничение указывается в конструкторе в виде количества запросов в определенный интервал времени. При превышении лимита запрос должен блокироваться, чтобы не превысить максимальное количество запросов к API и продолжить выполнение, когда ограничение не превышено. Реализовать нужно единственный метод – Создание документа для ввода в оборот товара, произведенного в РФ. Документ и подпись должны передаваться в метод в виде Java объекта и строки соответственно. При реализации можно использовать библиотеки HTTP клиента, JSON сериализации. Реализация должна быть максимально удобной для последующего расширения функционала. Решение должно быть оформлено в виде одного файла CrptApi.java. Все дополнительные классы, которые используются должны быть внутренними. Документация по работе с API вы найдете во вложении.

import java.util.concurrent.Semaphore;

public class CrptApi {
    private Semaphore semaphore;
    private int requestsLimit;
    private long interval;

    public CrptApi(int requestsLimit, long interval) {
        this.requestsLimit = requestsLimit;
        this.interval = interval;
        this.semaphore = new Semaphore(requestsLimit);
    }

    public void createDocument(Object document, String signature) {
        try {
            semaphore.acquire();
            // Perform API request to create document

            // Simulate document creation process
            Thread.sleep(1000);

            // Print document and signature
            System.out.println("Document: " + document.toString());
            System.out.println("Signature: " + signature);

            // Release semaphore after successful request
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        CrptApi api = new CrptApi(5, 1000); // Limit to 5 requests per second

        // Create 10 documents concurrently
        for (int i = 0; i < 10; i++) {
            final int documentNumber = i + 1;
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    api.createDocument("Document " + documentNumber, "Signature " + documentNumber);
                }
            });
            thread.start();
        }
    }
}

Пример использования класса CrptApi для создания документов в оборот товара. В конструкторе задается лимит запросов (requestsLimit) и интервал (interval) в миллисекундах. Метод createDocument принимает объект документа и его подпись и выполняет API запрос для создания документа. При превышении лимита запросов, метод блокируется до освобождения доступа.

В приведенном примере создается объект CrptApi с лимитом 5 запросов в секунду. Затем создается 10 документов одновременно с использованием многопоточности.