A tavaszi JMS használatának megkezdése

1. Áttekintés

A Spring olyan JMS integrációs keretrendszert biztosít, amely leegyszerűsíti a JMS API használatát. Ez a cikk bemutatja az ilyen integráció alapfogalmait.

2. Maven-függőség

Annak érdekében, hogy a Spring JMS-t felhasználhassuk alkalmazásunkban, hozzá kell adnunk a szükséges tárgyakat a pom.xml:

 org.springframework spring-jms 4.3.3.FELHASZNÁLÁS 

A műtárgy legújabb verziója itt található.

3. Az JmsTemplate

JmsTemplate osztály kezeli az erőforrások létrehozását és felszabadítását üzenetek küldésekor vagy szinkron fogadásakor.

Ezért az osztály használja ezt JmsTemplate csak a metódefinícióban meghatározott visszahívási interfészeket kell megvalósítania.

A 4.1 tavasztól kezdve a JmsMessagingTemplate tetejére épül JmsTemplate amely integrációt biztosít az üzenetküldő absztrakcióval, azaz org.springframework.messaging.Message. Ez viszont lehetővé teszi, hogy hozzon létre egy üzenetet, amelyet általános módon küldhetünk el.

4. Kapcsolatkezelés

Annak érdekében, hogy csatlakozzunk és üzeneteket küldhessünk / fogadhassunk, be kell állítanunk a ConnectionFactory.

A ConnectionFactory az egyik JMS által kezelt objektum, amelyet egy rendszergazda előre konfigurált. Egy ügyfél a konfiguráció segítségével kapcsolatot létesít egy JMS szolgáltatóval.

A tavasz kétféle lehetőséget kínál ConnectionFactory:

  • SingleConnectionFactory - megvalósítása ConnectionFactory interfészen keresztül, ugyanazon a kapcsolaton fog visszatérni mindenki createConnection() hívások és figyelmen kívül hagyja a (z) címre érkező hívásokat Bezárás()
  • CachingConnectionFactory kiterjeszti a SingleConnectionFactory és hozzáteszi javítja a gyorsítótárral Munkamenetek, MessageProducers, és MessageFogyasztók

5. Úticél kezelése

Amint azt fentebb tárgyaltuk, a ConnectionFactory, a rendeltetési helyek szintén JMS által kezelt objektumok, és tárolhatók és lekérhetők egy JNDI-ből.

A tavasz olyan általános megoldókat kínál, mint a DynamicDestinationResolver és konkrét megoldók, mint pl JndiDestinationResolver.

A JmsTemplate a célnév felbontását a választásunk alapján az egyik megvalósításra delegálja.

Nevű ingatlant is biztosítani fogja defaultDestination - amelyet együtt fognak használni Küld és kap olyan műveletek, amelyek nem utalnak egy adott rendeltetési helyre.

6. Üzenetkonvertálás

A tavaszi JMS hiányos lenne az Üzenetátalakítók támogatása nélkül.

A. Által használt alapértelmezett konverziós stratégia JmsTemplate mindkettőnek ConvertAndSend () és ReceiveAndConvert () műveletek az SimpleMessageConverter osztály.

A SimpleMessageConverter képes kezelni Szöveges üzenetek, BytesMessages, MapMessages, és ObjectMessages. Ez az osztály hajtja végre a MessageConverter felület.

Attól eltekintve SimpleMessageConverter, A Spring JMS nyújt még néhányat MessageConverter osztályok a dobozból, mint MappingJackson2MessageConverter, MarshallingMessageConverter, MessagingMessageConverter.

Sőt, egyszerűen létrehozhatunk egyedi üzenetkonverziós funkciókat a MessageConverter interfész toMessage () és FromMessage () mód.

Nézzünk meg egy minta kódrészletet egy egyedi megvalósításáról MessageConverter,

public class SampleMessageConverter megvalósítja a MessageConverter {public objektum fromMessage (Message message) dobja a JMSException, MessageConversionException {// ...} public Message toMessage (objektum objektum, munkamenet munkamenet) JMSException, MessageConversionException {// ...}}

7. Minta tavaszi JMS

Ebben a szakaszban megtudjuk, hogyan kell használni a JmsTemplate üzenetek küldésére és fogadására.

Az üzenet küldésének alapértelmezett módja a JmsTemplate.send (). Két kulcsparamétere van, amelyek közül az első a JMS rendeltetési hely, a második a megvalósítás MessageCreator. A JmsTemplate használja a MessageCreatorVisszahívási módszere üzenet létrehozása() az üzenet felépítéséhez.

JmsTemplate.send () jó egyszerű szöveges üzenetek küldéséhez, de egyedi üzenetek küldéséhez JmsTemplate van egy másik módszere, az úgynevezett convertAndSend ().

Az alábbiakban láthatjuk ezeknek a módszereknek a megvalósítását:

public class SampleJmsMessageSender {private JmsTemplate jmsTemplate; privát várólista; // seters for jmsTemplate & queue public void simpleSend () {jmsTemplate.send (queue, s -> s.createTextMessage ("hello queue world")); }
 public void sendMessage (Alkalmazott alkalmazott) {System.out.println ("JMS Message Sender:" + alkalmazott); Térképtérkép = új HashMap (); map.put ("név", worker.getName ()); map.put ("age", worker.getAge ()); jmsTemplate.convertAndSend (térkép); }}

Az alábbiakban az üzenetvevő osztályt nevezzük, mint Üzenetvezérelt POJO (MDP). Láthatjuk, hogy az osztály SampleListener végrehajtja a MessageListener interfészt, és biztosítja az interfész módszer szövegspecifikus megvalósítását onMessage ().

Attól eltekintve onMessage () módszer, a mi SampleListener osztály is nevezett módszer gautiAndConvert () egyéni üzenetek fogadásához:

public class SampleListener megvalósítja a MessageListener {public JmsTemplate getJmsTemplate () {return getJmsTemplate (); } public void onMessage (Üzenet) {if (TextMessage üzenet példánya) {próbálkozzon {String msg = ((TextMessage) üzenet) .getText (); System.out.println ("Az üzenet elfogyott:" + msg); } catch (JMSException ex) {dobjon új RuntimeException (ex); }} else {dob új IllegalArgumentException ("Üzenethiba"); }} public Employee ReceiveMessage () dobja a JMSException {Map map = (Map) getJmsTemplate (). ReceiveAndConvert (); return new Employee ((karakterlánc) map.get ("név"), (egész szám) map.get ("kor")); }}

Láttuk, hogyan kell megvalósítani MessageListener az alábbiakban pedig a konfigurációt a Spring alkalmazás kontextusában látjuk:

DefaultMessageListenerContainer az alapértelmezett üzenetfigyelő tároló, amelyet a Spring sok más speciális tárolóval együtt nyújt.

8. Alapkonfiguráció Java jelölésekkel

A @JmsListener az egyetlen megjegyzés, amely szükséges ahhoz, hogy a normál bab módszerét JMS-figyelő végponttá alakítsa át. A tavaszi JMS sokkal több megjegyzéssel látja el a JMS megvalósítását.

Az alábbiakban láthatunk néhány felsorolt ​​mintaosztályt:

@JmsListener (destination = "myDestination") public void SampleJmsListenerMethod (Üzenetrendelés) {...}

Annak érdekében, hogy egyetlen módszerhez több hallgatót vegyen fel, csak többet kell hozzáadnunk @JmsListener annotációk.

Hozzá kell adnunk a @EnableJms jelölés az egyik konfigurációs osztályunkhoz a @JmsListener kommentált módszerek:

@Configuration @EnableJms public class AppConfig {@Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory () {DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory (); gyár.setConnectionFactory (connectionFactory ()); visszatérő gyár; }}

9. Hibakezelő

Konfigurálhatunk egy egyedi hibakezelőt is az üzenetfigyelő tárolónkhoz.

Először hajtsuk végre a org.springframework.util.ErrorHandler felület:

@Service public class SampleJmsErrorHandler implementálja a ErrorHandler {// ... logger @Orride public void handleError (Throwable t) {LOG.warn ("Alapértelmezésben a jms hibakezelő ..."); LOG.error ("Hibaüzenet: {}", t.getMessage ()); }}

Ne feledje, hogy felülírtuk a handleError () metódus, amely egyszerűen naplózza a hibaüzenetet.

És akkor hivatkoznunk kell a hibakezelő szolgáltatásunkra a DefaultJmsListenerConnectionFactory használni a setErrorHandler () módszer:

@Bean public DefaultJmsListenerContainerFactorybjmsListenerContainerFactory () {DefaultJmsListenerContainerFactory gyár = új DefaultJmsListenerContainerFactory (); gyár.setConnectionFactory (connectionFactory ()); gyár.setErrorHandler (mintaJmsErrorHandler); visszatérő gyár; }

Ezzel konfigurált hibakezelőnk mostantól elkapja az összes kezeletlen kivételt és naplózza az üzenetet.

Opcionálisan a hibakezelőt is konfigurálhatjuk a sima régi XML-konfigurációk segítségével a frissítésünkkel appContext.xml:

10. Következtetés

Ebben az oktatóanyagban megvitattuk a Spring JMS konfigurációját és alapfogalmait. Röviden áttekintettük a tavaszi specifikumot is JmsTemplate osztályok, amelyeket üzenetek küldésére és fogadására használnak.

A kód megvalósítását a GitHub projektben találja meg.