Kom godt i gang med Spring JMS

1. Oversigt

Spring giver en JMS-integrationsramme, der forenkler brugen af ​​JMS API. Denne artikel introducerer de grundlæggende begreber ved en sådan integration.

2. Maven-afhængighed

For at kunne bruge Spring JMS i vores applikation skal vi tilføje nødvendige artefakter i pom.xml:

 org.springframework spring-jms 4.3.3.RELEASE 

Den nyeste version af artefakten kan findes her.

3. Den JmsTemplate

JmsTemplate klasse håndterer oprettelse og frigivelse af ressourcer, når de sender eller synkront modtager meddelelser.

Derfor den klasse, der bruger dette JmsTemplate behøver kun at implementere callback-grænseflader som specificeret i metodedefinitionen.

Startende med forår 4.1, den JmsMessagingTemplate er bygget oven på JmsTemplate som giver en integration med meddelelsesabstraktionen, dvs. org.springframework.messaging.Message. Dette giver os igen mulighed for at oprette en besked, der skal sendes på en generisk måde.

4. Forbindelsesstyring

For at oprette forbindelse og være i stand til at sende / modtage meddelelser er vi nødt til at konfigurere en ConnectionFactory.

EN ConnectionFactory er et af de JMS-administrerede objekter, der er forudkonfigureret af en administrator. En klient ved hjælp af konfigurationen opretter forbindelse til en JMS-udbyder.

Foråret giver 2 typer ConnectionFactory:

  • SingleConnectionFactory - er en implementering af ConnectionFactory interface, der returnerer den samme forbindelse på alle createConnection() kalder og ignorerer opkald til tæt()
  • CachingConnectionFactory udvider funktionaliteten af SingleConnectionFactory og tilføjer forbedrer det med en caching af Sessioner, MessageProducersog BeskedForbrugere

5. Destination Management

Som diskuteret ovenfor sammen med ConnectionFactory, destinationer er også JMS-administrerede objekter og kan lagres og hentes fra en JNDI.

Spring giver generiske opløsere som f.eks DynamicDestinationResolver og specifikke opløsere som f.eks JndiDestinationResolver.

Det JmsTemplate vil delegere opløsningen af ​​destinationsnavnet til en af ​​implementeringerne baseret på vores valg.

Det vil også give en ejendom kaldet defaultDestination - som vil blive brugt med sende og modtage handlinger, der ikke henviser til en bestemt destination.

6. Konvertering af meddelelser

Spring JMS ville være ufuldstændig uden støtte fra Message Converters.

Standardkonverteringsstrategien, der bruges af JmsTemplate for begge ConvertAndSend () og ReceiveAndConvert () operationer er SimpleMessageConverter klasse.

SimpleMessageConverter er i stand til at håndtere Tekstbeskeder, BytesMessages, MapMessagesog Objektbeskeder. Denne klasse implementerer MessageConverter interface.

Undtagen SimpleMessageConverter, Spring JMS giver nogle andre MessageConverter klasser ud af kassen som MappingJackson2MessageConverter, MarshallingMessageConverter, MessagingMessageConverter.

Desuden kan vi oprette brugerdefineret beskedkonvertering funktionalitet ved blot at implementere MessageConverter grænseflader toMessage () og FromMessage () metoder.

Lad os se et eksempel på kodestykke om implementering af en brugerdefineret MessageConverter,

