Her er nyhederne i Java 11

Ny HTTP-klient og ud med CORBA er blandt godterne i den kommende udgave af Java.

Det er sommer på den nordlige halvkugle af kloden, og det betyder, at en ny Java-version er tæt på at finde sin færdige form. Med version 10 overgik Java til en køreplan med halvårlige udgaver, og det betyder, at versionerne færdiggøres sommer og vinter, og udkommer forår og efterår.

Den største nyhed i 11’eren er en ny HTTP-klient, som skal afløse den bedagede URLConnection-klasse fra Java 1.0-tiden. HTTP-klienten giver som URLConnection mulighed for at foretage HTTP-kald fra klientsiden, til REST-kommunikation og andre formål, men understøtter HTTP i version 2.0, udover klassikerne 1.0 og 1.1, samt de nye websockets-protokoller, der etablererer en HTTP-lignende forbindelse, men med færre headere og anden overhead.

HTTP-klienten har egentlig været med i OpenJDK i en testudgave siden version 9, men er nu forfremmet til fuldgyldigt medlem af biblioteksfamilien.

Klienten kan minde om Apache-projektets pendant og har mange tilsvarende faciliteter. Kald kan udføres blokerende eller asynkront, via Java 8’s CompletableFuture-klasse.

I eksemplet her skaber vi en HttpClient via dets ‘fluent’-api, hvor et builder-objekt konfigureres efter behov. Her beder vi om en klient, der bruger HTTP2-protokollen, og der er mange andre muligheder, såsom at fastsætte proxy, redirect-adfærd, timeout-tid og så videre.

Request-objektet skabes også med en fluent builder. Herunder foretager vi et blokerende kald med HttpClient.send-metoden til en HTTP2-testserver. Retur får vi et HttpResponse-objekt, og dets body-metode returnerer i dette tilfælde body’en i HTTP-svaret som en streng.

var client = HttpClient
  .newBuilder()
  .version(HttpClient.Version.HTTP_2)
  .build();
 
var request = HttpRequest
  .newBuilder()
  .uri(URI.create("https://http2.akamai.com/demo"))
  .build();
 
var response = client.send(request, 
  HttpResponse.BodyHandlers.ofString());
System.out.println("Fik denne HTTP-statuskode tilbage: " 
  + response.statusCode());
assert response.body().contains("Your browser supports HTTP/2!");

HttpClient-klassen kan også starte en websocket-session. Det gøres ved at kalde metoden HttpClient.newWebSocketBuilder.buildAsync, som returnerer et WebSocket-objekt, pakket ind i en CompletableFuture, der er en asynkron wrapper. Kaldet skal udstyres med en WebSocket.Listener-parameter, der håndterer svar fra serveren med handleren onText:
var listener = new WebSocket.Listener() {
  public CompletionStage<?> onText(WebSocket webSocket,
                 CharSequence message,
                 boolean last) {
    System.out.println("Websocket-serveren svarede: " + message);
    assert message.equals("Hvad drikker Møller?");
    return null;
  }
};  
 
var websocketFuture = client.newWebSocketBuilder()
   .buildAsync(URI.create("wss://echo.websocket.org"), listener);

WebSocket-objektet inde i wrapperen tilgås med join-metoden på CompletableFuture-objektet, der returnerer, når serverforbindelsen er initieret. Nu kan der sendes meddelelser til serveren, som i dette tilfælde er en ekko-tjeneste, der blot returnerer den sendte streng. Strengen sendes afsted med metoden WebSocket.sendText. Svaret håndteres som sagt i listenerens onText-handler.
websocketFuture.join().sendText("Hvad drikker Møller?", true);
 
// Vi venter lige på svar fra serveren, før vi slutter...
Thread.sleep(10000);

Annotationer i lambda-udtryk

Java 11 kommer med endnu en nyhed for programmørerne, som dog er ganske minimal. Det går ud på at man i et lambda-udtryk, som f.eks.:

(x, y) -> x.process(y) 

(hvor typerne er implicitte), kan skrive “var” foran, som indført i Java 10:
(var x, var y) -> x.process(y)

