Написал рест клиент для выгрузки данных:
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.
Разобрался! Может кому понадобиться. Все дело в значениях передаваемые в цикл. А передавал я не номера страниц, а общее количество записей. Делим "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.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
В главной активности у меня стоит ViewPager перелистывающий 4 страницы (фрагмента)В 1 фаргменте используется LoaderManager для асинхронной загрузки...
Добрый день! Есть listener, который слушает очередь JMS MQ и отправляет ответ по умолчаниюВозможно ли добавить вторую очередь для ответов и сформировать...
Написал java request для Jmeter,который получает объект по ключу из hazelcastОбъект я вижу только в логах Jmeter
Читаю Хорстмана Java 8 изданиеВ одной из глав используются статические методы интерфейса Comparator