网关和服务激活器作为消息端点(在企业集成模式方面)有什么区别?
答案 0 :(得分:12)
答案 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,以便为您的客户端提供响应。
服务激活器更多地充当传入消息的触发器。假设您的激活器轮询数据库以获取传入消息,然后当条件满足“激活”时,它会调用底层服务。