Det ser lidt dumt ud, men humlen er, at det er påkrævet, hvis der skal bruges annotationer i parameterlisten, som i
(@Nonnull var x, @Nullable var y) -> x.process(y)

- hvor annotationerne i dette eksempel kan sætte statiske værktøjer i stand til at vurdere, om der kan være null-referencer eller ej i kaldet.

Java som scripts

En ny skæg mulighed går ud på at afvikle Java-programmer, der består af en enkelt kildefil, ligesom et script i Unix-verdenen. Det vil sige, at man i et terminalvindue blot kan skrive:

java Program.java

- og så kompileres der til hukommelsen, hvorefter programmet afvikles.

Et nyt ‘flight recorder’-værktøj kan opsamle data under kørsel, med henblik på profilering og debugging, ved at indsætte specielle annotationer i koden. Det skulle give tæt på intet ydelsestab, når facilitaten er slået fra, og ikke mere end én procents tab, når den er slået til.

Resten af nyskabelserne har ikke så meget med den almindelige programmørs hverdag at gøre:

Gamle CORBA-klasser pilles ud af klassebibliotekerne. CORBA var en standard for interoperabilitet mellem objektorienterede sprog, som forlængst er afløst af SOAP, WS* og REST. Unicode opgraderes til den seneste udgave, nummer 10, og der kommer en ny, sjov garbage collector, Epsilon, der paradoksalt nok slet ikke gør noget som helst. Det kan anvendes til kortlivede mikrotjenester, hvor afviklingen er slut, længe før processen løber tør for hukommelse.

Blandt andre nyheder er forbedret ydelse på ARM 64-bit processorer og opdaterede kryptografiske biblioteker.

Java 11 står til udsendelse i slutningen af september, og api’erne er endnu ikke fastfrosset - det sker senest i midten af august. Det har formodentligt ikke den store betydning i denne omgang, da HTTP-klienten, som er den største nyhed, har været i test i flere år og næppe får api-ændringer i sidste øjeblik.

Eksemplet med HTTP-klienten kan downloades fra Gitlab, for det er vist det, de unge vil ha'. Der er mere information om Java 11 på projektets hjemmeside. Den endnu ufærdige version af Java 11 kan downloades her. Eksemplet er skrevet med build 18 og testet med det seneste build 19.

Tips og korrekturforslag til denne historie sendes til tip@version2.dk
Følg forløbet
Kommentarer (8)
Sune Marcher

Eksemplet med HTTP-klienten kan downloades fra Gitlab, for det er vist det, de unge vil ha'.

Hej Tania,

Det er ikke så meget hvor koden kan hentes fra, der er det afgørende – det folk gerne vil have fra Gitlab eller GitHub er de features platformene tilbyder... som totalt bliver misset, hvis du bare uploader en .zip :-)

Det er features som fx versionshistorik, at kunne se de enkelte filer online uden at skulle downloade, nemt at kunne klone et repository og lave sine egne eksperimenter.

Sune Marcher

Jeg læste nu Tanias indlæg som en kommentar til at mange overvejer, eller allerede har gennemført, et skifte fra GitHub til GitLab som følge af Microsofts nylige overtagelse af GitHub.


Det kan også sagtens tænkes. Der har dog været kommentarer tidligere, og GitLab linket til denne artikel er stadig en .zip - så jeg tænkte at Tania måske ikke havde fanget hvorfor der tidligere blev foreslået GitHub. Min egen kommentar på tidligere artikel kunne have været mere hjælpsomt formuleret :)

Log ind eller Opret konto for at kommentere
Pressemeddelelser

Welcome to the Cloud Integration Enablement Day (Bring your own laptop)

On this track, we will give you the chance to become a "Cloud First" data integration specialist.
15. nov 2017

Silicom i Søborg har fået stærk vind i sejlene…

Silicom Denmark arbejder med cutting-edge teknologier og er helt fremme hvad angår FPGA teknologien, som har eksisteret i over 20 år.
22. sep 2017

Conference: How AI and Machine Learning can accelerate your business growth

Can Artificial Intelligence (AI) and Machine Learning bring actual value to your business? Will it supercharge growth? How do other businesses leverage AI and Machine Learning?
13. sep 2017