Početak rada s Spring JMS-om

1. Pregled

Spring pruža JMS integracijski okvir koji pojednostavljuje upotrebu JMS API-ja. Ovaj članak predstavlja osnovne pojmove takve integracije.

2. Ovisnost Mavena

Da bismo koristili Spring JMS u našoj aplikaciji, moramo dodati potrebne artefakte u pom.xml:

 org.springframework spring-jms 4.3.3.OSLOBOĐENJE 

Najnoviju verziju artefakta možete pronaći ovdje.

3. The JmsTemplate

JmsTemplate class obrađuje stvaranje i oslobađanje resursa prilikom slanja ili sinkronog primanja poruka.

Stoga klasa koja to koristi JmsTemplate samo treba implementirati sučelja za povratni poziv kako je navedeno u definiciji metode.

Počevši od proljeća 4.1, JmsMessagingTemplate je izgrađen na vrhu JmsTemplate koja pruža integraciju sa apstrakcijom poruka, tj. org.springframework.messaging.Message. To nam pak omogućuje stvaranje poruke koju ćemo poslati na generički način.

4. Upravljanje vezama

Da bismo se povezali i mogli slati / primati poruke, moramo konfigurirati a ConnectionFactory.

A ConnectionFactory je jedan od objekata kojima upravlja JMS i koje je administrator unaprijed konfigurirao. Klijent će uz pomoć konfiguracije uspostaviti vezu s JMS davateljem.

Proljeće nudi 2 vrste ConnectionFactory:

  • SingleConnectionFactory - je provedba ConnectionFactory sučelje, koje će svima vratiti istu vezu createConnection() poziva i zanemaruje pozive na Zatvoriti()
  • CachingConnectionFactory proširuje funkcionalnost SingleConnectionFactory i dodaje poboljšava ga predmemoriranjem Sjednice, Proizvođači poruka, i MessageConsumers

5. Upravljanje odredištem

Kao što je gore spomenuto, zajedno s ConnectionFactory, odredišta su također objekti kojima upravlja JMS i mogu se pohraniti i dohvatiti iz JNDI.

Spring pruža generičke rješavače poput DynamicDestinationResolver i specifični rješavači poput JndiDestinationResolver.

The JmsTemplate dodijelit će razlučivost imena odredišta jednoj od implementacija na temelju našeg odabira.

Također će pružiti nekretninu tzv defaultDestination - koji će se koristiti sa poslati i primiti operacije koje se ne odnose na određeno odredište.

6. Pretvorba poruka

Proljetni JMS bio bi nepotpun bez podrške pretvarača poruka.

Zadana strategija pretvorbe koju koristi JmsTemplate za oboje ConvertAndSend () i ReceiveAndConvert () operacija je SimpleMessageConverter razred.

Pretvarač SimpleMessageConverter je u stanju nositi se Tekstualne poruke, BytesMessages, MapMessages, i ObjectMessages. Ova klasa provodi Pretvarač poruka sučelje.

Osim SimpleMessageConverter, Spring JMS nudi neke druge Pretvarač poruka klase izvan okvira poput MappingJackson2MessageConverter, MarshallingMessageConverter, Pretvarač poruka MessagingMessageConverter.

Štoviše, možemo stvoriti prilagođenu funkcionalnost pretvorbe poruka jednostavnom primjenom Pretvarač poruka sučelja toMessage () i FromMessage () metode.

Pogledajmo uzorak isječka koda o implementaciji prilagođenog Pretvarač poruka,

