Java 8 och molnet i fokus på Devoxx 2013

Java 8 och molnet i fokus på Devoxx 2013
december 4, 2013 erik.lupander@squeed.com

Min kollega Andreas har i en tidigare bloggpost redogjort för sina intryck från årets devoxx i articleAntwerpen. I denna bloggpost tänkte jag komplettera hans post med lite mer detaljerade intryck från ett antal av de föreläsningar jag kikade på.

Java 8 keynote

Java 8 var helt klart i fokus på många sätt och vis under konferensen, och var det någon feature som fick extra mycket uppmärksamhet så var det Lambda Expressions som nu äntligen blir en del av standard-Java. På hög nivå pratades det under bl.a. keynoten om hur Java åldrats sedan 1995 och vilken utmaning det är att utveckla språket utan att rucka på bakåtkompatibiliteten. Man har valt att använda samma syntax för lambdas som C# och Scala redan använder eftersom det dels är inarbetat redan och att inga av de alternativ som lades fram överlag var särskilt mycket bättre än något annat. Speciellt korta ”inline”-lambdas blir estetiskt tilltalande med den valda syntaxen och typinferensen gör såklart också sitt till för att hålla kodens pratighet nere. Den här sidan hos Oracle går snabbt och enkelt igenom hur lambdauttryck kan förenkla programmerarens vardag framöver. Min favorit kommer nog bli stream-API:t som på ett mycket elegant och effektivt vis ger oss funktionella operationer på javas Collections.

List<Person> filteredPersonList = persons.filter(p -> p.getAge() > 18)
.collect(toList());

Vidare så pushade Oracle mycket för Java i kontexten av ”The Internet of Things”. Jag hade inte hört detta begrepp förut, men Oracle pratar gärna om ”3 Billion Devices run Java” och under keynoten visades lite olika apparater upp som körde senaste versionen av Java SE Embedded. Jag tycker kanske att deras hemmabyggda surfplatta gav lite eko av vuxendagis, för att inte tala om den javakontrollerade robotarm som kunde flytta runt schackpjäser utifrån ett parti mellan surfplattan och en bärbar dator. Men visst – jag förstår poängen Oracle vill framföra – att Java är moget och användbart för så oerhört mycket mer än bara serverside och de mer sällsynta klientapplikationerna.

Lambda: A peek under the hood

I en angränsande session gick Brian Goetz från Oracle igenom ”Lambda: A peek under the hood” där han på väldigt tekniskt avancerad nivå redogjorde för hur man internt implementerat lambdauttryck i Java 8. Mycket av informationen om mängden bytekod, invokedynamic kontra invokevirtual, callsites etc. är nog inte så relevant för den genomsnittlige utvecklaren utan är rimligen mest intressant för personer som arbetar med VM-utveckling eller för att ta fram egna språk på JVM:n. Jag uppskattade dock insikten om hur många olika aspekter de varit tvungna att ta hänsyn till för att bygga in lambda-stödet i språket och fick klart större förståelse för varför det blir först 2014 som Java får officiellt stöd för detta. Först hade dom varit inne på att implementera lambdas såsom Method Handles, men det hade en del svagheter. Ett annat alternativ var Function Types, men det blev enligt Goetz oerhört komplext i vissa corner cases. Den här diskussionen går lite mer på djupet för den som är intresserad om varför det inte blev Function Types i Java 8. Det fanns också lite diskussion kring anonyma inre klasser, men det var tydligen också en återvändsgränd. Istället föll slutligen valet på Functional Interfaces, där den absolut enklaste beskrivningen är att alla interface med en metod i Java 8 implicit är funktionella interface. T.ex. så kan java.lang.Runnables run()-metod kan utan vidare uttryckas såsom ett lambda-uttryck:

Runnable r2 = () -> { System.out.println("Hello world!"); };

Goetz verkade mycket nöjd med deras implementation av lambda-uttryck, både arkitekturellt men också ur prestandahänseendet. Man får skilja på capturing och non-capturing lambdas (grovt förenklat, huruvida ens ”closure scope” behöver känna till variabler från kringliggande kod eller ej, läs mer här). Man mäter exempelvis på CPU-tid för att skapa lambdauttryck jämfört med att skapa en instans av en anonym inre klass i Java 7. Se sidan 16 från Goetz presentation för hans siffror. Kontentan är att skapande av capturing lambdas i stort sett går exakt lika snabbt som anonyma inre klasser, medan non-capturing är ca 4x så snabbt såväl som enkel- som flertrådat.

Brian Goetz är helt klart ett av de vassare besticken i lådan och det är ett rent nöje att lyssna på honom!

Reactive Programming with JDK8