offentlig klasse SampleMessageConverter implementerer MessageConverter {public Object fromMessage (Message message) kaster JMSException, MessageConversionException {// ...} public Message toMessage (Object object, Session session) kaster JMSException, MessageConversionException {// ...}}

7. Eksempel på forårsjms

I dette afsnit vil vi se, hvordan man bruger en JmsTemplate for at sende og modtage meddelelser.

Standardmetoden til afsendelse af beskeden er JmsTemplate.send (). Den har to nøgleparametre, hvoraf den første parameter er JMS-destinationen, og den anden parameter er en implementering af MessageCreator. JmsTemplate bruger MessageCreator'S tilbagekaldsmetode createMessage () til at konstruere beskeden.

JmsTemplate.send () er god til at sende almindelige tekstbeskeder, men for at sende tilpassede beskeder, JmsTemplate har en anden metode kaldet convertAndSend ().

Vi kan se nedenfor implementeringen af ​​disse metoder:

offentlig klasse SampleJmsMessageSender {private JmsTemplate jmsTemplate; privat kø; // setters for jmsTemplate & kø offentlig ugyldig simpleSend () {jmsTemplate.send (kø, s -> s.createTextMessage ("hej kø verden")); }
 public void sendMessage (Medarbejdermedarbejder) {System.out.println ("Jms Message Sender:" + medarbejder); Kortkort = nyt HashMap (); map.put ("navn", medarbejder.getnavn ()); map.put ("alder", medarbejder.getAge ()); jmsTemplate.convertAndSend (kort); }}

Nedenfor er meddelelsesmodtagerklassen, vi kalder den som Message-Driven POJO (MDP). Vi kan se, at klassen SampleListener implementerer MessageListener interface og giver den tekstspecifikke implementering til interface-metoden onMessage ().

Undtagen onMessage () metode, vores SampleListener klasse kaldes også en metode receiveAndConvert () til modtagelse af brugerdefinerede meddelelser:

offentlig klasse SampleListener implementerer MessageListener {public JmsTemplate getJmsTemplate () {return getJmsTemplate (); } public void onMessage (Message message) {if (message instanceof TextMessage) {try {String msg = ((TextMessage) message) .getText (); System.out.println ("Beskeden er forbrugt:" + msg); } fange (JMSException ex) {kast ny RuntimeException (ex); }} andet {kast nyt IllegalArgumentException ("Beskedfejl"); }} offentlig Medarbejder modtagerMessage () kaster JMSException {Map map = (Map) getJmsTemplate (). receiveAndConvert (); returner ny medarbejder ((streng) map.get ("navn"), (heltal) map.get ("alder")); }}

Vi så, hvordan vi implementerede MessageListener og nedenfor ser vi konfigurationen i Spring applikationskontekst:

DefaultMessageListenerContainer er standardmeddelelsen lyttercontainer, som Spring leverer sammen med mange andre specialiserede containere.

8. Grundlæggende konfiguration med Java-kommentarer

Det @JmsListener er den eneste anmærkning, der kræves for at konvertere en metode til en normal bønne til et JMS-lytterendepunkt. Spring JMS giver mange flere kommentarer for at lette JMS-implementeringen.

Vi kan se nogle af prøveklasserne, der er kommenteret nedenfor:

@JmsListener (destination = "myDestination") offentlig ugyldighed SampleJmsListenerMethod (Meddelelsesrækkefølge) {...}

For at tilføje flere lyttere til en enkelt metode skal vi bare tilføje flere @JmsListener kommentarer.

Vi er nødt til at tilføje @EnableJms kommentar til en af ​​vores konfigurationsklasser for at understøtte @JmsListener annoterede metoder:

@Configuration @EnableJms public class AppConfig {@Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory () {DefaultJmsListenerContainerFactory fabrik = ny DefaultJmsListenerContainerFactory (); factory.setConnectionFactory (connectionFactory ()); retur fabrik; }}

9. Fejlhåndterer

Vi kan også konfigurere en brugerdefineret fejlhåndterer til vores meddelelseslyttercontainer.

Lad os først implementere org.springframework.util.ErrorHandler grænseflade:

@Service public class SampleJmsErrorHandler implementerer ErrorHandler {// ... logger @ Override public void handleError (Throwable t) {LOG.warn ("I standard jms error handler ..."); LOG.error ("Fejlmeddelelse: {}", t.getMessage ()); }}

Bemærk, at vi har tilsidesat handleError () metode, der blot logger fejlmeddelelsen.

Og så skal vi henvise til vores fejlhåndteringstjeneste i StandardJmsListenerConnectionFactory bruger setErrorHandler () metode:

@Bean offentlig StandardJmsListenerContainerFactorybjmsListenerContainerFactory () {DefaultJmsListenerContainerFactory fabrik = ny DefaultJmsListenerContainerFactory (); factory.setConnectionFactory (connectionFactory ()); factory.setErrorHandler (sampleJmsErrorHandler); retur fabrik; }

Med dette vil vores konfigurerede fejlhåndterer nu fange eventuelle uhåndterede undtagelser og logge meddelelsen.

Valgfrit kan vi også konfigurere fejlhåndteringen ved hjælp af almindelig XML-konfigurationer ved at opdatere vores appContext.xml:

10. Konklusion

I denne vejledning diskuterede vi konfigurationen og de grundlæggende begreber i Spring JMS. Vi kiggede også kort på det forårsspecifikke JmsTemplate klasser, der bruges til afsendelse og modtagelse af meddelelser.

Du kan finde implementeringen af ​​koden i GitHub-projektet.


$config[zx-auto] not found$config[zx-overlay] not found