Java Magazine #1

9
Volledige samenwerking met DevOps Bouw je eigen robot Spoedcursus MongoDB Apache Camel: voor complete integratie mei/juni 2013 nr. 1 Onafhankelijk tijdschrift voor de Java-professional Java Magazine is TERUG Features MAGAZINE

description

Java Magazine #1

Transcript of Java Magazine #1

Page 1: Java Magazine #1

Volledige samenwerking met DevOps

Bouw je eigen robot

Spoedcursus MongoDB

Apache Camel: voor complete integratie

mei/juni 2013 nr. 1

Onafhankelijk tijdschrift voor de Java-professional

Java Magazineis TERUG

Features

MAGAZINE

cover.indd 1 5/1/13 2:17 PM

Page 2: Java Magazine #1

werkenbijordina.nl

ICT. maar dan voor mensen

Ordina feliciteert alle Javanen met de terugkeer van hun lijfblad.

Zonder lijfblad ben je als Javaan niet compleet. Geweldig dus dat JAVA Magazine na anderhalf jaar weer van de persen rolt. Daarmee is de inhoud terug die je zo hebt gemist. Dat diepgaande artikel. Het internationale nieuws. Die handige tip. Alles wat je vak boeiend maakt. Geef je lijfblad nóg meer body! Wat mag volgens jou echt niet ontbreken in het nieuwe JAVA Magazine? Deel het met allemaal. En wie weet staat jouw bijdrage in het volgende nummer. Twitter je ideeën naar #mijnjava

ook heT Idee daT je IeTs hebT gemIsT?

javaman.indd 2 25-04-13 16:19Untitled-1 1 29-4-2013 9:58:21

Page 3: Java Magazine #1

JAVA magazine | 01 2013

voorwoord

Zoals de kop van dit voorwoord ook al zegt: Java Magazine is terug! Na een tijdje in print afwezig te zijn geweest, heb je nu dan eindelijk de hernieuwde en gerestylde editie van Java Magazine in handen. Ik had nu graag gewild dat bij het moment van open slaan het intro van “Eye of the Tiger” of de soundtrack van Rocky, zou klinken. Deze muziek illustreert namelijk exact ons enthousi-asme over Java Magazine en de NLJUG community. Iedereen heeft er heel veel zin in om alle leden van NLJUG weer te voorzien van de nodige kennis en kunde op Java-gebied middels het Java Magazine. Dit enthousiasme wordt vooral aan-gewakkerd door de grote betrokkenheid van de vele NLJUG-leden, die hielpen bij het realiseren van Java Magazine.

Naast het nieuwe magazine ook een nieuwe content manager. Inderdaad, ik noem mijzelf geen hoofdredacteur. Dit omdat het Java Magazine maar slechts een onderdeel is van een totaal hernieuwd aanbod aan diensten richting onze leden. Zo zullen ook de vertrouwde NLJUG Univerisity, de J Fall en de nieuwe nljug.org website [inclusief javamagazine info] onderdeel gaan uitmaken van mijn verantwoordelijkheden.Ik heb er zin in om samen met de leden, de programmacommissie, het bestuur en de redactieraad te werken aan toepasselijke info die jou als Java profes-sional kan ondersteunen. Het magazine is daarvan de eerste output. Wij [de redactieraad en ik] hopen dan ook echt dat deze uitgave jouw die ondersteu-ning dan ook weer kan bieden.

Wil je zelf ook bijdragen door iets te schrijven voor het magazine? Twijfel niet en neem contact met ons op! NLJUG bestaat immers door en voor de leden.Ik wens je in ieder geval veel leesplezier met het vernieuwde Java Magazine en hopelijk slaat ons enthousiasme ook op jou over!

ramon wieleman Content manager Java Magazine

Colofon Java Magazine 01-2013

Content manager:

Ramon Wieleman

Eindredactie:

Lilian Krijt

Auteurs:

Joop Lanting, Maikel Alderhout, Robert Scholte,

Hubert ten Hove, Eelco Meuter, Remko de Jong,

Marco Hebing, Anko Tijman, Frank Verbruggen,

Eric-jan Malotaux, Ben Ooms, Bert Ertman,