Om vi fortsätter på Java 8-spåret så besökte jag också en presentation om ”Reactive Programming with JDK8”. Detta var en av de klart sämre presentationerna. Presentatören pratade väldigt fort och tappade ofta sin presentationsmässiga röda tråd genom att ideligen blanda in Scala och Play Framework i resonemangen. Presenterar man en ny feature i Java 8 kanske man inte skall ha kodexempel skrivna i Scala? Poängen var hur som helst den i Java 8 uppdaterade ForkJoinPool med tillhörande forking, joining och failing. Kunde ha varit intressant, handlar ju om att lösa asynkron programmering, dela upp jobb på många ”workers” osv. på ett säkert och smidigt vis utan att själv behöva vara ninja på trådhantering. Jag blev visserligen medveten om att möjligheten att titta på detta längre fram, men den där härliga inspirationen som en riktigt bra presentation kan ge uteblev helt.

ElasticSearch och CouchBase

Denna session, presenterad av två charmanta fransmän, är något av en favorit så här i headerefterhand. Deras presentation gick ut på att transformera en klassisk JSP/Servlet/JDBC-applikation till en Angular/REST/NoSQL-lösning. Ibland träffar en presentation helt rätt  avseende en intressant lösning på ett logo_Couchbaseproblem man brottas med i sitt dagliga arbete. Utan på att gå in för mycket på detaljer så passar lösningen som presenterades – en databas med miljoner kundposter utan ett fast schema, sökbart via REST, väldigt rätt. NoSQL (CouchBase) för det dynamiska schemat med JSON för att representera dokument och ElasticSearch för förmågan att med nästan löjligt låg latency kunna göra avancerade sökningar bland miljontals poster med icke-uniformt schema. Dock så kommer sökbarheten med ett pris – ElasticSearch räknar med att indexen som ger denna fina sökbarhet tar minst 2x så mycket plats som den data den söker i. Jag har tidigare sneglat på Hibernate Search/Lucene för mitt reella sökproblem, något jag tror fungerar utmärkt – men där en traditionell relationsdatabas med dynamiskt schema representerat av JSON som Clob inte är särskilt CRUD-vänlig på fältnivå eller för den delen create och update-prestanda. Som alltid med presentationer så är säkerligen verkligheten svårare. Nu fanns någon form av brygga/plugin mellan Cloudbase och ElasticSearch på plats. Det analysverktyg de demonstrerade (Kibana) såg väldigt läckert och relativt lättjobbat ut – är det ”bara” att peka ut rätt buckets av data och börja bygga dashboards när det väl kommer till kritan?

Mycket bra presentation, även om jag personligen var mest intresserad av NoSQL- och sökdelarna. Angular/Spring MVC och hur de gjorde sin applikation RESTful var inte huvudgrejen och hade möjligen kunnat tonas ner lite.

Cloud Patterns

Trots svårbegriplig franskengelska var detta nog den föreläsning som gav mig mest under dag 2. Praktiska, handfasta tips att ta med sig när man skall gå från en klassisk ”1-serverinstallation” till molnet med allt vad det innebär. Skillnaderna mellan IaaS, PaaS, SaaS belystes och tydliggjordes. Skall några av tipsen nämnas så kan jag ta upp ”Be Stateless” som en av de viktigaste tumreglerna för att åstadkomma horisontell skalning. Sedan belyste föreläsaren att det i praktiken ofta är svårt att vara helt och hållet stateless – man har ofta user-sessions som krav på produkten, hur skall vi distribuera dessa? En annan sak man (alltid) ska vara noga med när det gäller enterprisesystem är (den i EJB 3.2 avskaffade) J2EE-idiomen ”never touch the disc”. Precis – i molnfallet skall lokal disk endast ses som en möjlighet till cachelagring. För lagring av resurser bör man använda t.ex. Amazon S3 eller något annat som möjliggör lagring av ”filer” på ett distribuerat och för applikationen platstransparent vis.

Som sagt, en mycket bra och nyttig föreläsning som satte fingret på flera frågor jag själv kommit i kontakt med i mitt eget arbete.

EJB 3.2

David Blevins, veteran från diverse JSR-grupper, presenterade här EJB 3.2. Inledningsvis så ryker en hel del av de äldsta delarna ur EJB-specifikationen nu, 225 sidor närmare bestämt (nu är den endast 466 sidor lång).  Entity 2.1, JAX-RPC, SOAP med mera. Man modulariserar det hela lite mer nu med s.k. API-groups där en viss container kan välja att endast stödja EJB Lite till exempel som kan ses som kärnfunktionaliteten i EJB.

