0

У меня есть веб-приложение Java, размещенное на Google App Engine (GAE). Пользователь нажимает кнопку, и он получает таблицу данных со 100 строками. В нижней части страницы есть кнопка «Сделать веб-службы». Нажав на это, приложение будет принимать по одной строке за раз и сделать вызов сторонних веб-сервисов с использованием класса URLConnection. Эта часть работает нормально.Google App Engine - http-запрос/ответ

Однако, поскольку существует ограничение на 60 секунд для цикла HttpRequest/Response, все 100 транзакций не проходят, поскольку тайм-аут происходит около строки 50 или около того.

Как создать цикл и отправить вызовы веб-сервисов без использования пользователем нескольких вызовов «Сделать вызовы Webservice» более одного раза?

Есть ли способ остановить цикл до 60 секунд, а затем начать снова, не совершая HttpResponse? (Я не хочу использовать асинхронный бэкэнд Google).

Кроме того, не GAE загрузки файла поддержки (чтобы получить 100 строк из файла вместо базы данных)

спасибо.

Добавление некоторого кода в соответствии с комментариями:

URL url = new URL(urlString); 

HttpURLConnection connection = (HttpURLConnection) url 
         .openConnection(); 
       connection.setDoOutput(true); 
       connection.setRequestMethod("POST"); 
       connection.setConnectTimeout(35000); 
       connection.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); 
       connection.setRequestProperty("Authorization", encodedCredentials); 

       // Send post request 
       DataOutputStream wr = new DataOutputStream(
         connection.getOutputStream()); 
       wr.writeBytes(submitRequest); 
+0

Вы можете разместить текущие коды, которые делают соединение HTTP? –

+0

@DevilingMaster обновлен с кодом – user972391

ответ

1

Все зависит от того, что происходит с результатами этих вызовов.

Если результаты не возвращаются в пользовательский интерфейс, нет необходимости блокировать его. Вы можете использовать Tasks API для создания 100 задач и возврата ответа пользователю. Это займет всего несколько секунд. Дополнительным преимуществом является то, что вы можете выполнять до 10 вызовов параллельно с помощью задач.

Если результаты должны быть возвращены пользователю, вы можете использовать до 10 потоков для обработки как можно большего количества запросов. Надеюсь, это принесет вам время менее 1 минуты, но вы не можете гарантировать его, так как вы зависите от ответов сторонних ресурсов, которые, возможно, недоступны на данный момент. Вам придется реализовать свой собственный механизм повтора.

Также обратите внимание, что пользователи не привыкли ждать несколько минут для ответа на сайт. Вы можете рассмотреть другой подход, когда пользователь уведомляется после обработки последнего запроса без блокировки вашего кода клиента.

И да, вы можете загружать данные из файлов в App Engine.

+0

да, мне нужно показать результаты для пользователя. У вас есть ссылки на любые примеры, которые выполняют задачи в потоках? Не предназначены ли только для программ Backend? Может ли GAE Frontend также использовать задачи? – user972391

+0

Задачи по умолчанию предназначены для ваших обычных (frontend) экземпляров. Вы должны указать бэкэнд, если хотите, чтобы они выполнялись там. Что касается потоков, вы ничего не должны делать, если используете задачи - просто настройте приложение для обеспечения потокобезопасности и настройте очередь (https://cloud.google.com/appengine/docs/java/config/queue) –

0

Попробуйте использовать asynchronous urlfetch звонков:

LinkedList<Future<HttpResponse>> futures; 

// Start all the request 
for (Url url : urls) { 
    HttpRequest request = new HttpRequest(url, HTTPMethod.POST); 
    request.setPayload(...) 
    futures.add(urlfetchservice.fetchAsync(request); 
} 

// Collect all the results 
for (Future<HttpResponse> future : futures) { 
    HttpResponse response = future.get() 
    // Do something with future 
} 
+0

Мое приложение - это приложение Java (не Python) – user972391

+0

@ user972391- API-интерфейс GAE Java также имеет [асинхронный API] (https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/ апи/UrlFetch/URLFetchService # fetchAsync (com.google.appengine.api.urlfetch.HTTPRequest)). –

+0

@ user972391 - обновлен для среды выполнения Java. –