Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring integration 网关和服务激活器之间的区别是什么?_Spring Integration_Enterprise Integration - Fatal编程技术网

Spring integration 网关和服务激活器之间的区别是什么?

Spring integration 网关和服务激活器之间的区别是什么?,spring-integration,enterprise-integration,Spring Integration,Enterprise Integration,网关和Service Activator作为消息端点(在企业集成模式方面)有什么区别 通常,服务激活器用于调用本地服务,其方式使服务不知道正在从消息传递系统调用它 网关通常是消息传递系统的入口或出口点 对我来说,网关用于进行抽象,并为一个或多个后端服务提供标准化API。 例如,您有5个提供程序,它们使用不同的方式与您进行接口(SOAP、REST、XML/http等),但您的客户机只需要一种方式来获取数据(比如json/REST)。 网关将从您的客户机转换json请求,并使用自己的协议将它们转换为

网关和Service Activator作为消息端点(在企业集成模式方面)有什么区别

通常,服务激活器用于调用本地服务,其方式使服务不知道正在从消息传递系统调用它


网关通常是消息传递系统的入口或出口点

对我来说,网关用于进行抽象,并为一个或多个后端服务提供标准化API。 例如,您有5个提供程序,它们使用不同的方式与您进行接口(SOAP、REST、XML/http等),但您的客户机只需要一种方式来获取数据(比如json/REST)。 网关将从您的客户机转换json请求,并使用自己的协议将它们转换为正确的后端,然后将后端响应转换为json以向您的客户机提供响应

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


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

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

Spring集成文档的附录包括一个示例,其中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);
      }
  }

咖啡师从服务激活器的输入通道接收饮料订单,并在其上调用一个返回饮料的方法,该饮料被发送到服务激活器的输出通道“preparedDrinks”

我已经检查了EAI站点,但是,我读了好几遍,对这两个概念并不清楚。我也在一本书中读到过,但(在我的脑海中)仍然不够清楚。它们都是端点(一个封装Springbean,如您所述,将服务与消息传递系统分离),而另一个公开服务接口。到目前为止,我发现一个可以生成应答(ServiceActivator),而另一个可以管理应答(gateway),如等待应答或超时应答。对吗?这是主要的区别还是更重要的区别?让我们谈谈Spring集成对模式的实现。A接收消息并调用方法,通常使用作为消息有效负载的方法参数;如果该方法返回void,那么当该方法返回时,就没有什么要做的了。如果它返回某个对象,它将成为新的消息有效负载,并将消息发送到输出通道。在Spring集成中,有两种类型的网关。消息传递网关是一种允许java应用程序调用消息传递流的实现;参数通常成为有效负载。您只需定义一个接口,Spring Integration就会构建实现,将参数作为消息处理。第二种类型的网关用于与其他系统接口-有入站和出站网关。入站网关用于使用某些技术(JMS、HTTP等)公开消息传递系统。出站网关用于从通过某种技术(JMS、HTTP等)公开某些服务的系统进行发送和接收。有很多这样类型的网关(twitter、TCP、FTP……等等),好吧,所以一个在设计上与另一个几乎相反(一个包装服务,另一个构建服务——至少是消息网关)是的;此外,还有一个入站通道适配器,用于轮询mehod以获取新消息;以及一个出站通道适配器,它调用一个返回void的方法(类似于一个返回void的服务激活器,但出站适配器必须返回void)。
  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;
      }
  }