Follow Us on Twitter

Integratie met Spring Integration 2.2.0.RC2 - een overzicht

November 2012 - Spring Integration is een extensie van het Spring framework dat zich richt op applicatie integratie. Het is een dunne laag bovenop het Spring framework en is consistent met het Spring programmeer-model en de Spring configuratie-wijzen.

De vraag rijst waarom deze uitbreiding er is gekomen als het Spring framework zelf al zoveel te bieden heeft. Spring bevat inderdaad heel veel bruikbare componenten maar, hoewel ze uitstekend kunnen worden ingezet voor een oneindig aantal uiteenlopende oplossingen, zijn ze generiek van aard. Welnu, binnen het applicatie-integratie domein ziet men een aantal patronen steeds weer terugkomen. Het zijn precies deze patronen waarop Spring Integration is gebaseerd zodat men niet zelf iedere keer opnieuw het wiel behoeft uit te vinden.

In tegenstelling tot bijv. Mule, is Spring Integration strikt genomen geen ESB. Spring Integration als framework biedt wel routing en mediation maar is geen server of deployable component die deze services out-of-the-box levert. Spring Integration kan prima als lichtgewicht oplossing gebruikt worden in applicaties (bijv. message brokers).

In dit Whitebook willen we een beknopt overzicht geven van belangrijke nieuwe features die Spring Integration 2.2 te bieden heeft. Maar eerst geven we korte beschrijving van de componenten waarmee Spring Integration is opgebouwd.

Basis Concepten

Spring Integration maakt gebruik van een aantal belangrijke grondpatronen zoals die staan beschreven in het boek Enterprise Integration Patterns. De basispatronen zijn Message, Message Channel and Message Endpoints. In deze alinea wordt wat dieper in gegaan op deze basispatronen en de architectuur die deze componenten verbindt.

Pipes-and-filters architecture

In de pipes and filters architecture wordt een groot proces opgedeeld in stappen (filters) die met elkaar worden verbonden door pipes (channels). Voorbeeld: decryptie, authenticatie en ontdubbeling kunnen verschillende fllter stappen zijn binnnen een proces.
Spring Integratie zorgt voor het transporteren, transformeren, routeren en verwerken van berichten door middel van een berichtenstroom. Pipes, ook wel Message Channels genoemd, zorgen voor het transport tussen Filters. Filters zijn alle componenten die zorgen voor het produceren en consumeren van Message Endpoints.

Message

Een bericht is een eenheid met informatie dat door Message Endpoints kan worden verwerkt.
Een bericht bestaat uit twee onderdelen. De payload en het header-gedeelte. In de header van een bericht kunnen gegevens zoals het id, tijdstip en correlatie-id en andere key-value pairs die door de ontwikkelaar zijn gedefinieerd van het bericht worden gezet. De payload kan alle typen objecten bevatten.

Message Channels

Message Channels zorgen voor de ontkoppeling tussen de te verbinden systemen.
Berichten kunnen direct door een message channel worden gestuurd, of ze kunnen worden gebufferd in een queue, hiermee kan worden voorkomen dat een ontvangend systeem wordt overladen door berichten. Verder kan een bericht door een channel afgeleverd worden naar een enkel enpoint (point-to-point) of naar meerdere endpoints die naar de message channel luisteren (publish-subscribe).

Message Endpoints

Message endpoints zijn onderdeel van de te integreren applicatie en verzorgen de koppeling met de Message channels, maar ook met externe systemen. Message Endpoints zijn componenten die iets met een bericht kunnen doen, zoals het transformeren of routeren van een bericht.

Voorbeelden van endpoints zijn:

  • Channel Adapter:
    Een adapter om een applicatie te koppelen aan het Message Channel zodat het berichten kan ontvangen en versturen. Adapters zorgen ervoor dat berichten door het proces kunnnen worden opgenomen en weer kunnen verlaten. Hiervoor heeft Spring een groot aantal verschillende adapters.
  • Transformer:
    Kunnen het objecttype payload converteren, en message headers manipuleren.
  • Filter:
    Met behulp van filters kunnen berichten aan de hand van de inhoud worden tegengehouden.
  • Router:
    Routers kunnen een bericht, afhankelijk van de inhoud, doorsturen naar verschillende Message Channels.
  • Splitter:
    Is benodigd om een bericht op te delen in verschillende deelberichten die afzonderlijk kunnen worden verwerkt.
  • Aggregator:
    Het tegenovergestelde van een splitter. Aggregator is een speciaal soort filter in de pipes and filters architectuur, die een een aantal gerelateerde berichten verzamelt en dan in een enkele keer verwerkt.
  • Service Activator:
    Een Service Activator maakt de connectie van een Spring-managed object met een channel mogelijk. Hiermee kan een Spring bean dienen als service.

