Как запустить rest-client в 3 потока?

319
07 февраля 2018, 12:57

Написал рест клиент для выгрузки данных:

public class RestClient implements Runnable {
private Gson gson = new Gson();
private int fromPage; //номер страницы с которой начинается выгрузка данных с сервиса
private int toPage;
private String name;
public RestClient(int fromPage, int toPage, String name) {
    this.fromPage = fromPage;
    this.toPage = toPage;
    this.name = name;
}
public void getJson(int page) { //метод который выгружает данные с веб-сервиса
    //выгружаем данные с веб-сервиса
    Client client = Client.create();
    WebResource webResource = client
            .resource("https://ows.goszakup.gov.kz/contract?page=" + page + "&limit=50");
    ClientResponse response = webResource.accept("application/json")
            .header("Authorization", "Bearer 1b75e3fc135e35daa1cb4dfee98aa")
            .get(ClientResponse.class);
    if (response.getStatus() != 200) {
        throw new RuntimeException("Failed : HTTP error code : "
                + response.getStatus());
    }
    //записываем в БД
    EntityManager entityManager = Persistence
            .createEntityManagerFactory("rest")
            .createEntityManager();
    EntityTransaction transaction = entityManager.getTransaction();
    transaction.begin();
    RootObject rootObject = gson.fromJson(response.getEntity(String.class), RootObject.class); //парсим JSON в Java объект
    List<Item> items = rootObject.getItems();
    for (Item item : items) {
        entityManager.persist(item);
    }
    transaction.commit();
    entityManager.close();
}
public void run() {
    for (int i = fromPage; i < toPage; i++) {
        getJson(fromPage);
        System.out.println(name + ", страница: " + i);
    }
  }
}

Класс для запуска потоков:

public class Main {
public static void main(String[] args) {
    try {
        TrustCertificate certificate = new TrustCertificate();
        certificate.doTrustToCertificates();
        Thread thread1 = new Thread(new RestClient(1, 1193550, "Поток: 1"));
        Thread thread2 = new Thread(new RestClient(1193551, 2387100, "Поток: 2"));
        Thread thread3 = new Thread(new RestClient(2387101, 3580650, "Поток: 3"));
        thread1.start();
        thread2.start();
        thread3.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
  }
}

Работает только один поток из 3, в чем может быть проблема? При запуске получаю:

Exception in thread "Thread-2" Exception in thread "Thread-1" 
java.lang.RuntimeException: Failed : HTTP error code : 500
at kz.samgau.services.RestClient.getJson(RestClient.java:41)
at kz.samgau.services.RestClient.run(RestClient.java:61)
at java.lang.Thread.run(Thread.java:748)
java.lang.RuntimeException: Failed : HTTP error code : 500
at kz.samgau.services.RestClient.getJson(RestClient.java:41)
at kz.samgau.services.RestClient.run(RestClient.java:61)
at java.lang.Thread.run(Thread.java:748)

Вот пример ответа сервиса по первому потоку:

{
"total": 3580650,
"max_page": 71613,
"current_page": 1,
"limit": 50,
"items": [
    {
        "id": 4818488,
        "contract_number": "24/1",
        "contract_number_sys": "041140005608/180023/01",
        "trd_buy_id": 0,
        "trd_buy_number_anno": null,
        "ref_contract_type_id": 2,
        "ref_contract_status_id": 190,
        "crdate": "2018-02-01 15:51:50",
        "contract_sum_wnds": 1241350,
        "supplier_id": 163765,
        "supplier_biin": "750104302067",
        "customer_id": 16309,
        "customer_bin": "041140005608",
        "index_date": "2018-02-01 16:06:51",
        "system_id": 3
    } ...

то есть по первому потоку все отрабатывает, записывается в БД. А последующие два потока падают при первом же запуске с ошибкой 500.

Answer 1

Разобрался! Может кому понадобиться. Все дело в значениях передаваемые в цикл. А передавал я не номера страниц, а общее количество записей. Делим "max_page" на 3 и готово, теперь работают все 3 потока:

{
 "total": 3580650,
 "max_page": 71613,
 "current_page": 1,
 "limit": 50,
 "items": [
Thread thread1 = new Thread(new RestClient(5291, 23871, "Поток: 1"));
Thread thread2 = new Thread(new RestClient(23872, 47742, "Поток: 2"));
Thread thread3 = new Thread(new RestClient(47743, 71614, "Поток: 3"));

то есть веб-сервис не находил у себя те страницы которые я передавал и падал с ошибкой 500.

READ ALSO
Почему крашится LoaderManager при переключении вкладки ViewPager?

Почему крашится LoaderManager при переключении вкладки ViewPager?

В главной активности у меня стоит ViewPager перелистывающий 4 страницы (фрагмента)В 1 фаргменте используется LoaderManager для асинхронной загрузки...

267
Как добавить вторую очередь для ответа @JmsListner

Как добавить вторую очередь для ответа @JmsListner

Добрый день! Есть listener, который слушает очередь JMS MQ и отправляет ответ по умолчаниюВозможно ли добавить вторую очередь для ответов и сформировать...

215
jmeter hazelcast

jmeter hazelcast

Написал java request для Jmeter,который получает объект по ключу из hazelcastОбъект я вижу только в логах Jmeter

189
Как работает Comparator в Java

Как работает Comparator в Java

Читаю Хорстмана Java 8 изданиеВ одной из глав используются статические методы интерфейса Comparator

305