Spring Integration 系统集成.docx
- 文档编号:26556065
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:9
- 大小:17.30KB
Spring Integration 系统集成.docx
《Spring Integration 系统集成.docx》由会员分享,可在线阅读,更多相关《Spring Integration 系统集成.docx(9页珍藏版)》请在冰豆网上搜索。
SpringIntegration系统集成
SpringIntegration系统集成
SpringIngegration提供了基于Spring的EIP(EnterpriseIntegrationPatterns,企业集成模式)的实现。
SpringIntegration主要解决的问题是不同系统之间交互的问题,通过异步消息驱动来达到系统交互时系统之间的松耦合。
SpringIntegration主要有Message、Channel、MessageEndPoint组成。
Message
Message是用来在不同部分之间传递的数据。
Message有两部分组成:
消息体(payload)与消息头(header)。
消息体可以是任何数据类型;消息头表示的元数据就是解释消息体的内容。
/**
*Agenericmessagerepresentationwithheadersandbody.
*
*@authorMarkFisher
*@authorArjenPoutsma
*@since4.0
*@seeorg.springframework.messaging.support.MessageBuilder
*/
publicinterfaceMessage{
/**
*Returnthemessagepayload.
*/
TgetPayload();
/**
*Returnmessageheadersforthemessage(never{@codenull}butmaybeempty).
*/
MessageHeadersgetHeaders();
}123456789101112131415161718192021
Channel
在消息系统中,消息发送者发送消息到通道(Channel),消息接受者从通道(Channel)接收消息。
1、顶级接口
(1)MessageChannel
MessageChannel是SpringIntegration消息通道的顶级接口:
publicinterfaceMessageChannel{
/**
*Constantforsendingamessagewithoutaprescribedtimeout.
*/
longINDEFINITE_TIMEOUT=-1;
/**
*Senda{@linkMessage}tothischannel.Ifthemessageissentsuccessfully,
*themethodreturns{@codetrue}.Ifthemessagecannotbesentduetoa
*non-fatalreason,themethodreturns{@codefalse}.Themethodmayalso
*throwaRuntimeExceptionincaseofnon-recoverableerrors.
*Thismethodmayblockindefinitely,dependingontheimplementation.
*Toprovideamaximumwaittime,use{@link#send(Message,long)}.
*@parammessagethemessagetosend
*@returnwhetherornotthemessagewassent
*/
booleansend(Messagemessage);
/**
*Sendamessage,blockinguntileitherthemessageisacceptedorthe
*specifiedtimeoutperiodelapses.
*@parammessagethemessagetosend
*@paramtimeoutthetimeoutinmillisecondsor{@link#INDEFINITE_TIMEOUT}
*@return{@codetrue}ifthemessageissent,{@codefalse}ifnot
*includingatimeoutofaninterruptofthesend
*/
booleansend(Messagemessage,longtimeout);
}12345678910111213141516171819202122232425262728293031
MessageChannel有两大子接口,分别是PollableChannel(可轮询)和SubscribableChannel(可订阅)。
我们所有的消息通道类都是现实这两个接口。
(2)PollableChannel
PollableChannel具备轮询获得消息的能力。
publicinterfacePollableChannelextendsMessageChannel{
/**
*Receiveamessagefromthischannel,blockingindefinitelyifnecessary.
*@returnthenextavailable{@linkMessage}or{@codenull}ifinterrupted
*/
Messagereceive();
/**
*Receiveamessagefromthischannel,blockinguntileitheramessageisavailable
*orthespecifiedtimeoutperiodelapses.
*@paramtimeoutthetimeoutinmillisecondsor{@linkMessageChannel#INDEFINITE_TIMEOUT}.
*@returnthenextavailable{@linkMessage}or{@codenull}ifthespecifiedtimeout
*periodelapsesorthemessagereceptionisinterrupted
*/
Messagereceive(longtimeout);
}123456789101112131415161718
(3)SubscribableChannel
SubscribableChannel发送消息给订阅了MessageHanlder的订阅者
publicinterfaceSubscribableChannelextendsMessageChannel{
/**
*Registeramessagehandler.
*@return{@codetrue}ifthehandlerwassubscribedor{@codefalse}ifit
*wasalreadysubscribed.
*/
booleansubscribe(MessageHandlerhandler);
/**
*Un-registeramessagehandler.
*@return{@codetrue}ifthehandlerwasun-registered,or{@codefalse}
*ifwasnotregistered.
*/
booleanunsubscribe(MessageHandlerhandler);
}1234567891011121314151617
2、常用消息通道
(1)、PublishSubscribeChannel
PublishSubscribeChannel允许广播消息给所有订阅者,配置方式如下:
/**
*允许广播消息给所有订阅者,当前消息通道的id为publishSubscribeChannel
*@return
*/
@Bean
publicPublishSubscribeChannelpublishSubscribeChannel(){
PublishSubscribeChannelchannel=newPublishSubscribeChannel();
returnchannel;
}123456789
其中,当前消息通道的id为publishSubscribeChannel。
(2)、QueueChannel
QueueChannel允许消息接收者轮询获得消息,用一个队列(queue)接收消息,队列的容量大小可配置,配置方式如下:
@Bean
publicQueueChannelqueueChannel(){
QueueChannelchannel=newQueueChannel(10);
returnchannel;
}12345
其中,QueueChannel构造参数10即为队列的容量。
(3)、PriorityChannel
PriorityChannel可按照优先级将数据存储到队列,它依据于消息的消息头priority属性,配置方式如下:
@Bean
publicPriorityChannelpriorityChannel(){
PriorityChannelchannel=newPriorityChannel(10);
returnchannel;
}12345
(4)、RendezvousChannel
RendezvousChannel确保每一个接收者都接收到消息后再发送消息,配置方式如下:
@Bean
publicRendezvousChannelrendezvousChannel(){
RendezvousChannelchannel=newRendezvousChannel();
returnchannel;
}12345
(5)DirectChannel
DirectChannel是SpringIntegration默认的消息通道,它允许将消息发送给为一个订阅者,然后阻碍发送直到消息被接收,配置方式如下:
@Bean
publicDirectChanneldirectChannel(){
DirectChannelchannel=newDirectChannel();
returnchannel;
}12345
(6)、ExecutorChannel
ExecutorChannel可绑定一个多线程的taskexecutor,配置方式如下:
@Bean
publicExecutorChannelexecutorChannel(){
ExecutorChannelchannel=newExecutorChannel(executor());
returnchannel;
}
@Bean
publicExecutorexecutor(){
ThreadPoolTaskExecutortaskExecutor=newThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapacity(25);
taskExecutor.initialize();
returntaskExecutor;
}123456789101112131415
3、通道拦截器
SpringIntegration给消息通道提供了通道拦截器(ChannelInterceptor),用来拦截发送和接收消息的操作.
ChannelInterceptor接口定义如下,我们只需要实现这个接口即可:
publicinterfaceChannelInterceptor{
MessagepreSend(Messagemessage,MessageChannelchannel);
voidpostSend(Messagemessage,MessageChannelchannel,booleansent);
voidafterSendCompletion(Messagemessage,MessageChannelchannel,booleansent,Exceptionex);
booleanpreReceive(MessageChannelchannel);
MessagepostReceive(Messagemessage,MessageChannelchannel);
voidafterReceiveCompletion(Messagemessage,MessageChannelchannel,Exceptionex);
}123456789101112131415
通过如下代码给所有的channel增加拦截器
channel.addInterceptor(someInterceptor);
MessageEndPoint
消息端点(MessageEndPoint)是真正处理消息的(Message)组件,它还可以控制通道的路由。
我们可用的消息端点包含如下:
(1)ChannelAdapter
通道适配器(ChannelAdapter)是一种连接外部系统或传输协议的端点(EndPoint),可以分为入站(inbound)和出站(outbound)。
通道适配器是单向的,入站通道适配器只支持接收消息,出站通道适配器只支持输出消息。
SpringIntegration内置了如下的适配器:
RabbitMQ、Feed、File、FTP/SFTP、Gemfire、HTTP、TCP/UDP、JDBC、JPA、JMS、Mail、MongoDB、Redis、RMI
Twitter、XMPP、WebServices(SOAP、REST)、WebSocket
123
(2)Gateway
消息网关(Gateway)类似于Adapter,但是提供了双向的请求/返回集成方式,也分为入站(inbound)和出站(outbound)。
SpringIntegration对响应的Adapter都提供了Gateway。
(3)ServiceActivator
ServiceActivator可调用Spring的Bean来处理消息,并将处理后的结果输出到指定的消息通道。
(4)Router
路由(Router)可根据消息体内容(PayloadTypeRouter)、消息头的值(HeaderValueRouter)以及定义好的接收表(RecipientListRouter)作为条件,来决定消息传递到的通道。
(5)Filter
过滤器(Filter)类似于路由(Router),不同的是过滤器不决定消息路由到哪里,而是决定消息是否可以传递给消息通道。
(6)Splitter
拆分器(Splitter)将消息拆分为几个部分单独处理,拆分器处理的返回值是一个集合或者数组。
(7)Aggregator
聚合器(Aggregator)与拆分器相反,它接收一个java.util.List作为参数,将多个消息合并为一个消息。
(8)Enricher
当我们从外部获得消息后,需要增加额外的消息到已有的消息中,这时就需要使用消息增强器(Enricher)。
消息增强器主要有消息体
增强器(PayloadEnricher)和消息头增强器(HeaderEnricher)两种。
(9)Transformer
转换器(Transformer)是对获得的消息进行一定的转换处理(如数据格式转换).
(10)Bridge
使用连接桥(Bridge)可以简单的将两个消息通道连接起来。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Spring Integration 系统集成