Gateway和Service Activator有什么区别?

时间:2012-04-29 13:49:48

标签: spring-integration enterprise-integration

网关和服务激活器作为消息端点(在企业集成模式方面)有什么区别?

3 个答案:

答案 0 :(得分:12)

http://eaipatterns.com/

通常,服务激活器用于调用本地服务,使服务不知道它是从消息传递系统调用的。

网关通常是邮件系统的入口或出口点。

答案 1 :(得分:7)

服务激活器在应用程序开发人员提供实现的对象上调用方法。 Spring Integration负责使用来自输入通道的消息调用方法,并将结果分流到某个输出通道。应用程序提供的代码可以做一些任意的工作。

对于网关,应用程序开发人员只提供一个接口,其实现由Spring提供。

Spring Integration文档的附录包括Cafe example,其中Barista是通过服务激活器调用的服务,而Cafe是一个网关。

应用程序的main方法从Spring应用程序上下文中查找Cafe对象,并在其上调用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生成一个实现,它将传递给它的Orders发送到名为&#34; orders&#34;的输入通道中。

在管道的下方,有两个服务激活器,它们引用了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;
      }
  }

Barista从服务激活器的输入通道接收饮料订单,并且有一个调用它的方法返回饮料,该饮料从服务激活器的输出通道发送,&#34; preparedDrinks&#34 ;.

答案 2 :(得分:1)

对我来说,网关用于进行抽象,并为一个或多个后端服务提供规范化的API。 例如,您有5个使用不同方式与您交互的提供者(SOAP,REST,XML / http,等等),但您的客户只需要一种方法来获取数据(让我们说json / REST)。 网关将从您的客户端转换json请求,并使用自己的协议将它们转换为正确的后端,之后它会将后端响应转换为json,以便为您的客户端提供响应。

服务激活器更多地充当传入消息的触发器。假设您的激活器轮询数据库以获取传入消息,然后当条件满足“激活”时,它会调用底层服务。

Info for gateway here.

Info for Activator here.