Есть ли способ поставить своего рода идентификатор для асинхронных запросов? - PullRequest
0 голосов
/ 10 июня 2019

У меня есть сервер и клиент, который отправляет запросы.Мне не нужно идентифицировать запросы, когда он работает в режиме синхронизации.Но в асинхронном режиме каждый запрос должен иметь идентификатор, поэтому я могу быть уверен, что ответ соответствует точному запросу.Сервер не подлежит обновлению, я должен поставить идентификатор в коде клиента.Есть ли способ сделать это?Я не могу их найти.

Вот мой основной класс.Я думаю, все должно быть ясно, класс очень прост.

public class MainAPITest {
    private static int userId = 0;
    private final static int NUM_OF_THREADS = 10;
    private final static int NUM_OF_USERS = 1000;

    public static void main(String[] args) {
        Security.addProvider(new GammaTechProvider());
        ExecutorService threadsExecutor = Executors.newFixedThreadPool(NUM_OF_THREADS);
        for (int i = 0; i < NUM_OF_USERS; i++) {
            MyRunnable user = new MyRunnable();
            userId++;
            user.uId = userId;
            threadsExecutor.execute(user);
        }
        threadsExecutor.shutdown();
    }
}

class MyRunnable implements Runnable {
    int uId;

    @Override
    public void run() {
        try {
            abstrUser user = new abstrUser();
            user.setUserId(uId);
            user.registerUser();
            user.chooseAndImplementTests();
            user.revokeUser();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Класс пользователя описывает поведение пользователя.Это достаточно долго, ИДК, если это необходимо здесь.Пользователь запускает ряд случайных тестов.Каждый тест имеет свой собственный класс, который расширяет класс абстрактных тестов, в котором установлено соединение http:

import org.json.JSONObject;
import javax.xml.bind.DatatypeConverter;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

public abstract class abstractRESTAPITest {
    protected String apiUrl;

    public abstractRESTAPITest() {
    }

    protected byte[] sendRequest(JSONObject jsonObject) throws IOException {
        return this.sendRequest(jsonObject, (String) null, (String) null);
    }   

    protected byte[] sendRequest(JSONObject jsonObject, String username, String password) throws IOException {  
        HttpURLConnection httpURLConnection = (HttpURLConnection) (new URL(this.apiUrl)).openConnection();
        if (username != null && password != null) {
            String userPassword = username + ":" + password;
            httpURLConnection.setRequestProperty("Authorization", "Basic " + DatatypeConverter.printBase64Binary(userPassword.getBytes()));
        }

        httpURLConnection.setRequestProperty("Content-Type", "application/json");
        httpURLConnection.setDoOutput(true);
        DataOutputStream dataOutputStream = new DataOutputStream(httpURLConnection.getOutputStream());
        dataOutputStream.write(jsonObject.toString().getBytes());
        dataOutputStream.flush();
        System.out.println("REST send: " + jsonObject.toString());
        if (httpURLConnection.getResponseCode() != 200) {
            System.out.println("REST send error, http code " + httpURLConnection.getResponseCode() + " " + httpURLConnection.getResponseMessage());
            throw new IOException();
        } else {
            byte[] responseBody = null;
            StringBuilder data = new StringBuilder();
            BufferedReader br = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
            String line = "";

            while ((line = br.readLine()) != null) {
                data.append(line);
                responseBody = data.toString().getBytes();
            }

            if (br != null) {
                br.close();
            }
            return responseBody;
        }
    }   

    public abstract boolean test();

}

Теперь я пытаюсь преобразовать часть кода httpUrlConnection в нечто вроде этого.

Jsonb jsonb = JsonbBuilder.create();

var client = HttpClient.newHttpClient();

var httpRequest = HttpRequest.newBuilder()
        .uri(new URI(apiUrl))
        .version(HttpClient.Version.HTTP_2)
        .header("Content-Type", "application/json")
        .POST(HttpRequest.BodyPublishers.ofString(jsonb.toJson(jsonObject)))
        .build();

client.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofString());

Он должен отправить запрос JSON и получить ответ JSON.HttpClient, представленный в Java11, имеет собственный метод sendAsync, поэтому я стараюсь его использовать.Но я не совсем понимаю, как это работает, поэтому у меня нет успеха.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...