Mest intressant här var hur han visade hur man lite av misstag fick de flesta att associera MDB som något hårt knutet till JMS, när detta egentligen inte riktigt var tanken från början. Med EJB 3.2 i Java EE 7 så kan man på allvar skriva @MessageDriven POJOs där i stort sett vad som helst kan vara meddelandekällan. Med tre javaklasser/interface och ra.xml så visades en @MessageDriven POJO upp som agerade telnetserver. Oerhört intressant sätt att öppna upp sin data för integration mot alla möjliga typer av klienter. Vill du skicka in data till din MDB via XMPP eller Jabber? Nu är det busenkelt att göra detta. Samt att öppna upp potentiella säkerhetshål om man inte vet vad man sysslar med, förvisso.

Transaktionella @PostConstruct och @PreDestroy på @Stateful session beans var en annan nyhet han lyfte fram. Även om jag personligen ytterst sällan nyttjar Stateful session beans ser jag nyttan med att kunna röra databasen transaktionellt i dessa viktiga livscykelmetoder. Mer relevant i min egen vardag blir möjligheten att ej ange @Local på vare sig på klassnivå för en @Stateless session bean eller på något av dess interface. Utelämnar man @Local och/eller @Remote blir bönan implicit en @Local. Detta exemplet visar hur man kan kombinera ett @Remote interface med ett implicit @Local interface också.

@Remote
public interface Foo { . . . }

@Stateless
public class Bean implements Foo, Bar {
    . . .
}

Läs mer hos Oracle.

Slutligen pratade han om hur framtiden ser ut för CDI och EJB, att användningsområdena för dessa blir allt mer lika och hur man något skämtsamt kan säga att CDI är EJB 4.0.

Android 4.4 KitKat

Denna presentation har Andreas redan skrivit om, men jag kan inte låta bli att skriva lite jag androidockså. Denna föreläsning blev faktiskt lite av en besvikelse för mig. Det var visserligen roligt att få se Romain Guy och Chet Haase i aktion ”IRL”, men innehållsmässigt kändes presentationen nästan som innantilläsning av innehållet på 4.4 release notes, möjligen uppiffat av lite mer exempel. Jag hade hoppats få höra betydligt mer om nya Android Runtime (ART) och kanske få någon form av inblick i hur Google ser på att integrera Java 8 features i Dalvik/ART. Med Android 4.4 har man precis fått ett gäng Java 7-features på plats: auto-close av strömmar, multi-catch och <> endast på vänstra sidan av en deklaration med generics (List<Integer> l = new ArrayList<>()) som gör koden mer lättläst. Nu kanske en liten del av besvikelsen i sig bottnar i att Android 4.4 KitKat kanske inte är alls så spännande ur plattformsperspektivet var som ICS (GPU pipeline, holo theme osv) eller Jelly Bean (project butter). Tyvärr, printerstöd och en ny filhanterare får inte upp min Androidpuls nämnvärt. Jo – en riktigt kul detalj är att man nu äntligen fått till GPU-stöd för beräkningar med Renderscript på de senaste Nexus-enheterna. Detta kanske låter som en petitess, men det öppnar upp oanade möjligheter för att göra intressanta saker på en mobil som tidigare varit alldeles för beräkningsintensiva. Tyvärr missade jag eftermiddagens session om ’Android Image manipulation’ som bl.a. skulle ta upp Renderscripts förmåga i den kontexten. Får hoppas alla presentationer dyker upp online vad det lider. Kanske som nöje på julafton medan barnen ser på Kalle Anka?

Spring 4.0

Jag jobbar nästan dagligen med Spring 3.1, men det stod väldigt tidigt klart för mig under den här presentationen att jag inte är någon direkt power-user. Sam Brannen från Swiftmind presnterade nyheterna i Spring 4.0. Och i ärlighetens namn skall sägas att 4.0 kommer med en massa nyheter kring saker jag i stort sett inte kommit i kontakt med själv. Smaken är såklart som baken – jag väljer t.ex. helst ett JAX-RS bibliotek för att REST-ifiera mina @Component POJOs, trots att Spring har inbyggt stöd för detsamma. Jag pluggar än så länge hellre in Netty för mina Web Sockets än använder vad Spring har out of the box osv. Men hur som helst var nyheterna ganska många kring divese spring-moduler och utifrån den ständiga handuppräckningen kring vilka moduler folk använder och känner till så finns det nog massor av matnyttigt för de som använder Spring till mer än bara en DI-container med lite transaktionsstöd, timers och persistenshantering.

Spring 4.0 ligger väl i fas med Java 8 och Java EE 7 och kommer stödja lambdauttryck och JSR-310, det nya biblioteket som inspirerats av jodatime. Man anammar också en del godis från Java EE 7: JPA 2.1, JMS 2.0 och JSR-356, Java API for Web Sockets.

Java EE 7 Web Sockets

Arun Gupta pratade om Web Sockets i Java EE 7, hur programmeringsmodellen ser ut och hur pass enkelt det är att komma igång. JSR-356 specificerar utöver server-side delen även ett klient-API för Java/JavaFX vilket helt klart är välkommet.

