2015-04-05 33 views
5

questa è la mia prima volta con Spring JMS (e con JMS in generale) e ho qualche dubbio legato al concetto di callback JmsTemplate.Che cos'è un callback JmsTemplate in Spring JMS?

So che il JmsTemplate è una classe fornita dalla primavera:

  • Riduce codice standard.
  • Gestisce le risorse in modo trasparente.
  • Converte le eccezioni controllate in equivalenti di runtime.
  • Fornisce metodi di convenienza e callback.

e che viene utilizzato per la produzione di messaggi e la ricezione di messaggi sincroni. Semplifica l'utilizzo di JMS poiché gestisce la creazione e il rilascio di risorse durante l'invio o la ricezione sincrona di messaggi.

Leggendo la documentazione ufficiale di primavera (qui: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jms.html) ho trovato:

codice che utilizza il JmsTemplate ha solo bisogno di implementare callback interfacce dando loro un contratto di alto livello chiaramente definito. L'interfaccia di callback di MessageCreator crea un messaggio data una sessione fornita dal codice chiamante in JmsTemplate.

Questo non è chiaro per me. Quali sono esattamente queste richiamate?

All'inizio pensavo che un callback fosse un metodo fornito da JmsTemplate ma leggendo qui sembra qualcosa di più simile a un'interfaccia che devo implementare. Come funziona?

Ho trovato anche questo esempio:

TRASMETTERE POJO THROUGHT JMS (usando l'JmsTemplate):

public class JmsOrderManager implements OrderManager { 
    @Autowired JmsTemplate jmsTemplate; 
    @Autowired Destination orderQueue; 

    public void placeOrder(Order order) { 
     String stringMessage = "New order " + order.getNumber(); 
     jmsTemplate.convertAndSend("messageQueue", stringMessage); 
     // use destination resolver and message converter 
     jmsTemplate.convertAndSend(orderQueue, order); // use message converter 
     jmsTemplate.convertAndSend(order); // use converter and default destination 
    } 
} 

ho pensato che il convertAndSend() metodo è un JmsTemplate callback ma probabilmente questa affermazione non è corretta.

Potete spiegarmi che cosa è esattamente un callback JmsTemplate?

risposta

6

Il principio costruttivo comune a classi template primavera è quello di fornire metodi di supporto per eseguire le operazioni più comuni e per l'utilizzo più sofisticato, delegato l'essenza del compito di elaborazione per le interfacce utente di callback implementato.

In JMS Connection saranno ottenuti da una fabbrica

=> Da quel sessione di connessione viene creato, un seesion è un'unità di lavoro, ma fornisce anche delle transazioni

=> da sessione si crea diversi tipi di messaggi JMS come TextMessage, ObjectMessage, MapMessage, BytesMessage e StreamMessage nei seguenti modi session.createTextMessage ("ciao mondo ciao"); session.createObjectMessage (someSerializedObject) e così via

=> La stessa sessione è anche responsabile per la creazione di un'istanza di MessageProducer session.createProducer (destinazione) e MessageConsumer session.createConsumer (destinazione)

Hai seguenti possibilità convertAndSend (metodi di overload):

 jmsTemplate.convertAndSend(message) 
     jmsTemplate.convertAndSend(destination, message) 
     jmsTemplate.convertAndSend(message, postProcessor) 
     jmsTemplate.convertAndSend(destinationName, message) 
     jmsTemplate.convertAndSend(destination, message, postProcessor) 
     jmsTemplate.convertAndSend(destinationName, message, postProcessor) 

Cosa sta succedendo? L'utilizzo di base del callback come 3a e 5a firma è che è possibile modificare il messaggio dopo la conversione dell'oggetto in un messaggio JMS tramite un MessageConverter configurato. Si sta vedendo una destinazione effettiva che deve essere risolta da un DestinationResolver in caso di 6th, non lo si passa, verrà risolto da JNDI, se è registrato lì.

Che cosa significa?

jmsTemplate.send(this.queue, new MessageCreator() { 
public Message createMessage(Session session) throws JMSException { 
     return session.createTextMessage("hello queue world"); 
    } 
}); 

Qui, in questo esempio, si sta vedendo con metodo send() del modello JMS si sta fornendo Implementazione anonimo (callback), dove il metodo permette di accedere a ad oggetto di sessione e da quella sessione si è creato personalizzato sessione .createTextMessage ("ciao mondo ciao mondo") messaggio.

stesso modo nei convertAndSend (è possibile ottenere l'accesso a postprocessori modificare) Oggetto

public void ConvertSend() { 
Map map = new HashMap(); 
map.put("Name", "Vimal"); 
map.put("Age", new Integer(45)); 
jmsTemplate.convertAndSend("jmsQueue", map, new MessagePostProcessor() { 
    public Message postProcessMessage(Message message) throws JMSException { 
     message.setIntProperty("ID", 9999); 
     message.setJMSCorrelationID("123-99999"); 
     return message; 
     } 
    }); 
} 

messaggio è stato creato, ma si sta modificando esso (l'aggiunta di altri due immobili, oltre al nome e l'età). L'interfaccia MessagePostProcessor ti dà accesso al messaggio dopo che è stato convertito, ma prima che venga inviato.

In altre parole! L'impostazione delle proprietà del messaggio, le intestazioni e il corpo non possono essere incapsulati in una classe di convertitore (SimpleMessageConverter), ma l'interfaccia MessagePostProcessor consente di accedere al messaggio dopo che è stato convertito, ma prima di inviarlo.

3

Esso consente l'accesso a basso livello di entità JMS (per esempio alla Session nel SessionCallback utilizzando execute()), mentre ancora in modo affidabile liberando risorse quando l'operazione è completata.

+0

mmm rimane ancora qualcosa di oscuro per me. Quindi, quali sono questi callback (oltre a SessionCallback), quindi proverò a cercare qualche esempio – AndreaNobili

+2

È possibile eseguire operazioni, ad esempio, direttamente su 'Session' - leggere le specifiche JMS. e Javadoc per ulteriori informazioni. –

Problemi correlati