web-dev-qa-db-ja.com

GatewayとServiceActivatorの違いは何ですか?

メッセージエンドポイントとしてのゲートウェイとサービスアクティベーターの違いは何ですか(エンタープライズ統合パターンの観点から)?

22
Belun

http://eaipatterns.com/

通常、サービスアクティベータは、メッセージングシステムから呼び出されていることをサービスが認識しないように、ローカルサービスを呼び出すために使用されます。

ゲートウェイは通常、メッセージングシステムの入口または出口です。

12
Gary Russell

サービスアクティベーターは、アプリケーション開発者が実装を提供するオブジェクトのメソッドを呼び出します。 Spring Integrationは、入力チャネルからのメッセージを使用してメソッドを呼び出し、結果を出力チャネルにシャントします。アプリケーションが提供するコードは、任意の作業を実行できます。

ゲートウェイの場合、アプリケーション開発者はインターフェースのみを提供し、その実装はSpringによって提供されます。

Spring Integrationドキュメントの付録には、 Cafeの例 が含まれています。ここで、Baristaはサービスアクティベータを介して呼び出されるサービスであり、Cafeはゲートウェイです。

アプリケーションのメインメソッドは、SpringアプリケーションコンテキストからCafeオブジェクトを検索し、placeOrderを呼び出して、引数としてOrderを渡します。

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

Cafeは、アプリケーションが実装を提供しないインターフェースです。 Springは、渡されたOrdersを「orders」と呼ばれる入力チャネルに送信する実装を生成します。

パイプラインのさらに下流には、バリスタを参照する2つのサービスアクティベーターがあります。バリスタは、次のような飲み物を作成するためのコードを持つ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」に送信されます。

7
Nathan Hughes

私にとって、ゲートウェイは抽象化を行うために使用され、1つ以上のバックエンドサービスに正規化されたAPIを提供します。たとえば、さまざまな方法(SOAP、REST、XML/httpなど)を使用している5つのプロバイダーがありますが、クライアントはデータを取得する方法を1つしか望んでいません(json/RESTとしましょう)。ゲートウェイは、クライアントからのjsonリクエストを変換し、独自のプロトコルを使用して適切なバックエンドに変換します。その後、バックエンドの応答をjsonに変換して、クライアントに応答を提供します。

サービスアクティベータは、着信メッセージのトリガーとして機能します。アクティベーターが着信メッセージについてデータベースをポーリングし、条件が「アクティベーション」を満たすと、基盤となるサービスを呼び出すとします。

ゲートウェイの情報はこちら

アクティベーターの情報はこちら

1
рüффп