Этот пост продолжает мое исследование возможностей 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, являются их собственными. |