Frans van der Lek, Bert Jan Schrijver, Nanne Baars,

Peter Hendriks

redactiecommissie:

Nanne Baars, Eelco Meuter, Bert Jan Schrijver,

Ben Ooms, Bert Ertman, Lucas Jellema, Tim Prijn

vormgeving:

Britt Zaal, Jannemieke Duyzer, Jan Wesel

Uitgever:

Martin Smelt

Traffic:

Marco Verhoog

Media order:

Mirella van der Willik

Abonnementenadministratie:

Ingrid van der Aar, Tanja Ekel, Brigitte Hetem

drukkerij:

Senefelder Misset, Doetinchem

distributie:

Betapress

Sales:

Richelle Bussenius

E-mail: [email protected]

Telefoon: 023 752 39 22

Fax: 023 535 96 27

Java Magazine verschijnt 4 maal per jaar en is onderdeel

van het lidmaatschap NLJUG en kost € 39,50 (België € 40,50)

per jaar.

Naast het Java Magazine krijgt u gratis toegang tot de vele

NLJUG workshops en het JFALL congres. Het NLJUG is lid van

het wereldwijde netwerk van JAVA user groups. Voor meer

informatie of wilt u lid worden, zie www.nljug.org. Een nieuw

lidmaatschap wordt gestart met de eerst mogelijke editie

voor een bepaalde duur. Het lidmaatschap zal na de eerste

(betalings)periode stilzwijgend worden omgezet naar lidmaat-

schap van onbepaalde duur, tenzij u uiterlijk één maand voor

afloop van het initiële lidmaatschap schriftelijk (per brief of

mail) opzegt. Na de omzetting voor onbepaalde duur kan

op ieder moment schriftelijk worden opgezegd per wettelijk

voorgeschreven termijn van 3 maanden. Een lidmaatschap is

alleen mogelijk in Nederland en België. U kunt mailen naar

[email protected]  of schrijven naar NLJUG BV, ledenadmi-

nistratie, postbus 3389, 2001 DJ Haarlem.

Op werkdagen kunt u bellen tussen 10 en 14 uur naar telefoon-

nummer 023–5364401. Verhuisberichten of bezorgklachten

kunt u doorgeven via www.hubstore.nl (Klantenservice).

Java Magazine is terug!

Voorwoord.indd 3 5/1/13 2:19 PM

Page 4: Java Magazine #1

04

JAVA MAGAZINE

Voor elke serieuze Java-ontwikkelaar en/of -bedrijf werkend met Java-technologie is het een must om lid te worden van de NLJUG. Als u up-to-date wilt zijn en blijven is dit de manier om het te doen: word lid van de NLJUG op www.nljug.org. Het lid-maatschap kost € 39,- (incl. 6% BTW)

Voordelen van lidmaatschap

WIL JIJ IN 4 UUR ALLES TE WETEN KOMEN OVER DE LAATSTE IT TRENDS?

Kom dan op dinsdag 4 juni om 15:00 uur naar XebiCon in Fort Voordorp.

XebiCon brengt je helemaal up-to-date op het gebied van Agile, Big

Data, Continuous Delivery, DevOps, Mobile en Single Page Webapps!

XebiCon heeft ook dit jaar een spraakmakend programma met nationale en internationale sprekers. De conferentie start spectaculair met keynote speaker en extreem avonturier, Marc Sluszny. Zijn motto is:

Verwezenlijk je dromen, verleg je grenzen, overwin je angsten.

De conferentie zal worden afgesloten met de Agile Troublemaker en bedenker van Behavior Driven Development, Dan North!

Voor slechts € 50,- incl. BTW kun je deelnemen aan XebiCon. Op xebicon.nl vind je meer informatie over het programma en de locatie. Schrijf je snel in, want het aantal plaatsen is beperkt.

Graag tot ziens op XebiCon 2013!

Registratie op www.xebicon.nl Op www.xebicon.nl vind je ook informatie over het programma en de locatie. WORDT GEORGANISEERD DOOR XEBIA

#xebicon of volg @xebia

Xebicon 2013 adv-1.indd 1 26-04-13 08:47

Volledige samenwerking met DevOps

