2015-04-05 6 views
5

Dies ist mein erstes Mal mit Spring JMS (und mit JMS im Allgemeinen) und ich habe einige Zweifel im Zusammenhang mit dem Konzept der JmsTemplate Rückruf.Was ist ein JmsTemplate-Callback in Spring JMS?

Ich weiß, dass die JmsTemplate eine Klasse von Frühling bis vorgesehen ist:

  • Reduziert Standardcode.
  • Ressourcen transparent verwalten.
  • Konvertiert geprüfte Ausnahmen in Laufzeitäquivalente.
  • Bietet bequeme Methoden und Rückrufe.

und dass es für die Nachrichtenproduktion und den synchronen Nachrichtenempfang verwendet wird. Es vereinfacht die Verwendung von JMS, da es die Erstellung und Freigabe von Ressourcen beim Senden oder synchronen Empfangen von Nachrichten übernimmt.

den Frühling offizielle Dokumentation lesen (hier: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jms.html) Ich fand:

Code, der die JmsTemplate verwendet nur Rückruf implementieren muss Schnittstellen ihnen einen klar definierte hohen Vertrag zu geben. Die MessageCreator-Callback-Schnittstelle erstellt eine Nachricht mit einer Sitzung , die vom aufrufenden Code in JmsTemplate bereitgestellt wird.

Das ist nicht klar für mich. Was genau sind diese Rückruf?

Am Anfang dachte ich, dass ein Callback eine Methode ist, die von der JmsTemplate zur Verfügung gestellt wird, aber hier zu lesen, es scheint etwas ähnlicher zu einer Schnittstelle, die ich implementieren muss. Wie es funktioniert?

Ich fand auch dieses Beispiel:

A POJO Throught JMS Senden (die JmsTemplate verwenden):

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 
    } 
} 

dachte ich, dass die convertAndSend() Methode ist ein JmsTemplate Rückruf aber wahrscheinlich ist diese Behauptung nicht korrekt.

Können Sie mir erklären, was genau ein JmsTemplate-Rückruf ist?

Antwort

6

Das Konstruktionsprinzip gemeinsam Frühling Template-Klassen ist Hilfsmethoden zur Verfügung zu stellen und für anspruchsvollere Nutzung, Delegaten der Essenz des Verarbeitung Benutzer-Task implementiert gemeinsame Operationen Schnittstellen Rückruf durchzuführen.

In JMS-Verbindung wird von einer Fabrik

=> Von dieser Verbindungssitzung wird ein seesion erstellt erhalten werden ist eine Einheit der Arbeit, sondern bietet auch Transaktion

=> von Sitzung erstellen Sie unterschiedlich Arten von JMS-Nachrichten wie TextMessage, ObjectMessage, MapMessage, BytesMessage und StreamMessage auf folgende Weise session.createTextMessage ("hallo queue world"); session.createObjectMessage (someSerializedObject) und so weiter

=> Die gleiche Sitzung ist auch verantwortlich Instanz MessageProducer session.createProducer (Ziel) und Message session.createConsumer (Ziel)

Sie haben folgende convertAndSend Möglichkeiten für die Erstellung von (Überladene Methoden):

 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) 

Was geschieht? Die grundlegende Verwendung von Callback wie 3. 5. und 6. Signatur ist, dass Sie die Nachricht ändern können, nachdem Sie das Objekt in eine JMS-Nachricht über einen konfigurierten MessageConverter konvertiert haben. Sie sehen ein tatsächliches Ziel, das von einem DestinationResolver im Fall von 6 aufgelöst werden soll. Sie übergeben es nicht. Es wird von JNDI aufgelöst, wenn es dort registriert ist.

Was bedeutet das?

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

Hier in diesem Beispiel, das Sie mit send() -Methode von JMS-Vorlage sehen Sie anonyme Implementierung bereitstellen (Callback), wo die Methode können Sie auf Objekt zu Session zugreifen und von dieser Sitzung erstellt Ihnen Sitzung angepasst .createTextMessage ("hallo queue world") Nachricht.

gleiche Art und Weise in convertAndSend (Sie können den Zugriff auf Postprozessoren zu bekommen zu ändern)

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; 
     } 
    }); 
} 

Nachrichtenobjekt erstellt wurde, aber Sie es modifizieren (um zwei weitere Eigenschaften, zusätzlich zu den Namen und das Alter). Die MessagePostProcessor-Schnittstelle gibt Ihnen Zugriff auf die Nachricht, nachdem sie konvertiert wurde, aber bevor sie gesendet wird.

Mit anderen Worten! Einstellung von Nachrichteneigenschaften, Kopfzeilen und Textkörper können nicht innerhalb einer Konverterklasse (SimpleMessageConverter) gekapselt werden, aber die MessagePostProcessor-Schnittstelle gibt Ihnen Zugriff auf die Nachricht, nachdem sie konvertiert wurde, aber bevor sie gesendet wurde.

3

Es ermöglicht Ihnen den Zugriff auf JMS-Einheiten auf niedriger Ebene (z. B. Session in SessionCallback unter Verwendung von execute()), während Ressourcen nach Abschluss des Vorgangs weiterhin zuverlässig freigegeben werden.

+0

mmm es bleibt immer noch etwas unklar für mich. Also, was sind diese Callback (zusätzlich zu SessionCallback), so werde ich versuchen, ein Beispiel zu suchen – AndreaNobili

+2

Sie können Operationen ausführen, zum Beispiel direkt auf der 'Session' - lesen Sie die JMS Spec. und Javadocs für weitere Informationen. –