spring-integration - example - spring integration spring boot
¿Cuál es la diferencia entre Gateway y Service Activator? (3)
¿Cuál es la diferencia entre Gateway y Service Activator como puntos finales de mensajes (en términos de patrones de integración empresarial)?
El activador de servicios llama a un método en un objeto donde el desarrollador de la aplicación proporciona la implementación. Spring Integration se ocupa de llamar al método con mensajes del canal de entrada y desviar los resultados a algún canal de salida. El código proporcionado por la aplicación puede hacer un trabajo arbitrario.
Para la puerta de enlace, el desarrollador de la aplicación proporciona solo una interfaz, su implementación la proporciona Spring.
Un apéndice a la documentación de Spring Integration incluye un ejemplo de Cafe donde Barista es un servicio llamado a través de un activador de servicio, y Cafe es una puerta de enlace.
El método principal de la aplicación busca un objeto Cafe desde el contexto de la aplicación Spring y llama a placeOrder, sobre él, pasando una Orden como argumento:
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);
}
}
The Cafe es una interfaz para la que la aplicación no proporciona una implementación. Spring genera una implementación que envía los pedidos pasados por el canal de entrada llamado "pedidos".
Más abajo en la tubería, hay dos activadores de servicio que tienen una referencia al Barista. El barista es un POJO que tiene un código para crear una bebida como esta:
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;
}
}
El Barista recibe pedidos de bebidas del canal de entrada del activador de servicio y tiene un método llamado que devuelve una Bebida, que se envía por el canal de salida del activador de servicio, "prepareDrinks".
Para mí, la puerta de enlace se utiliza para realizar una abstracción y proporcionar una API normalizada para uno o más servicios de back-end. Por ejemplo, tiene 5 proveedores que utilizan diferentes formas de interactuar con usted (SOAP, REST, XML / http, lo que sea), pero su cliente solo quiere una forma de obtener los datos (digamos json / REST). La puerta de enlace convertirá la solicitud json de su cliente y las convertirá al backend correcto con su propio protocolo, después de que convierta la respuesta del backend a json para dar la respuesta a su cliente.
El activador de servicio actúa más como un disparador en un mensaje entrante. Digamos que su activador sondea una base de datos para el mensaje entrante y luego, cuando la condición cumple con la "activación", llama al servicio subyacente.
Normalmente, un activador de servicio se usa para invocar un servicio local, de tal manera que el servicio no sabe que se está invocando desde un sistema de mensajería.
Una puerta de enlace es típicamente un punto de entrada o salida para el sistema de mensajería.