Bouw je eigen robot

Spoedcursus MongoDB

Apache Camel: voor complete integratie

mei/juni 2013 nr. 1

Onafhankelijk tijdschrift voor de Java-professional

Java Magazineis TERUG

Features

MAGAZINE

Gratis toegang tot NLJUG events

Gratis toegang tot NLJUG University sessions

Gratis 4 maal per jaar het Java Magazine

Werf.indd 4 5/1/13 2:22 PM

Page 5: Java Magazine #1

JAVA magazine | 01 2013

INHOUDSOPGAVE

06 SPRING CONFIGURATIE Met @Configuration

10 BOEkBESPREkING Java Application Architecture

11 COLUMN Zieners

12 DEVOPS Het gehele implementatietraject

16 APACHE CAMEL Effectieve EAI

22 MONGODB De database van de toekomst?

27 LIBRARIES Libraries uitgelicht

28 RASPBERRY PI Ja-Pi, de eerste mobiele enterprise-server

32 GRAFISCHE USER INTERFACE Met Java en Sikuli

36 BESTUURSCOLUMN NLJUG Van het bestuur

38 TIPS & TRICkS Meer met Maven

Schrijven voorjava Magazine?

Ben je een enthousiast lid van nLjUg en zou je graag willen bijdragen aan java Magazine? of ben je werkzaam in de iT en zou je vanuit je functie graag je kennis willen delen met de nLjUg-community? Dat kan! neem contact op met de redactie, leg uit op welk gebied je expertise ligt en over welk onderwerp je graag zou willen schrijven. Direct artikelen inleve-ren mag ook. Mail naar [email protected] en wij nemen zo spoedig mogelijk contact met je op.

Effectieve EAI met Apache CamelRequirements in IT-projecten en

requirements aan de integratie

met andere systemen zijn gevoelig

voor verandering. Snel reageren op

deze veranderingen kan cruciaal

zijn voor een succesvol project.

Enterprise Application Integration

(EAI) biedt alle kennis, technologie

en best practices, om uitbreid-

bare en onderhoudbare integratie

oplossingen te bouwen op een pro-

ductieve manier. In dit artikel zal

Apache Camel gebruikt worden om

te kunnen voldoen aan complexe

integratie vraagstukken.

28Ja-Pi, de eerste mobiele enterprise-serverEnkele leden van de redactiecommissie zijn gek van de Raspberry Pi en wilden wel

eens kijken wat er allemaal mogelijk is met deze mini-computer. Java Magazine zocht

uit hoe je met Java enkele led’s via een website kunt aansturen. Daarnaast heeft Ja-Pi,

de eerste mobiele Java enterprise-server, het levenslicht gezien. Alles is stap voor stap

uitgelegd, zodat je thuis ook zelf aan de slag kan gaan met Raspberry Pi.

16

12DevOps, de ‘zachte’ kantDevOps is een samenvoeging van

development en operations. Met

DevOps is er samenwerking moge-

lijk tussen ontwikkeling en beheer

om continuous delivery in een

organisatie te laten slagen. DevOps

implementeren in een organisatie

kent ‘harde’ en ‘zachte’ aspecten.

Java Magazine verkende de zachte

aspecten van een DevOps-imple-

mentatietraject aan de hand van

eigen ervaringen.

Inhoud.indd 5 5/1/13 2:25 PM

Page 6: Java Magazine #1

06

JAVA MAGAZINE

Spring configuratie met @ConfigurationSpring configureren via een geannoteerde Java klasse. Voor de één een mooie oplossing en voor de ander is het een gruwel. Dit artikel gaat niet over deze discussie, maar over de werking en mogelijkheden van het configureren van de Spring container door middel van de @Configuration annotatie.