Een bekend voorbeeld waarin deze componenten gebruikt worden is de loadbroker messaging example zoals in de volgende figuur weergegeven.

figuur 1: Loanbroker example (uit de Spring integration reference manual)

De case is voor een klant die voor een lening op zoek gaat naar de voordeligste rente en daarbij verschillende banken langs gaat. Van iedere bank krijgt hij een aanbieding of een afwijzing afhankelijk van zijn kredietwaardigheid. Uit alle banken kiest de klant uiteindelijk degene met laagste rente over de lening.
De loan broker is een tussenpersoon tussen klant en banken.

In het voorbeeld is de loanbroker een geautomatiseerd systeem op basis van Spring Integration. Er zijn verschillende componenten te onderscheiden. We zien een Gateway (loanBrokerGateway) die toegang verschaft tot ons loan broker messaging systeem. Dan een start message channel en vervolgens een composed message processor pattern met een chain, header enricher en router, zodat de verschillende banken gepolst worden. De resultaten worden via de aggregator verzameld en teruggemeld aan de klant.

Wat is nieuw in versie 2.0 - 2.2.0 van Spring Integration?

De huidige nieuwste versie van Spring Integration is 2.2.0.
Spring heeft een aantal verbeterpunten en nieuwe features ten opzichte van eerdere versies.
Spring Integration 2.2.0 is gebaseerd op Spring 3.1. Dat wil zeggen dat het draait onder Java 5 en hoger. Daarmee ondersteunt het dus ook java 1.5 features zoals generics waardoor configuraties niet meer perse in xml hoeven te gebeuren, maar ook in java code kunnen worden verwerkt.

Hieronder volgt een kleine greep uit de nieuwe features in Spring 2.0 en hoger.

SpEL

Ondersteuning van SpEL (Spring expression language). SpEL was toegevoegd aan Spring 3.0 en brengt de grootste verandering binnen Spring Integration met zich mee.
Een simpel voorbeeld van een Spring Integration applicationcontext waarbij SpEL wordt gebruikt is:

<router input-channel="channel03" resolution-required="true" expression="payload.afnemer">
  <mapping value="melkboer" channel="channelMelk"/>
  <mapping value="groenteboer" channel="channelGroente"/>
</router>

In het expression attribuut wordt een payload veld geselecteerd, in dit geval afnemer, welke vervolgens wordt gematched met de waarde in de mappings zodat het juiste uitvoer kanaal wordt gekozen.

Waar je voorheen een POJO schreef om de match te kunnen uitvoeren volstaat nu een simpele SpEL, voor relatief eenvoudige gevallen.

Een ander voorbeeld van een op SpEL gebaseerde routering is:

<router input-channel="channel03" resolution-required="true" expression="headers['afnemer’] != null ? 'afnemer' : 'default'">
        <mapping value="default" channel="channelDefault"/>
        <mapping value="afnemer" channel="channelAfnemer"/>
</router>

Scheduling and triggers

Een simpel voorbeeld van scheduling is

<inbound-channel-adapter expression="'De tijd is: ' + new java.util.Date()" channel="logchannel">
        <poller cron="5/10 * * * * ?"/>
</inbound-channel-adapter>
<logging-channel-adapter id="logchannel"/>

Dit print iedere vijfde seconde de huidige tijd op basis van een cron expressie.

In plaats van standaard Spring schedulers kunnen we ook custom triggers gebruiken. Hiervoor implementeren we de Trigger interface en deze bevat slechts 1 te implementeren method namelijk:

public Date nextExecutionTime(TriggerContext tg) {
…
}

Via de trigger context is het mogelijk om van de taak bijv. de lastCompletionTime op te vragen zodat op basis daarvan de nextExecutionTime kan worden bepaald.

RestTemplate

RestTemplate is een toevoeging aan Spring 3.0 en duikt dan ook op in Spring Integration.
Een voorbeeld waarin gebruik wordt gemaakt van RestTemplate is als volgt:

<outbound-gateway id="adapter-publisher"
               request-channel="outgoingChannel"
               url="http://localhost/webapp/doc={doc}"
               http-method="GET" 
               expected-response-type="java.lang.String"
<uri-variable name="doc" expression="payload"/>
</outbound-gateway>

We zien in het url attribute een placeholder met een referentie naar een variable doc welke door de payload zal worden gevuld. We verwachten een response in de vorm van een String.

