Как Вы создаете асинхронный Запрос HTTP в JAVA?

Я довольно плохо знаком с Java, таким образом, это может казаться очевидным для некоторых. Я работал много с ActionScript, который является в значительной степени базирующимся событием, и я люблю это. Я недавно попытался записать маленький бит кода Java, который делает запрос POST, но я столкнулся с проблемой, что это - синхронный запрос, таким образом, выполнение кода ожидает запроса, чтобы завершить, привести к таймауту или представить ошибку.

Как я могу создать асинхронный запрос, где код продолжает выполнение, и обратный вызов вызывается, когда Запрос HTTP завершен? Я поглядел на потоки, но я думаю, что это - излишество.

74
задан Ned Batchelder 13 July 2010 в 02:02
поделиться

3 ответа

Java действительно более низкий уровень, чем ActionScript. Это все равно, что сравнивать яблоки с апельсинами. Хотя ActionScript обрабатывает все это прозрачно «под капотом», в Java вам необходимо самостоятельно управлять асинхронной обработкой (потоковой передачей).

К счастью, в Java есть java.util.concurrent API, который может делать это в хорошей манере.

В основном вашу проблему можно решить следующим образом:

// Have one (or more) threads ready to do the async tasks. Do this during startup of your app.
ExecutorService executor = Executors.newFixedThreadPool(1); 

// Fire a request.
Future<Response> response = executor.submit(new Request(new URL("http://google.com")));

// Do your other tasks here (will be processed immediately, current thread won't block).
// ...

// Get the response (here the current thread will block until response is returned).
InputStream body = response.get().getBody();
// ...

// Shutdown the threads during shutdown of your app.
executor.shutdown();

где Запрос и Ответ выглядят следующим образом:

public class Request implements Callable<Response> {
    private URL url;

    public Request(URL url) {
        this.url = url;
    }

    @Override
    public Response call() throws Exception {
        return new Response(url.openStream());
    }
}

и

public class Response {
    private InputStream body;

    public Response(InputStream body) {
        this.body = body;
    }

    public InputStream getBody() {
        return body;
    }
}

См. Также:

48
ответ дан 24 November 2019 в 12:01
поделиться

Вы также можете посмотреть Async Http Client.

24
ответ дан 24 November 2019 в 12:01
поделиться

Возможно, вы захотите взглянуть на этот вопрос: Асинхронный ввод-вывод в Java?

Похоже, ваш лучший вариант, если вы не хотите самостоятельно препирать потоки это фреймворк. В предыдущем посте упоминается Grizzly, https://grizzly.dev.java.net/ , и Netty, http://www.jboss.org/netty/ .

Из документации netty:

Проект Netty представляет собой попытку предоставить платформу асинхронных событийно-управляемых сетевых приложений и инструменты для быстрой разработки поддерживаемых высокопроизводительных и масштабируемых протокольных серверов и клиентов.

6
ответ дан 24 November 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: