http://blog.csdn.net/hs6823/article/details/17999989
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();
}
Channel也是Spring Integration中最基本的概念之一。Channel就好像一个管子,生产者生产一个Message放到Channel,消费者从Channel消费一个Message,所以Channel可以对Message组件解耦,并且可以提供一个方便的拦截功能和监控功能
MessageChannel 接口定义
public interface MessageChannel {
boolean send(Message message);
boolean send(Messagemessage, long timeout);
}
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;
}