Dit artikel is gebaseerd op ervaringen met het gebruik hiervan en op bestudering van de javadocs van de besproken annotaties en classes. Doel is dan ook niet om volledig te zijn, daar biedt Spring voldoende docu-mentatie voor. Het doel is om een eenvoudig overzicht te hebben van de mogelijkheden, punten waar op te letten en mogelijk toepas-sing van de functionaliteit. Ook zullen we belichten hoe een Spring container omgaat met een mix van XML en op annotaties ge-baseerde configuratie. Als laatste tonen we hoe in een webcontext de Spring container te instantiëren wanneer je een geannoteerde configuratie hebt. De @Configuration annotatie biedt de moge-lijkheid om naast of zonder de reguliere XML configuratie een simpele Java klasse te anno-teren met @Configuration. In deze Java klasse kun je de Beans configureren zoals je in XML zou doen. Deze geannoteerde Java klasse is zelf gewoon een Bean zoals een @Component en kan als zodanig gebruikt worden. Sinds Spring 3.1 zijn er geen beperkingen tegenover XML configuratie, alles wat je in XML kunt definiëren, kun je dus ook in een Java klasse annoteren met @Configuration. Enkele voordelen van het configureren op deze manier zijn onder andere dat de confi-guratie door middel van Java geschreven is, mogelijke fouten eerder zichtbaar zijn (tijdens compileren), het mogelijk is Beans van een anonymous inner type te declareren en het conditioneel creëren van een Bean. De contai-ner kan prima overweg met een mix van XML

Ben Ooms is een gepassioneerde Java senior software engineer werkzaam bij Sogeti. en geannoteerde configuratie, het ene sluit

het andere niet uit. Om Java configuratie te kunnen gebruiken, moet naast de reguliere Spring afhankelijkhe-den ook CGlib toegevoegd worden wanneer je een Spring versie onder 3.2 gebruikt. Dit komt omdat CGlib door Spring als een optionele af-hankelijkheid gedefinieerd is. Naast Java con-figuratie wordt CGlib ook door Spring AOP ge-bruikt. De reden waarvoor CGlib noodzakelijk is, is omdat de @Configuration geannoteerde klasse een gewone bean is die daarnaast ook de context, scope en Bean semantiek moet weten. Hiervoor maakt Spring een CGlib proxy voor elke @Configuration Bean aan. Vanaf Spring 3.2 is deze afhankelijkheid niet meer nodig, en is de CGlib code van versie 3.0 geïntegreerd in Spring en te vinden in de org.springframework.cglib package. Doordat CGlib tijdens het opstarten dyna-misch functionaliteit toevoegt, zijn er twee eisen waar een @Configuration geannoteerde klasse aan moet voldoen: de klasse mag niet final zijn en er moet een default no args constructor zijn. De simpelste form kan er zo uitzien:

Package com.foo.confi g;@Confi gurationpublic class MyConfi g{public MyConfi g(){}@Bean coffeeBean(){ Return new Coffee-Bean();}}

Spring2kolom.indd 6 5/1/13 2:31 PM

Page 7: Java Magazine #1

JAVA magazine | 01 2013

Spring configuratie

Spring configuratie met @configuration

In XML zou de configuratie er zo uitzien:

Om deze configuratie te laden in een XML geconfigureerde container, moet de wel-bekende (als je al met Spring annotaties werkt) context:component-scan of de context:annotation-config tag aanwezig zijn. Zoals je misschien al verwacht, is een @Configuration geannoteerde klasse inderdaad gewoon een bean zoals een @Component of soortgelijke geannoteerde klasse. Als je met de context:component-scan wil werken is dit in je XML voldoende:

Zoals getoond in bovenstaand voorbeeld, kun je in een bestaande XML gebaseerde Spring configuratie door middel van de context:component-scan Java gebaseerde configuratie toevoegen. Wil of kan je de component-scan niet gebruiken, dan is dat ook mogelijk door middel van de context: annotati-on-config en voeg je deze tag toe in je XML.

Daarnaast is het ook mogelijk om alleen op annotatie gebaseerde configuratie in te laden. Spring heeft hiervoor een tweetal bootstrap classes. De AnnotationConfigApplication-Context en de web versie AnnotationConfig-WebApplicationContext.De AnnotationConfigApplicationContext kan op drie manieren geïnstantieerd worden. De eerste manier lijkt op de manier zoals je dit met een XML gebaseerde Spring configuratie zou doen:

De tweede manier gebruikt de default con-structor en het scanning mechanisme:

<beans> <bean id=”coffeBean” class=”com.foo.config.CoffeBean” > </></ beans>

