В чем разница между Gateway и Service Activator?

В чем разница между Gateway и Service Activator как конечными точками сообщений (с точки зрения шаблонов интеграции с корпорацией)?

Ответы

Ответ 1

http://eaipatterns.com/

Как правило, активатор службы используется для вызова локальной службы таким образом, что служба не знает, что она вызывается из системы обмена сообщениями.

Шлюз обычно является точкой входа или выхода для системы обмена сообщениями.

Ответ 2

Активатор службы вызывает метод на объекте, где разработчик приложения обеспечивает реализацию. Spring Интеграция заботится о вызове метода с сообщениями из входного канала и отключении результатов до некоторого выходного канала. Код приложения может выполнять какую-то произвольную работу.

Для шлюза разработчик приложения предоставляет только интерфейс, его реализация обеспечивается Spring.

Приложение к документации по интеграции Spring включает Пример кафе, где Barista - это услуга, вызванная активатором службы, а Cafe - это шлюз.

Основной метод приложения ищет объект Cafe из контекста приложения Spring и вызывает на нем placeOrder, передавая Order in в качестве аргумента:

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 генерирует реализацию, которая отправляет Заказы, переданные в нее по каналу ввода, называемому "заказы".

Далее по трубопроводу есть два активатора обслуживания, которые имеют ссылку на Barista. Barista - это 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;
      }
  }

Бариста получает заказы на пить из входного канала сервис-активатор и имеет вызванный метод, который возвращает напиток, который отправляется по выходному каналу сервис-активатор, "readyDrinks".

Ответ 3

Для меня шлюз используется для создания абстракции и предоставления нормализованного API для одной или нескольких внутренних служб. Например, у вас есть 5 провайдеров, которые используют разные способы взаимодействия с вами (SOAP, REST, XML/http, что угодно), но ваш клиент хочет только один способ получить данные (пусть говорит json/REST). Шлюз преобразует запрос json из вашего клиента и конвертирует его в правый бэкэнд со своим собственным протоколом после того, как он преобразует backend-ответ на json, чтобы дать ответ вашему клиенту.

Активатор службы действует скорее как триггер для входящего сообщения. Скажем, ваш активатор опросит базу данных для входящего сообщения, а затем, когда условие соответствует "активации", он вызывает базовую услугу.

Информация для шлюза здесь.

Информация для активатора здесь.