这篇文章继续了My My Java 9 Features博客文章中对Java9功能的探索。 在这里,我们用在Java9 HTTP / 2客户端和进程API试验JShell
HTTP / 2客户端
HTTP / 2客户端是Java9中的孵化器项目。 这意味着该API尚未最终确定,因此在将来的版本中仍有一定的更改范围。 从Java9到Java10的最明显变化是将其从jdk.incubator.httpclient模块移动到“ http.client”模块,以及相关的软件包名称更改。 使用API时应牢记这一点。
HTTP / 2不能直接在jshell中正常工作,但是它可以让我们看到Java Platform Modularity System(JPMS)的运行。 我们只需使用–add-modules –将httpclient模块传递到jshell中
C:\jdk9TestGround>jshell -v --add-modules jdk.incubator.httpclient
然后,我们导入http库–
jshell> import jdk.incubator.http.*;
现在,我们可以从jshell调用网站–
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请求,包括身份验证。
语法与Http / 2兼容的Jetty HttpClient和okhttp相似。 绝对比Java中的旧方法简单得多。
此API的其他有用功能是–
- 异步请求–由于它是非阻塞的,因此比上面的示例更有用。 这是通过HttpRequest.sendAsync方法完成的
- WebSockets –通过具有自己的WebSocket.Builder的WebSocket类创建。 我将在另一篇文章中介绍它,因为它比在jshell中更清晰
流程API
流程API简化了Java中对流程信息的访问。
考虑一下我当前的Jshell流程的细节–
jshell> System.out.println(ProcessHandle.current().pid());
8580jshell> 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]
我们还可以访问系统进程和ID –
jshell> ProcessHandle.allProcesses().forEach(p -> System.out.println(p.pid()));
8276
9720
8012
480
或资讯–
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]]
现在我们可以访问可以杀死选择性过程的进程-让我们杀死记事本-
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();
如果destroy不能终止进程,我们还可以选择destroyForce。
上面的示例显示了Process API对于启动,终止和监视进程有多么有用和简单。 它使我们摆脱了依赖第三方库提供过程控制的麻烦
翻译自: https://www.javacodegeeks.com/2017/10/experimenting-java9-http-client-process-api-jshell.html