2012-04-29 37 views

回答

11

http://eaipatterns.com/

通常情況下,服務激活器用於調用本地服務,以這樣的方式,該服務並不知道它正在從一個郵件系統調用。

網關通常是消息傳遞系統的入口點或出口點。

+0

我已經檢查過EAI網站,但多次閱讀,並且對這兩個概念並不清楚。也讀了一本書,但它仍然不夠清楚(在我的腦海中)。它們都是端點(如你所提到的那樣,它包裝了一個spring bean,將服務與消息傳遞系統分開),而另一個暴露了服務接口。到目前爲止,我發現的是,可以生成一個回覆(服務激活器),而另一個人可以管理回覆(網關),就像在等待或退出時一樣。那是對的嗎?這是主要的區別還是更多呢? – Belun 2012-04-30 07:38:20

+8

讓我們來談談Spring Integration對模式的實現。一個接收一個消息並調用一個方法,通常使用一個方法參數作爲消息的有效載荷;如果方法返回void,則方法返回時沒有更多操作。如果它返回一些對象,它將成爲新的消息有效載荷,並將消息發送到輸出通道。在Spring Integration中,有兩種類型的網關。消息傳遞網關是一個允許Java應用程序調用消息流的實現;該參數通常成爲有效載荷。 – 2012-04-30 11:55:55

+4

您只需定義一個接口,然後Spring Integration將該實現構建爲消息處理參數。 第二種類型的網關用於連接到其他系統 - 有入站和出站網關。入站網關用於使用某種技術(JMS,HTTP等)公開消息系統。出站網關用於通過某種技術(JMS,HTTP等)公開某些服務的系統發送和接收。有很多這些類型的網關(twitter,TCP,FTP等等) – 2012-04-30 11:59:22

1

對我來說,網關用於進行抽象併爲一個或多個後端服務提供規範化的API。 例如,您有5個提供者使用不同的方式與您進行交互(SOAP,REST,XML/http,不管),但您的客戶端只需要一種方法來獲取數據(讓json/REST說)。 網關將轉換您的客戶端的json請求並將其轉換爲具有自己協議的右後端,之後它會將後端響應轉換爲json以將響應提供給客戶端。

服務激活器更多地作爲傳入消息的觸發器。假設您的激活器輪詢傳入消息的數據庫,然後當條件滿足「激活」時,它會調用基礎服務。

Info for gateway here.

Info for Activator here.

6

服務激活調用對象,其中該應用程序開發者提供的執行情況的方法。 Spring Integration負責使用來自輸入通道的消息調用該方法,並將結果分流到某個輸出通道。應用程序提供的代碼可以執行一些任意的工作。

對於網關應用程序開發人員只提供一個接口,它的實現是由Spring提供的。

Spring集成文檔的附錄包括Cafe example,其中Barista是通過服務激活器調用的服務,Cafe是網關。

應用程序的主要方法從Spring應用程序上下文中查找一個咖啡廳對象,並調用placeOrder,它在傳遞一個訂單作爲參數:

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

咖啡廳是,應用程序沒有接口提供一個實現。 Spring生成一個實現,將傳遞給它的Orders發送到名爲「orders」的輸入通道。

更深入的管道,有兩個服務激活器有一個參考咖啡師。咖啡師是具有代碼來創建這樣的喝POJO:

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

咖啡師從服務激活的輸入通道接收飲料的訂單,並有一個名爲方法就可以返回一個飲料,其被髮下來服務激活器的輸出通道「preparedDrinks」。