2015-04-05 13 views
5

to jest mój pierwszy raz z Wiosna JMS (i ogólnie JMS) i mam pewne wątpliwości związane z pojęciem wywołania zwrotnego JBLTTTT JMSTemplate.Co to jest wywołanie zwrotne JmsTemplate w Spring JMS?

wiem, że JmsTemplate to klasa pod warunkiem, od wiosny do:

  • Zmniejsza kod szablonowe.
  • Zarządza zasobami w sposób przezroczysty.
  • Konwertuje sprawdzane wyjątki na ekwiwalenty środowiska wykonawczego.
  • Zapewnia wygodę i oddzwanianie.

oraz że jest używany do generowania wiadomości i odbierania synchronicznych wiadomości. Upraszcza korzystanie z JMS, ponieważ obsługuje tworzenie i zwalnianie zasobów podczas wysyłania lub synchronicznego odbierania wiadomości.

Czytając oficjalnej dokumentacji sprężyna (tutaj: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jms.html) znalazłem:

kod posługuje się JmsTemplate tylko musi wdrożyć wywołanie zwrotne interfejsy nadając im jasno określony kontrakt wysokim poziomie. Interfejs wywołania zwrotnego MessageCreator tworzy komunikat o sesji dostarczonej przez kod wywołujący w JmsTemplate.

Nie jest to dla mnie jasne. Czym dokładnie są te oddzwanianie?

Na początku myślałem, że callback jest metodą dostarczoną z JmsTemplate, ale czytanie tutaj wydaje się czymś bardziej podobnym do interfejsu, który muszę zaimplementować. Jak to działa?

I również, ten przykład:

Wysyłanie POJO throught JMS (przy użyciu 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 
    } 
} 

, że uważano, że convertAndSend() metodą jest JmsTemplate zwrotna ale prawdopodobnie to stwierdzenie nie jest poprawne.

Czy możesz mi wyjaśnić, co to jest wywołanie zwrotne JmsTemplate?

Odpowiedz

6

Zasada projekt wspólny dla klas Wiosna szablonu jest zapewnienie metody pomocnika do wykonywania typowych operacji i dla bardziej zaawansowanych zastosowań delegat istotą zadania realizowane przetwarzania do interfejsów użytkownika oddzwonienia.

W JMS połączenie zostanie uzyskane z fabryki

=> Od tej sesji połączenia jest tworzony, o seesion jest jednostką pracy, zapewnia również transakcja

=> z sesji utworzyć inny typy wiadomości JMS, takie jak wiadomości tekstowe, wiadomości obiektowe, wiadomości z mapą, wiadomości z bajtów i wiadomości z wiadomością strumieniową w następujący sposób: session.createTextMessage ("hello queue world"); session.createObjectMessage (someSerializedObject) i tak dalej

=> tej samej sesji jest również odpowiedzialny za tworzenie instancji z MessageProducer session.createProducer (docelowego) i MessageConsumer session.createConsumer (docelowym)

Masz następujące możliwości convertAndSend (Przeciążone metody):

 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) 

Co się dzieje? Podstawowym zastosowaniem wywołania zwrotnego takiego jak 3rd 5th and 6th signature jest możliwość zmiany wiadomości po przekonwertowaniu obiektu na wiadomość JMS za pośrednictwem skonfigurowanego MessageConvertera. Widzisz rzeczywiste miejsce docelowe do rozstrzygnięcia przez DestinationResolver w przypadku szóstej, nie przekazujesz go, zostanie ono rozwiązane z JNDI, jeśli jest tam zarejestrowane.

Co to znaczy?

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

Tutaj w tym przykładzie widzisz z() metoda send z JMS szablonu są zapewniając anonimowy implementacja (callback), gdzie metoda daje dostęp do do sesji przedmiot i od tamtej sesji ty stworzone dostosowane sesji .createTextMessage (wiadomość "hello queue world").

sam sposób convertAndSend (można uzyskać dostęp do postprocesorów zmodyfikować)

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

Wiadomość Obiekt został stworzony, ale jesteś modyfikacji (dodanie dwóch więcej właściwości, oprócz imienia i wieku). Interfejs MessagePostProcessor zapewnia dostęp do wiadomości po jej przekonwertowaniu, ale przed jej wysłaniem.

Innymi słowy! ustawienie właściwości wiadomości, nagłówków i treści nie może być obudowane wewnątrz klasy konwertera (SimpleMessageConverter), ale interfejs MessagePostProcessor zapewnia dostęp do wiadomości po jej przekonwertowaniu, ale przed wysłaniem.

3

Pozwala niski poziom dostępu do podmiotów JMS (na przykład do Session w SessionCallback wykorzystaniem execute()), natomiast nadal niezawodnie uwalniając zasoby, gdy operacja jest zakończona.

+0

mmm nadal pozostaje dla mnie czymś niejasnym. Więc jakie są te wywołania zwrotne (oprócz SessionCallback), więc spróbuję wyszukać jakiś przykład – AndreaNobili

+2

Możesz wykonywać operacje, na przykład, bezpośrednio na 'Sesji' - przeczytaj specyfikację JMS. i Javadocs po więcej informacji. –

Powiązane problemy