Spring Integeration学习

来源:互联网 发布:讲课视频软件 小学 编辑:程序博客网 时间:2024/06/07 02:32

Spring Integeration涉及的概念很多,最重要的有三点:Message、Channel、EndPoint

1、Message

Message是Spring Integration最基本的概念之一。Message是对系统内各节点间交互内容封装的对象。可以把Spring Integration比作一系列的管道,那么Message就是管道中流动的水。

Message对象包含两部分,消息头(header)和负载(payload)。消息头包含消息Id、时间戳、优先级等信息。负载中放什么都可以,这里是真正要交互的数据。

Message 接口定义:

public interface Message<T> {

      T getPayload();

      MessageHeadersgetHeaders();

}

2、Channel

Channel也是Spring Integration中最基本的概念之一。Channel就好像一个管子,生产者生产一个Message放到Channel,消费者从Channel消费一个Message,所以Channel可以对Message组件解耦,并且可以提供一个方便的拦截功能和监控功能

MessageChannel 接口定义

public interface MessageChannel {

     boolean send(Message message);

        boolean send(Messagemessage, long timeout);

}

3、EndPoint

Message Endpoint是指处理Message的端点,在Channel中不能处理消息。对消息的处理只能在这里完成。这里不需要修改你的代码,只需要做一些配置声明即可完成预取操作。


Spring Integeration实践

a、Spring Integration中Http相关的概念有Http Inbound Gateway、Http Outbound Gateway。可以把http Inboundgateway 看作是服务端组件,Http OutboundGateway看作客户端组件。

服务器端:

Http Inbound-gateway用来接受/receiveGateway的POST请求或GET请求,并连接到一个receiveChannel通道,通道关联到一个service-activator,service-activator对应一个empolyeeSearchService服务类的hello方法。配置如下:

<int-http:inbound-gateway

         request-channel="receiveChannel" 

 name="/receiveGateway" 

 supported-methods="POST,GET"/> 

<int:channelid="receiveChannel"/>     

<int:service-activator

         input-channel="receiveChannel"

         ref="employeeSearchService"

        method="hello""/>

1. 拦截器应用

拦截器作用在Channel上,可以实现编解码、加密解密、鉴权、日志、监控等操作。我们的实例中也可以在Channel上设置拦截器,配置如下:

<int:channelid="inputChannel">

         <int:interceptors>

                 <refbean="myChannelInterceptor"/>

                 <refbean="mysecondChannelInterceptor"/>

          </int:interceptors>

  </int:channel>

<beanid="myChannelInterceptor"

                           class="com.service.myChannelInterceptor"/>

拦截器代码实现如下:

public class myChannelInterceptor implements ChannelInterceptor {

  @Override

  public Message<?>postReceive(Message<?> msg, MessageChannel channel) {

         return msg;

  }

  @Override

  public Message<?> preSend(Message<?>msg, MessageChannel channel) {

         MultiValueMap map =  (MultiValueMap)message.getPayload();

             LinkedList list =(LinkedList)map.get("employeeId");

             String id = (String)list.get(0);

             if (id.equals("errUser")) {

                    throw new MessagingException("useris error!");

             }     

         return msg;

  }

1. Transformer应用

当请求参数与Service实例输入的参数不一致时,我们需要使用Transformer对输入的参数作转换。转换器需要关联一个输入Channel和输出的Channel。配置如下:

<int:transformer

             ref="employeeSearchService"

             method="transforParam"

             input-channel="inputChannel" 

             output-channel="inputChannel_transformed"/>

上述配置中实现转换的是”employeeSearchService”Bean的transforParam方法。方法声明中要加标注@Transformer。方法的代码如下:

@Transformer

publicMessage<MyParam> transforParam(Message<?>  inMessage)  {

      MultiValueMap map = (MultiValueMap)inMessage.getPayload();

      LinkedList list = (LinkedList)map.get("employeeId");

      String id = (String)list.get(0);

      String name = (String)map.get("name");

      MyParam param = new MyParam();

      param.setName(name);

      param.setId(id);

      Message<MyParam>message =

                 newGenericMessage<MyParam>(param,inMessage.getHeaders());

         return message;

}









0 0
原创粉丝点击