<context:component-scan />

<context:annotation-config />

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationCon-text(Configuratie.class);

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationCon-text();ctx.scan(“de.package.die.je.wil.scan-nen”);ctx.refresh();

Als laatste de manier die erg op de tweede manier lijkt maar de register methode gebruikt om de container te voorzien van de configuratie:

De AnnotationConfigWebApplicationContext is op dezelfde manieren te instantiëren als de XML variant. De op annotaties gebaseerde configuratie heeft twee annotaties om andere configuraties in te laden. Als je een andere Java geannoteerde configuratie wilt inladen, gebruik je de @Import annotatie. Met @ImportResource kun je een XML configu-ratie inladen. Tijdens het schrijven van de voorbeeld code, kwam ik er achter dat je hiermee moet uitkijken wanneer je meer dan een @Configuration geannoteerde klasse heb. Doordat een Java klasse met de @Configura-tion onderhuids ook een gewone Bean is, kun je een andere configuratie klasse ook door middel van @Autowired injecteren. Dit heeft als voordeel dat het meteen duidelijk is waar de gebruikte Bean geconfigureerd wordt. Het nadeel is echter dat hierdoor de beide configuratie klassen tightly coupled zijn. Een voorbeeld hiervan is bijvoorbeeld:

Externe properties kunnen geladen worden door middel van de @PropertySource annota-tie of door middel van de @Value annotatie met een geconfigureerde propertyPlacehol-derConfigurator. Als je de @PropertySource manier gebruikt, moet je ook een Spring Environment laden door middel van bijvoor-beeld @Autowired in de configuratie klasse. Daarna kun je de property inlezen met de getProperty(‘naam”) van de geïnjecteerde Environment klasse. Belangrijk om te weten is dat wanneer twee ingeladen properties bestanden dezelfde property bevatten, de waarde van de laatst geladen properties bestand gebruikt wordt en dat de properties alleen binnen een @Bean definitie te gebrui-ken zijn.

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationCon-text();ctx.register(ConfigA.class);ctx.register(ConfigB.class);ctx.refresh();

