Diferencia entre revisiones de «Spring Integration»

De Dos Ideas.
Saltar a: navegación, buscar
(Definición de canales de entrada y salida)
(Ver también)
 
(No se muestran 22 ediciones intermedias de 4 usuarios)
Línea 1: Línea 1:
[[Spring Framework]] proporciona integración para [[JMS]], remoting, scheduling, email y [[JMX]]. [[Spring Integration]] intenta crear una capa de abstracción para los [http://www.eaipatterns.com/ patrones de integración empresarial], con la filosofía de separar los componentes de negocio del sistema de mensajeria utilizado.
+
[http://www.springsource.org/spring-integration Spring Integration] es un producto relativamente desconocido del Spring.
 +
Brinda una extensión a Spring para soportar los [http://www.eaipatterns.com/ Patrones de Integración Corporativos] en pocas palabras es un [http://en.wikipedia.org/wiki/Enterprise_service_bus  ESB] liviano montado sobre el contenedor de Spring e independiente del Servidor de aplicaciones. Permite utilizar mensajería dentro de una aplicación Spring, y se integra con sistemas externos a través de adaptadores. Se basa en el concepto de "mensajes" para intercambiar datos entre distintos componentes.
  
==Algunos ejemplos de como utilizar Spring Integration con mensajería.==
+
==Conceptos y componentes básicos==
  
==== Definición de canales de entrada y salida ====
+
===Conceptos===
 +
 
 +
* '''Channel (MessageChannel)''', representa un canal lógico por donde se reciben o se envían mensajes.
 +
 
 +
* '''Channel-adapter''', representa el adaptador entre el canal lógico y una implementación física de ese canal.
 +
 
 +
* '''Bridge''', se encarga de redireccionar todos los mensajes del canal de entrada hacia un canal de salida.
 +
 
 +
* '''Router''', se encarga de redireccionar los mensajes que llegan a un canal de entrada hacia uno o varios canales de salida, dependiendo de ciertas condiciones.
 +
 
 +
* '''Splitter''', se encarga de separar el contenido de un mensaje en muchos mensajes.
 +
 
 +
* '''Transformer''', se encarga de transformar el formato del contenido del mensaje.
 +
 
 +
 
 +
===Componentes===
 +
 
 +
* '''Message''', esta compuesto por una cabecera (headers) y por un cuerpo (Payload).
 +
 
 +
* '''MessageChannel''', provee métodos para enviar y recibir.
 +
 
 +
* '''MessageEndpoint''', Conecta un Handler a un MessageChannel de entrada o/y a uno de salida.
 +
 
 +
* '''MessageHandler''', interfaz que permite transformer, rutear y en general “tartar” cualquier mensaje de Entrada.
 +
 
 +
* '''Channel Adapters''', se usan para enviar y recibir mensajes a sistemas externos.
 +
 
 +
 
 +
==Adaptadores==
 +
 
 +
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#ip TCP y UDP]
 +
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#http HTTP]
 +
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#feed RSS/ATOM]
 +
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#ws Web Services]
 +
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#mail Mail (POP3, IMAP, SMTP)]
 +
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#jms JMS]
 +
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#jdbc JDBC]
 +
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#jmx JMX]
 +
* [http://static.springsource.org/spring-integration/docs/2.0.4.RELEASE/reference/htmlsingle/#rmi RMI]
 +
 
 +
 
 +
== Taller ==
 +
 
 +
{{curso|url=http://www.dosideas.com/cursos/course/view.php?id=12|nombre=Introducción a Spring Integration}}
 +
 
 +
== Ejemplos ==
 +
 
 +
=== Configuración de canales ===
 +
[[Spring Integration]] se basa en ''canales'', lugares en donde se consumen o envian mensajes. Estos canales pueden ser colas [[JMS]] u otros medios, como clases propias. La siguiente definición de canales se usa en los ejemplos que siguen.
  
 
<code xml>
 
<code xml>
 
<integration:channel id="QueueChanneIn"/>
 
<integration:channel id="QueueChanneIn"/>
  
<jms:message-driven-channel-adapter connection-factory="PruebaQueueConnectionFactory" destination-name="jms/Queue-in" destination-resolver="jmsDestinationResolver" channel="QueueChanneIn" acknowledge="auto" concurrent-consumers="1"/>
+
<jms:message-driven-channel-adapter connection-factory="PruebaQueueConnectionFactory"  
 +
destination-name="jms/Queue-in" destination-resolver="jmsDestinationResolver"  
 +
channel="QueueChanneIn" acknowledge="auto" concurrent-consumers="1"/>
  
 
<integration:channel id="QueueChanneOut1"/>
 
<integration:channel id="QueueChanneOut1"/>
Línea 17: Línea 68:
 
</code>
 
</code>
  
====Consumir un mensaje de una cola y mostrarlo por consola. (stdout-channel-adapter)====
+
===stdout-channel-adapter===
 +
Podemos consumir un mensaje de una cola y mostrarlo por consola. Para esto es necesario configurar un '''stdout-channel-adapter''', el cual se encargará de procesar los mensajes. Luego, se crea un '''bridge''' que asocia un canal de entrada con este adaptador.
 +
 
 
<code xml>
 
<code xml>
 
<stream:stdout-channel-adapter id="stdout" append-newline="true"/>
 
<stream:stdout-channel-adapter id="stdout" append-newline="true"/>
Línea 23: Línea 76:
 
</code>
 
</code>
  
====Consumir un mensaje de una cola y enviarlo a una lista fija de colas destino. (recipient-list-router).====
+
===recipient-list-router===
 +
Podemos consumir un mensaje de una cola y enviarlo a una lista fija de canales de destino. En este ejemplo creamos un '''recipient-list-router''', el cual consume mensajes de un canal de entrada y los envia a dos canales de destino distintos. Entonces, cada mensaje que llegue al canal de entrada será derivado a dos canales de destino.  
  
 
<code xml>
 
<code xml>
Línea 32: Línea 86:
 
</code>
 
</code>
  
====Consumir un mensaje de una cola y enviarlo a una cola especifica dependiendo del valor de un atributo del header del mensaje. (header-value-router).====
+
===header-value-router===
 +
Podemos consumir un mensaje de una cola y enviarlo a una cola especifica dependiendo del valor de un atributo del header del mensaje. De esta manera, configuramos un '''header-value-router''', el cual contiene el canal de entrada y el nombre del atributo del encabezado que se comprobará. Luego, se realiza el mapeo entre los posibles valores de este encabezado y algún canal de destino. Si llega un mensaje que coincida este mapeo, será enviado a ese canal de destino.
  
 
<code xml>
 
<code xml>
<integration:header-value-router input-channel="QueueChanneIn" header-name="springintegration_jms_type">
+
<integration:header-value-router input-channel="QueueChanneIn"  
 +
header-name="springintegration_jms_type">
 
         <integration:mapping value="Out1" channel="QueueChanneOut1"/>
 
         <integration:mapping value="Out1" channel="QueueChanneOut1"/>
 
         <integration:mapping value="Out2" channel="QueueChanneOut2"/>
 
         <integration:mapping value="Out2" channel="QueueChanneOut2"/>
Línea 41: Línea 97:
 
</code>
 
</code>
  
====Consumir un mensaje de una cola y enviarlo a una lista de colas de salida utilizando un pojo para determinar a que colas enviarlo.(router).====
+
===router===
 +
Podemos consumir un mensaje de una cola y enviarlo a una lista de colas de salida utilizando un pojo para determinar a que colas enviarlo. En este ejemplo, creamos un '''router''' que será implementado por la clase "MultiDestino". Esta clase devuelve una lista de nombres de canales hacia donde se derivará el mensaje.
  
 
<code xml>
 
<code xml>
Línea 75: Línea 132:
 
</code>
 
</code>
  
 +
==Ver también==
 +
* [http://code.google.com/p/dosideas-aplicaciones-modelo/source/browse/#svn Descargar con svn de nuestro proyecto en google-code la aplicación demo de Spring Integration]
 +
* [http://www.dosideas.com/descargas/category/2-spring-framework.html?download=29%3Ap Descargar un proyecto con varios ejemplos de Spring Integration]
 +
* [[Spring Integration con Pivotal Tracker]]
 +
* [http://static.springsource.org/spring-integration/reference/htmlsingle/spring-integration-reference.html Manual de referencia de Spring Integration]
  
==Ver también==
+
[[Category:Spring Framework]]
* [http://static.springsource.org/spring-integration/reference/htmlsingle/spring-integration-reference.html Spring Integration]
+
[[Category:JMS]]

Revisión actual del 12:33 6 mar 2012

Spring Integration es un producto relativamente desconocido del Spring. Brinda una extensión a Spring para soportar los Patrones de Integración Corporativos en pocas palabras es un ESB liviano montado sobre el contenedor de Spring e independiente del Servidor de aplicaciones. Permite utilizar mensajería dentro de una aplicación Spring, y se integra con sistemas externos a través de adaptadores. Se basa en el concepto de "mensajes" para intercambiar datos entre distintos componentes.

Conceptos y componentes básicos

Conceptos

  • Channel (MessageChannel), representa un canal lógico por donde se reciben o se envían mensajes.
  • Channel-adapter, representa el adaptador entre el canal lógico y una implementación física de ese canal.
  • Bridge, se encarga de redireccionar todos los mensajes del canal de entrada hacia un canal de salida.
  • Router, se encarga de redireccionar los mensajes que llegan a un canal de entrada hacia uno o varios canales de salida, dependiendo de ciertas condiciones.
  • Splitter, se encarga de separar el contenido de un mensaje en muchos mensajes.
  • Transformer, se encarga de transformar el formato del contenido del mensaje.


Componentes

  • Message, esta compuesto por una cabecera (headers) y por un cuerpo (Payload).
  • MessageChannel, provee métodos para enviar y recibir.
  • MessageEndpoint, Conecta un Handler a un MessageChannel de entrada o/y a uno de salida.
  • MessageHandler, interfaz que permite transformer, rutear y en general “tartar” cualquier mensaje de Entrada.
  • Channel Adapters, se usan para enviar y recibir mensajes a sistemas externos.


Adaptadores


Taller

Introducción a Spring Integration
Visitá el taller donde encontrarás más información, ejemplos y prácticas sobre este tema.

Ejemplos

Configuración de canales

Spring Integration se basa en canales, lugares en donde se consumen o envian mensajes. Estos canales pueden ser colas JMS u otros medios, como clases propias. La siguiente definición de canales se usa en los ejemplos que siguen.

<integration:channel id="QueueChanneIn"/>

<jms:message-driven-channel-adapter connection-factory="PruebaQueueConnectionFactory" destination-name="jms/Queue-in" destination-resolver="jmsDestinationResolver" channel="QueueChanneIn" acknowledge="auto" concurrent-consumers="1"/>

<integration:channel id="QueueChanneOut1"/> <jms:outbound-channel-adapter jms-template="jmsQueueTemplateOut1" channel="QueueChanneOut1"/>

<integration:channel id="QueueChanneOut2"/> <jms:outbound-channel-adapter jms-template="jmsQueueTemplateOut2" channel="QueueChanneOut2"/>

stdout-channel-adapter

Podemos consumir un mensaje de una cola y mostrarlo por consola. Para esto es necesario configurar un stdout-channel-adapter, el cual se encargará de procesar los mensajes. Luego, se crea un bridge que asocia un canal de entrada con este adaptador.

<stream:stdout-channel-adapter id="stdout" append-newline="true"/> <integration:bridge id="echo" input-channel="QueueChanneIn" output-channel="stdout"/>

recipient-list-router

Podemos consumir un mensaje de una cola y enviarlo a una lista fija de canales de destino. En este ejemplo creamos un recipient-list-router, el cual consume mensajes de un canal de entrada y los envia a dos canales de destino distintos. Entonces, cada mensaje que llegue al canal de entrada será derivado a dos canales de destino.

<integration:recipient-list-router input-channel="QueueChanneIn" apply-sequence="true">

           <integration:recipient channel="QueueChanneOut1"/>
           <integration:recipient channel="QueueChanneOut2"/>

</integration:recipient-list-router>

header-value-router

Podemos consumir un mensaje de una cola y enviarlo a una cola especifica dependiendo del valor de un atributo del header del mensaje. De esta manera, configuramos un header-value-router, el cual contiene el canal de entrada y el nombre del atributo del encabezado que se comprobará. Luego, se realiza el mapeo entre los posibles valores de este encabezado y algún canal de destino. Si llega un mensaje que coincida este mapeo, será enviado a ese canal de destino.

<integration:header-value-router input-channel="QueueChanneIn" header-name="springintegration_jms_type">

       <integration:mapping value="Out1" channel="QueueChanneOut1"/>
       <integration:mapping value="Out2" channel="QueueChanneOut2"/>

</integration:header-value-router>

router

Podemos consumir un mensaje de una cola y enviarlo a una lista de colas de salida utilizando un pojo para determinar a que colas enviarlo. En este ejemplo, creamos un router que será implementado por la clase "MultiDestino". Esta clase devuelve una lista de nombres de canales hacia donde se derivará el mensaje.

<integration:router input-channel="QueueChanneIn" ref="multiDestino"/> <bean id="multiDestino" class="com.dosideas.springintegration.MultiDestino"/>

public class MultiDestino {

   @Router
   public List<String> resolverChannel(GenericMessage message) throws JMSException {
       List<String> list = new ArrayList<String>();
       if(message.getHeaders().get("springintegration_jms_type").equals("Out1")) {
           System.out.println(message.getHeaders().get("springintegration_jms_type"));
           list.add("QueueChanneOut1");
           
       }
       else if(message.getHeaders().get("springintegration_jms_type").equals("Out2")) {
           System.out.println(message.getHeaders().get("springintegration_jms_type"));
           list.add("QueueChanneOut2");
       }
       else if(message.getHeaders().get("springintegration_jms_type").equals("Multi")) {
           System.out.println(message.getHeaders().get("springintegration_jms_type"));
           list.add("QueueChanneOut1");
           list.add("QueueChanneOut2");
       }
       return list;
   }

}

Ver también