Jag har själv sysslat ganska mycket med Web Sockets Java-2-Java med Netty och jWebSocket och det är verkligen inget overstatement att påstå att JSR-356 förenklar detta riktigt mycket.

@ServerEndpoint("/myendpoint")
public class MyEndpoint {
   @OnMessage
   public void myCoolMessageProcessor(Session session, String msg) {
   }
}

@OnMessage metoden kan alltså heta precis vad man vill och likt MDB 2.0 så behöver man inte implementera något specifikt interface (motsv. MessageListener).
Man kan också skicka svar till avsändaren utan att behöva plocka fram något Sessionsobjekt att köra write() på.

@ServerEndpoint("/myendpoint")
public class MyEndpoint {
   @OnMessage
   public String myCoolMessageProcessor(Session session, String msg) {
       return "You said " + msg + ". I say boooo";
   }
}

Arun Gupta är en van föreläsare och angenäm att lyssna till. Han baserade delar av presentationen på det här exemplet, för den som är intresserad av lite mer kod.

JAX-RS and JSON in the Cloud in 30 minutes.

Den sista presentationen för mig och tyvärr den klart sämsta. Tyvärr så dålig att folk google-app-engine-logobörjade gå efter 15-20 minuter och sedan gick personer stötvis.

Hur som helst – titeln på presentationen var mer eller mindre missvisande – det visade sig vara reklam för Google App Engine och de features som finns där för att snyggt och prydligt generera REST-dokumentation och klientlibbar för t.ex. Android och iOS. Påminde mycket om det Enunciate gör. Tyvärr förlorades det allra mesta av budskapet på grund av brist på kontext och en presentationsteknik som inte direkt hjälpte till. Det jag dock tar med mig var Googles API explorer. Jag har nyligen lekt lite med Flickrs API explorer och jag gillade verkligen det konceptet. Jag hade faktiskt inte en susning om att Google har i stort sett samma sak för alla sina API:er (Calendar, Analytics, YouTube osv osv) och dessutom Java-libbar framtagna om man vill göra lite server-2-server grejer som nyttjar Googles tjänster på ett sätt eller annat. Kanske squeeds publika aktivitetskalender kan hämtas ut på ett elegant vis till någon framtida version av hemsidan? Jag fattade dock aldrig riktigt om man på något sätt var tvungen att deploya hos Google App Engine för att kunna nyttja dessa tjänster. Jag antar att så inte var fallet, men denna undran i sig kanske ger en fingervisning om hur pass rörig och svag presentationen var.

Summering

Jag var tvungen att flyga hem redan torsdag kväll, så jag missade torsdagens sista sessioner samt fredagens. En jag verkligen hade velat se var MongoDB for JPA Developers, något jag hoppas kunna ta igen snart. Det jag framförallt tar med mig är Java 8 och hur jag tror lambdauttrycken och stream-API:t på Collections kommer förenkla mycket av det vardagliga arbetet framöver. Att NoSQL och Cloud är mer än bara buzzwords står också allt mer klart. Mer oklart är hur mycket ”traction” Google kommer uppnå med Dart. Trenden med HTML5+js+ramverk i webbläsaren verkar inte direkt försvagas – hur många nya projekt dras (frivilligt) igång med server-side teknik såsom JSF idag? Vad händer med GWT nu när Google verkar satsa ganska hårt på Angular och Dart?

Jag hade stor behållning av konferensen och återvände hem fylld till bredden av inspiration jag nu med (blandad) framgång försöker föra över på mina kollegor. Konferensen i sig var välorganiserad i för ändamålet utmärkta lokaler – med undantag för att det var oerhört trångt i lokalerna mellan sessionerna och att många rums kapacitet inte riktigt räckte till.

3 Kommentarer

  1. Peter 5 år sedan

    Intressant läsning!

  2. Fredrik Wendt 5 år sedan

    Kul! Är småkär i Couch*s API och design utåt, en favorit som jag tycker används alldeles för sällan. Minns också upprörda, nästan mästrande, argument och inlägg om huruvida MethodHandles skulle vara en bättre implementation än Function Types på FOSDEM i februari 2010. Man hade redan då flera konkurrerande implementationer av lambdas, som hade prestandamätts och bl a diskuterades öppet i Free Java-rummet. Och jag kan förstå, men inte tycka om, att det skulle ta 4 år att välja en lösning som når alla som inte bygger sin JVM själv …

  3. Fredrik Wendt 5 år sedan

    Grym samling/sammanfattande om distribuerade system: http://www.slideshare.net/jboner/the-road-to-akka-cluster-and-beyond

Lämna ett svar

E-postadressen publiceras inte. Obligatoriska fält är märkta *

*

Denna webbplats använder Akismet för att förhindra skräppost. Läs mer om hur dina kommentarsuppgifter behandlas.