Статьи

Эксперимент с HTTP-клиентом Java9 и API процесса в JShell

Этот пост продолжает мое исследование возможностей Java9 из моего блога My Top Java 9 Features . Здесь мы экспериментируем с Java9 HTTP / 2 Client и Process API в JShell

Клиент HTTP / 2

HTTP / 2 Client — это инкубаторный проект на Java9. Это означает, что API не завершен, поэтому есть некоторые возможности для изменений в будущих версиях. Наиболее очевидные изменения с Java9 на Java10 — это перемещение его из модуля jdk.incubator.httpclient в модуль «http.client», а также изменения имени соответствующего пакета. Стоит помнить об этом при использовании API.

HTTP / 2 не работает прямо из коробки в jshell, но это нормально, так как позволяет нам увидеть систему модульности Java Platform (JPMS) в действии. Мы просто передаем модуль httpclient в jshell с помощью –add-modules —

1
C:\jdk9TestGround>jshell -v --add-modules jdk.incubator.httpclient

Затем мы импортируем библиотеки http —

1
jshell> import jdk.incubator.http.*;

Теперь мы можем позвонить на сайт из jshell —

1
2
3
4
5
jshell> HttpClient httpClient = HttpClient.newHttpClient();
jshell> HttpRequest httpRequest = HttpRequest.newBuilder().uri(new URI("https://www.javabullets.com")).GET().build();
jshell> HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandler.asString());
jshell> System.out.println(httpResponse.statusCode());
jshell> System.out.println(httpResponse.body());

Наиболее интересной особенностью является использование шаблона Builder для создания HTTP-запроса. Это определено в HttpRequest.Builder, который может использоваться для создания более сложных запросов HttpClient, включая аутентификацию.

Синтаксис похож на Jetty HttpClient и okhttp, которые совместимы с Http / 2. Это определенно намного проще, чем старый подход в Java.

Другие полезные функции этого API —

  • Асинхронные запросы — это более полезно, чем в приведенном выше примере, поскольку оно не блокирует. Это делается с помощью метода HttpRequest.sendAsync.
  • WebSockets — создается с помощью класса WebSocket, который имеет собственный WebSocket.Builder . Я собираюсь рассказать об этом в другом посте, так как он более понятен, чем на jshell.

API процесса

API-интерфейс процесса упрощает доступ к информации о процессе в Java.

Рассмотрим детали моего текущего процесса Jshell —

1
2
3
4
5
6
7
8
jshell> System.out.println(ProcessHandle.current().pid());
8580
  
jshell> System.out.println(ProcessHandle.current().info());
[user: Optional[NEW-EJ0JTJ5I9B9\javabullets], cmd: C:\Program Files\Java\jdk-9\bin\java.exe, startTime: Optional[2017-10-09T19:41:21.743Z], totalTime: Optional[PT4.625S]]
  
jshell> System.out.println(ProcessHandle.current().parent());
Optional[6592]

Мы также можем получить доступ к системным процессам и идентификаторам —

1
2
3
4
5
jshell> ProcessHandle.allProcesses().forEach(p -> System.out.println(p.pid()));
8276
9720
8012
480

Или информация —

1
2
3
4
5
jshell> ProcessHandle.allProcesses().forEach(p -> System.out.println(p.info()));
  
[user: Optional[NEW-EJ0JTJ5I9B9\javabullets], cmd: C:\Program Files (x86)\PFU\ScanSnap\Update\ScanSnapUpdater.exe, startTime: Optional[2017-10-09T18:28:42.812Z], totalTime: Optional[PT0.78125S]]
[user: Optional[NEW-EJ0JTJ5I9B9\javabullets], cmd: C:\Windows\explorer.exe, startTime: Optional[2017-10-09T18:35:08.397Z], totalTime: Optional[PT25.234375S]]
[user: Optional[NEW-EJ0JTJ5I9B9\javabullets], cmd: C:\Windows\System32\cmd.exe, startTime: Optional[2017-10-09T18:36:11.522Z], totalTime: Optional[PT0.078125S]]

Теперь у нас есть доступ к процессам, которые мы можем убить выборочный процесс — давайте убить блокнот —

1
2
3
4
jshell> Process p = new ProcessBuilder("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe").start();
p ==> Process[pid=9644, exitValue="not exited"]
  
jshell> p.destroy();

У нас также есть возможность уничтожить принудительно, если уничтожение не убивает процесс.

Приведенные выше примеры показывают, насколько полезен и прост Process API для запуска, уничтожения и мониторинга процессов. Это освобождает нас от использования сторонних библиотек для контроля процессов

Опубликовано на Java Code Geeks с разрешения Мартина Фаррелла, партнера нашей программы JCG . См. Оригинальную статью здесь: Экспериментирование с Java9 HTTP Client и Process API в JShell

Мнения, высказанные участниками Java Code Geeks, являются их собственными.