2012-04-29 11 views

risposta

11

http://eaipatterns.com/

Tipicamente, un attivatore servizio viene utilizzato per richiamare un servizio locale, in modo tale che il servizio non sa esso viene richiamato da un sistema di messaggistica.

Un gateway è in genere un punto di ingresso o di uscita per il sistema di messaggistica.

+0

avevo già controllato il sito EAI ma, letta più volte, e non era chiaro sui due concetti. anche leggere su di loro in un libro, ma non era ancora abbastanza chiaro (nella mia testa).sono entrambi endpoint (uno avvolge un bean spring, come hai detto, disaccoppiando il servizio dal sistema di messaggistica), mentre l'altro espone un'interfaccia di servizio. quello che ho scoperto finora è che si può generare una risposta (attivatore di servizi) mentre l'altro può gestire una risposta (gateway), come in attesa o time-out. è corretto? è questa la differenza principale o è più importante? – Belun

+8

Parliamo in termini di implementazione dei modelli di Spring Integration. Un riceve un messaggio e invoca un metodo, solitamente con un parametro metodo che è il carico utile del messaggio; se il metodo restituisce void non c'è più nulla da fare quando il metodo ritorna. Se restituisce un oggetto, diventa il nuovo payload del messaggio e il messaggio viene inviato al canale di output. In Spring Integration, ci sono due tipi di gateway. Il gateway di messaggistica è un'implementazione che consente a un'applicazione java di richiamare un flusso di messaggi; il parametro di solito diventa il carico utile. –

+4

Basta definire un'interfaccia e Spring Integration crea l'implementazione per gestire il parametro come un messaggio. Il secondo tipo di gateway è per l'interfaccia ad altri sistemi: ci sono gateway in entrata e in uscita. I gateway in ingresso vengono utilizzati per esporre un sistema di messaggistica utilizzando una tecnologia (JMS, HTTP ecc.). Un gateway in uscita viene utilizzato per inviare e ricevere da un sistema che espone alcuni servizi su alcune tecnologie (JMS, HTTP ecc.). Ci sono molti tipi di gateway (twitter, TCP, FTP ... e molti altri) ok –

1

Per me il gateway viene utilizzato per creare un'astrazione e fornire un'API normalizzata per uno o più servizi di back-end. E.g Hai 5 fornitori che usano diversi modi per interfacciarsi con te (SOAP, REST, XML/http, qualunque cosa), ma il tuo cliente vuole solo un modo per ottenere i dati (diciamo json/REST). Il gateway convertirà il modulo di richiesta json del client e convertirli nel back-end giusto con il proprio protocollo, dopo che convertirà la risposta backend in json per fornire la risposta al client.

L'attivatore di servizio funge più da trigger su un messaggio in arrivo. Diciamo che il tuo attivatore esegue il polling di un database per il messaggio in arrivo e quindi quando la condizione soddisfa l'"attivazione" chiama il servizio sottostante.

Info for gateway here.

Info for Activator here.

6

L'attivatore servizio chiama un metodo su un oggetto in cui lo sviluppatore dell'applicazione fornisce l'implementazione. Spring Integration si occupa di chiamare il metodo con i messaggi dal canale di input e di deviare i risultati su un canale di uscita. Il codice fornito dall'applicazione può eseguire un lavoro arbitrario.

Per il gateway lo sviluppatore dell'applicazione fornisce solo un'interfaccia, la sua implementazione è fornita da Spring.

Un'appendice alla documentazione di Spring Integration include uno Cafe example dove Barista è un servizio chiamato tramite un attivatore di servizi e Cafe è un gateway.

metodo principale dell'applicazione guarda un oggetto Cafe dal contesto dell'applicazione primavera e chiama PlaceOrder, su di essa, passando un Ordine come argomento:

public static void main(String[] args) { 
     AbstractApplicationContext context = null; 
     if (args.length > 0) { 
      context = new FileSystemXmlApplicationContext(args); 
     } 
     else { 
      context = new ClassPathXmlApplicationContext(
      "cafeDemo.xml", CafeDemo.class); 
     } 
     Cafe cafe = (Cafe) context.getBean("cafe"); 
     for (int i = 1; i <= 100; i++) { 
      Order order = new Order(i); 
      order.addItem(DrinkType.LATTE, 2, false); 
      order.addItem(DrinkType.MOCHA, 3, true); 
      cafe.placeOrder(order); 
     } 
    } 

Il Cafe è un'interfaccia che l'applicazione non lo fa fornire un'implementazione per. Spring genera un'implementazione che invia gli ordini passati al canale di input chiamato "orders".

In fondo alla pipeline, ci sono due service-activators che hanno un riferimento al barista. Il Barista è un POJO che ha il codice per la creazione di una bevanda come questo:

public Drink prepareHotDrink(OrderItem orderItem) { 
     try { 
      Thread.sleep(this.hotDrinkDelay); 
      System.out.println(Thread.currentThread().getName() 
        + " prepared hot drink #" + hotDrinkCounter.incrementAndGet() 
        + " for order #" + orderItem.getOrder().getNumber() 
        + ": " + orderItem); 
      return new Drink(orderItem.getOrder().getNumber(), 
        orderItem.getDrinkType(), 
        orderItem.isIced(), orderItem.getShots()); 
     } 
     catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
      return null; 
     } 
    } 

Il Barista riceve ordini da bere dal canale di ingresso del servizio-attivatore e ha un metodo chiamato su di esso che restituisce un bevanda, che viene fatto scendere il canale di uscita dell'attivatore di servizi, "readyDrinks".

Problemi correlati