javna klasa SampleMessageConverter implementira MessageConverter {javni objekt izMessage (poruka poruke) baca JMSException, MessageConversionException {// ...} javna poruka toMessage (objekt objekt, sesija sjednice) baca JMSException, MessageConversionException {// ...}}

7. Uzorak JMS proljeća

U ovom ćemo odjeljku vidjeti kako se koristi JmsTemplate za slanje i primanje poruka.

Zadani način slanja poruke je JmsTemplate.send (). Ima dva ključna parametra, od kojih je prvi parametar JMS odredište, a drugi parametar implementacija MessageCreator. JmsTemplate koristi MessageCreator'S metoda povratnog poziva createMessage () za konstrukciju poruke.

JmsTemplate.send () dobar je za slanje običnih tekstualnih poruka, ali da biste poslali prilagođene poruke, JmsTemplate ima drugu metodu koja se naziva convertAndSend ().

Ispod možemo vidjeti provedbu ovih metoda:

javna klasa SampleJmsMessageSender {private JmsTemplate jmsTemplate; privatni red čekanja; // postavljači za jmsTemplate & queue javna praznina simpleSend () {jmsTemplate.send (queue, s -> s.createTextMessage ("hello queue world")); }
 public void sendMessage (zaposlenik zaposlenika) {System.out.println ("Jms Message Sender:" + zaposlenik); Karta karte = novi HashMap (); map.put ("name", worker.getName ()); map.put ("dob", worker.getAge ()); jmsTemplate.convertAndSend (karta); }}

Ispod je klasa primatelja poruka, nazivamo je POJO na temelju poruka (MDP). Vidimo da je razred SampleListener provodi MessageListener sučelje i pruža tekst specifičnu implementaciju za metodu sučelja onMessage ().

Osim onMessage () metoda, naša SampleListener razred koji se naziva i metodom receiveAndConvert () za primanje prilagođenih poruka:

javna klasa SampleListener implementira MessageListener {public JmsTemplate getJmsTemplate () {return getJmsTemplate (); } javna void onMessage (poruka poruke) {if (poruka instance TextMessage) {try {String msg = (((TextMessage) poruka) .getText (); System.out.println ("Poruka je potrošena:" + poruka); } catch (JMSException ex) {throw new RuntimeException (ex); }} else {baciti novi IllegalArgumentException ("Pogreška poruke"); }} javni zaposlenik receiveMessage () baca JMSException {Map map = (Map) getJmsTemplate (). receiveAndConvert (); vratiti novog zaposlenika ((Niz) map.get ("ime"), (Integer) map.get ("dob")); }}

Vidjeli smo kako provesti MessageListener a ispod vidimo konfiguraciju u kontekstu proljetne aplikacije:

DefaultMessageListenerContainer zadani je spremnik za preslušavanje poruka koji Spring pruža zajedno s mnogim drugim specijaliziranim spremnicima.

8. Osnovna konfiguracija s Java napomenama

The @JmsListener jedina je napomena potrebna za pretvaranje metode normalnog graha u krajnju točku JMS slušatelja. Proljetni JMS nudi mnogo više napomena kako bi se olakšala implementacija JMS-a.

U nastavku možemo vidjeti neke od primjera klasa:

@JmsListener (odredište = "myDestination") javna void SampleJmsListenerMethod (redoslijed poruka) {...}

Da bismo jednoj metodi dodali više slušatelja, samo trebamo dodati više @JmsListener bilješke.

Moramo dodati @EnableJms napomena za jednu od naših konfiguracijskih klasa za podršku @JmsListener anotirane metode:

@Configuration @EnableJms javna klasa AppConfig {@Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory () {DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory (); factory.setConnectionFactory (connectionFactory ()); tvornica za povratak; }}

9. Obrađivač pogrešaka

Također možemo konfigurirati prilagođeni obrađivač pogrešaka za naš spremnik preslušača poruka.

Prvo primijenimo org.springframework.util.ErrorHandler sučelje:

@Service javna klasa SampleJmsErrorHandler implementira ErrorHandler {// ... logger @Override public void handleError (Throwable t) {LOG.warn ("U zadanom jms rukovatelju pogreškama ..."); LOG.error ("Poruka o pogrešci: {}", t.getMessage ()); }}

Imajte na umu da smo nadjačali handleError () metoda koja jednostavno bilježi poruku pogreške.

A zatim, moramo uputiti našu uslugu obrade pogrešaka u DefaultJmsListenerConnectionFactory koristiti setErrorHandler () metoda:

@Bean public DefaultJmsListenerContainerFactorybjmsListenerContainerFactory () {DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory (); factory.setConnectionFactory (connectionFactory ()); factory.setErrorHandler (sampleJmsErrorHandler); tvornica za povratak; }

Ovim će naš konfigurirani rukovatelj pogreškama sada uhvatiti sve neobrađene iznimke i prijaviti poruku.

Po želji, obrađivač pogrešaka možemo konfigurirati i pomoću običnih starih XML konfiguracija ažuriranjem našeg appContext.xml:

10. Zaključak

U ovom vodiču razgovarali smo o konfiguraciji i osnovnim konceptima Spring JMS-a. Također smo imali kratak osvrt na proljeće JmsTemplate klase koje se koriste za slanje i primanje poruka.

Implementaciju koda možete pronaći u projektu GitHub.