Gegeven een xml configuratie genaamd springapp.xml@Configuration@ImportResource(“springapp.xml”)public class MyConfig{rest van de klasse...

Spring2kolom.indd 7 5/1/13 2:31 PM

Page 8: Java Magazine #1

08

JAVA magazine

Met de PropertyPlaceholderConfigurator heb je twee keuzes. Als deze al in een XML gedefinieerd wordt, kun je direct aan de slag met de @Value annotatie om properties in te lezen. Mocht die er niet zijn, dan kun je deze ook instantiëren in de Java configuratie klasse. Om dit te doen moet je op klasse niveau door middel van de @PropertySource annotatie de locatie van het properties be-stand, een PropertyPlaceholderConfigurator bean definiëren en properties inlezen met @Value.Sinds Spring 3.1 kun je verschillende profie-len gebruiken. Met een profile creëer je een logisch bij elkaar horende Bean verzameling. Deze verzameling wordt alleen geladen wan-neer het profiel als actief wordt aangemerkt. Het activeren van een profile kan door middel van het toevoegen van een System property genaamd spring.profiles.active met als waarde een of meerdere profiel namen, of door de methode setActiveProfile aan te roepen. Vanaf Spring 3.1 is voor de XML versie aan de beans tag het attribuut profile gekomen en in een op basis van annotaties geconfigureerde container kun je de @Profile annotatie toevoegen. Interessant aan de profielen is dat je deze runtime kan laden.Zoals je kunt zien is de flexibiliteit erg groot

Gegeven een property file genaamd props.properties met een key genaamd propKey

@Configuration@propertySource(“props.properties”)public class MyConfig{@Autowired Environment env

@Bean InjectedBean injectedBean(){ InjectedBean b = new Inject-edBean(); b.setProp(env.getProper-ty(“propKey”)); return b;}rest van de klasse...

@Configuration@profile(“st”)public class MyConfig{rest van de klasse...// Profiel laden in contextApplicationContext ctx = new annota-tionConfigContext();ctx.setActiveProfile{“st”);ctx.refresh();

en kun je een Java configuratie op veel verschillende manieren gebruiken. Je kunt bijvoorbeeld binnen een bestaande XML geconfigureerde container met de compo-nent-scan of annotation-config Java confi-guratie toevoegen, of een bestaande XML gebaseerde container ombouwen tot een op annotatie gebaseerd container door gebruik te maken van de @ImportResource om zodoende een geleidelijke transitie te kun-nen maken. Na het maken van de voorbeeld code ben ik er achter gekomen dat hoewel een mix tussen XML en geannoteerde goed te doen is het de onderhoudbaarheid niet ten goede komt. Zeker wanneer je Spring profielen, XML en geannoteerde configura-tie combineert, moet je de geconfigureerde container goed testen op de aanwezigheid van de door jou verwachte Beans.

Beans zijn te definiëren door de @Bean annotatie toe te voegen aan een methode. Het interessante van een Bean annotatie is dat deze ook gedeclareerd kunnen worden in een niet @Configuration geannoteerde klasse. Let er wel op dat als de Beans ge-declareerd worden in een klasse die niet de annotatie @Configuration heeft, de scope niet gerespecteerd wordt.

De optionele attributen van de @Bean an-notatie zijn name, autowire, initmethod en destroymethod. Als er geen specifieke naam gegeven is aan de bean zal de naam

Het proJect kun Je direct gebruiken Als een spring sAndbox om met spring te experimente-ren.

Spring2kolom.indd 8 5/1/13 2:31 PM

Page 9: Java Magazine #1

Spring configuratie

JaVa magazine | 01 2013

hetzelfde zijn als de method. Dit is te veranderen door het attribuut name toe te voegen. Interessant is dat de name attri-buut een array van Strings accepteert om dus meerdere aliassen toe te kennen aan de Bean. Met het autowire attribuut geeft men aan of de bean attributen automatisch ge-injecteerd moeten worden. Standaard staat dit uit. De mogelijke andere waarden zijn net als bij een XML geconfigureerde contai-ner injectie door middel van bean type of naam. Met de init methode parameter kun je aangeven welke methode aangeroepen moet worden na instantiëring van de bean. De bruikbaarheid hiervan is discutabel, want hetzelfde kan worden gedaan door in de Bean methode body de bewuste methode aan te roepen op het object.

De destroy method parameter is wel iets bruikbaarder. Hiermee kun je, zoals de naam al aanduidt, aangeven welke method moet worden aangeroepen wanneer de Bean ge-destroyed wordt. Als je deze parameter niet meegeeft, gaat de Spring container standaard bij het destroyen op zoek naar een publieke no arg methode close() en voert het deze uit. Deze standaard kun je overrulen door een lege String destroy methode naam mee te geven. Wanneer je dit doet zal de aanwezige

close methode niet aangeroepen worden. In de javadoc staat een specifieke uitzon-dering waar je op moet letten wanneer je een Bean definieert die een BeanFactoryPo-stProcessor type retourneert. Omdat deze Beans meestal zeer vroeg in de container lifecycle benodigd zijn, kunnen ze storend werken bij het verder instantiëren van andere Beans. Het advies is dan ook om deze type Beans als static te definiëren. Mocht de Spring container deze type Beans instantiëren vanuit een methode die niet static is, dan zal er een waarschuwing in de log vermeld worden. Nadeel is echter dat deze Beans niet voor Bean scoping of AOP in aanmerking komen wanneer ze door middel van een static methode zijn geïnstantieerd.

Ik hoop dat je met dit artikel een goede indruk hebt gekregen van de mogelijkheden die beschikbaar zijn wanneer je Spring wil gebruiken met een configuratie door middel van annotaties. Op bitbucket kun je een ma-ven eclipse project uitchecken op https://bitbucket.org/bendh/spring-configuration-sandbox waarbij de in dit artikel besproken mogelijkheden gedemonstreerd worden. Het project kun je direct gebruiken als een Spring sandbox om met Spring te experi-menteren.

Ben jij ook eenChampions League speler?

Kijk voor onze vacatures op pagina 20/21 van dit magazine.

Advertentie

Spring2kolom.indd 9 5/1/13 2:31 PM