Hier wordt een gateway gebruikt. Het verschil tussen een channel en een gateway is dat de eerste eenrichtingsverkeer is terwijl de gateway een request/response mechanisme inhoudt.

AMQS

Spring Integration maakt nu ook gebruik van Spring AMQP 1.1. Spring AMQP (Advanced Message Queuing Protocol) maakt het mogelijk voor AMQP applicaties om gebruik te maken van de Spring concepten. Spring ondersteunt naast JMS AMQS, een open standard protocol voor het versturen en ontvangen van berichten. Oorspronkelijk bedacht voor financiele instellingen (interoperabiliteit), beschrijft het hoe berichten opgebouwd zijn en verzonden kunnen worden tussen verschillende platforms. Waar JMS een API is en interoperabiliteit waarborgt binnen het Java platform, is AMQS een protocol. Hierdoor is AMQS platform-onafhankelijk.

Spring Integration gebruikt RabbitMQ als AMQS implementatie.
Spring Integration heeft AMQP Channel Adapters voor het enkel versturen of ontvangen van bericht, maar ook inkomende en uitgaande gateways voor het versturen van berichten waarbij een antwoord wordt verwacht.

Een configuratie voorbeeld voor een AMQP Inbound Gateway is hieronder weergegeven.

<int-amqp:inbound-gateway id="inboundGateway"
                          request-channel="myRequestChannel"
                          queue-names="si.test.queue"
                          concurrent-consumers="1"
                          connection-factory="connectionFactory"
                          reply-channel="myReplyChannel"/>

 

De parameters zijn als volgt:

  1. Unieke ID voor de adapter.
  2. Message channel waar naar toe berichten moeten worden.
  3. Namen van de AMQP Queues waarvan berichten moeten worden afgehaald.
  4. Het aantal concurrent users. Default is 1.
  5. Bean referentie naar de RabbitMQ ConnectionFactory.
  6. Message Channel waar de reply Messages worden verwacht (optioneel).

JPA

JPA Endpoints: Spring Integration maakt het mogelijk om JPA entity objecten op te halen of te persisteren.
De Spring Integration JPA (Java Persistence API) module bevat componenten die verscheidene database operaties kunnen uitvoeren met behulp van JPA.

Het bevat de volgende componenten:

  1. Inbound Channel Adapter.
  2. Outbound Channel Adapter.
  3. Updating Outbound Gateway.
  4. Retrieving Outbound Gateway.

Hiermee worden select, create, update en delete operaties uitgevoerd door het ontvangen en versturen van berichten naar de database . Naast het direct persisteren van de entity klassen is het ook mogelijk om queries uit te voeren met JPQL of met native SQL. Een voorbeeld hierbij is:

<int-jpa:retrieving-outbound-gateway entity-manager-factory="entityManagerFactory"
                                     request-channel="listPeopleRequestChannel"
                                     jpa-query="select p from Person p order by p.name asc">
</int-jpa:retrieving-outbound-gateway>

We zien hier dat de retrieving-outbound-gateway kan worden gebruikt voor het uitvoeren van een JPA query.

STS

Voor het maken van een Spring Project kan het best gebruik worden gemaakt van de Spring Source Tool (STS). STS is een op Eclipse gebasseerde ontwikkelomgeving voor het ontwikkelen van Spring applicaties. De laatste versie (op dit moment versie 3.0.0) beschikt over een aantal Spring Intgeration Templates die helpen bij het opzetten van een project.

Met een Spring Integration Template wordt een op maven gebasseerd project aangemaakt.
Naast de pom.xml wordt een inteface class gemaakt en het belangrijkste component in een Spring applicatie: het spring configuratiebestand. Het configuratiebestand bevat de bean definities. Spring Integration 2.0 heeft namespace support voor het definieren van Spring Integration Componenten.

Conclusie

In dit Whitebook hebben we een aantal nieuwe features van Spring Integration 2.2 laten zien. SI 2.2 biedt verbeterde ondersteuning voor een groot aantal standaard technologieen zoals REST en JPA maar het heeft ook nieuwe features zoals de ondersteuning voor AMQP.
De Spring Tool Suite (STS) heeft templates en een grafische interface die helpen bij het ontwikkelen van Spring Integratieprojecten.

Waardering:
 

Reacties

Nieuwe reactie inzenden

De inhoud van dit veld is privé en zal niet openbaar worden gemaakt.

Meer informatie over formaatmogelijkheden

CAPTCHA
Deze vraag is om te testen of u een persoon bent en om spam te voorkomen
Image CAPTCHA
Enter the characters shown in the image.