Enkel integrasjon med Apache Camel

Integrasjon er enkelt.

Integrasjon er enkelt hvis man benytter de riktige verktøyene.

En bok kalt Enterprise Integration Patterns, skrevet av Gregor Hohpe og Bobby Woolfe beskriver en rekke patterns for hvordan forskjellige integrasjonsutfordringene anbefales løst.
Løsningene må man selv implementere og ofte kan det være tidkrevende. Med Apache Camel blir jobben adskillig lettere.

Hva er Camel

Apache CamelApache Camel er et open source Java integrasjonsrammeverk, som er spesielt godt egnet til å utføre ruting, transformering, formidling og validering av data. .

Camel krever lite og er svært enkelt å ta i bruk, som vi skal se i eksemplene nedenfor

Endpoints

Et sentralt begrep er Endpoints. Et Endpoint er et integrasjonspunkt hvor det er mulig å motta eller sende data. Et endpoint angis med en uri. For å f.eks plukke opp en fil på et filområde kan man angi en uri til en katalog på følgende format:

“file:c:/incomming/orders”

Dersom man senere ønsker å hente filer fra en ftpserver er det bare å endre på urien slik:

“ftp://incommingserver.com/orders”

Camel vil automatisk gjenkjenne urien og benytte riktig protokoll. Ved å legge på argumenter på urien styrer man parametre. Dette kan f.eks være hvor ofte det skal sjekkes etter nye filer, om filen skal slettes eller flyttes når den har blitt plukket opp og andre ting. Argumentene er forskjellige til de forskjellige uriene. Dette er godt dokumenter på hjemmesidene til Camel.
Camel støtter over 60 URIs. Det gjør det enkelt å integrere mot mange forskjellige kilder. JPA, SMTP, IRC, XSLT, RSS, IMap, JMS, LDAP for å nevne noen. Sjekk ut listen!

Routes

For å knytte forskjellige endpointene sammen defineres det en Route. Dette kan konfigureres vha XML eller DSL (domain specific language). Fordelen ved å benytte DSL er at man får kodeferdigstillelse (code completion) og at koden er testbar. Eksempel på en Route skrevet i DSL:

public void configure() throws Exception {
	from("ftp://myuser@ftpserver.com/orders?password=xxx")
	.to("bean:orderProcessor");
}

En slik Route vil plukke opp filer i katalogen orders på ftpserveren fptserver.com og sende de til en bean kalt orderProcessor. Camel vil velge den metoden i bean som passer best til output fra forrige steg. Hvis f.eks orderProcessor har en metode som tar en string som input vil Camel sende innholdet av fila til denne metoden. Det er også mulig å overstyre dette ved å angi hvilken metode på bean som skal kalles.
En Route kan inneholde flere steg, slik:

public void configure() throws Exception {
	from("ftp://myuser@ftpserver.com/orders?password=xxx")
	.to("bean:orderNormalizer")
	.to("jpa:Order")
}

Output fra orderNormalizer blir input til jpa. Hvis ordernormalizer returnerer en Ordre vil denne bli persistert vha jpa.
Det er også mulig å legge på filter, validatorer, interceptorer, m.m på en Route, for mer avansert funksjonalitet som f.eks å kun plukke opp enkelte filer eller sende data til forskjellige endpoints avhengig av datatype.

Eksempel

Dette eksemplet vil plukke opp filer som lastes opp til katalogen orders på ftpserveren ftpserver.com. Innholdet i filene blir sendt til en metode som oppretter en ordre basert på innholdet i fila. Til slutt lagres ordren vha Jpa.
Camel fungerer bra sammen med Spring, men det er ingen forutsetning for å benytte Camel. For å sette opp Camel med Spring må følgende konfigureres i applicationContext:

<bean id="orderNormalizer" class="no.bekk.examples.normalizer.OrderNormalizer" />
<camel:camelContext id="camel">
	<camel:package>no.bekk.examples.routes</camel:package>
</camel:camelContext>

OrderNormalizer er bean vi refererer i Route. I pakken no.bekk.examples.routes legges så de Routene Camel skal håndtere, slik:

package no.bekk.examples.routes;
public class OrderRoute extends RouteBuilder {
	private final String FTP_URI = "ftp://myuser@ftpserver.com/orders?password=xxx";
	@Override
	public void configure() throws Exception {
		from(FTP_URI).to("bean:orderNormalizer").to("jpa:Order");
	}
}

Følgende klasse inneholder kode for å opprette en Ordre basert på innhold i fila.

public class OrderNormalizer {
	public Order transformToOrder(String body) {
		Order order = new Order();
		(... kode som fyller ordre med verdier...)
		return order;
	}
}

Til slutt Ordre entiteten.

@Entity
public class Order {
	private Long id;
 
	@Id
	public Long getId(){
		return id;
	}
}
Ta en kamel på en prøvetur.

Ta en kamel på en prøvetur. (Peter Short/iStockphoto)

Eksemplet over har avhengigheter til følgende Camel jars:

  • camel-core
  • camel-spring
  • camel-ftp

Kilder og ressurser

Post a Comment

Your email is never shared. Required fields are marked *

*
*

Spam Protection by WP-SpamFree