spring integration-概述
消息
包含消息体和消息头。消息体可以是任意的类型;消息头是键值对,包含ID,时间戳,关联ID和返回地址。
消息通道
从语义学上理解,消息通道有两种,一种是工作队列,另外一种是发布订阅。【工作队列】模式下,消费者共享发送到通道的所有消息。而【发布订阅】模式下,可以把消息广播给多个订阅了这个通道的订阅者上。
消息端点(实线-轮询拉取,虚线-消息驱动)
处理消息的接收器,一般分为下面几种:
- 转换器
- 过滤器
- 路由器
- 分割器
- 聚合器
- 激活器
激活器从输入通道接受消息,然后调用处理器(包含处理消息的方法)处理消息,如果处理器的处理方法有返回值,则会把返回值包装成消息发送到指定的输出通道。 - 适配器
一个输入通道适配器把源系统连接到消息通道。
一个输出通道适配器把消息通道连接到目标系统。 - 端点对象的名称
每个消费端点包含两个对象,消费对象和消息处理对象。消费对象持有一个消息处理对象的引用,当消息到来时,消费对象调用消息处理对象来处理消息。
那么这两个对象的名称是咋样的呢?看下面的例子:
@Component
public class SomeComponent {@ServiceActivator(inputChannel = ...)public String someMethod(...) {...}}
消费对象名称: someComponent.someMethod.serviceActivator
处理对象名称: someComponent.someMethod.serviceActivator.handler
@Component
public class SomeComponent {@EndpointId("someService")@ServiceActivator(inputChannel = ...)public String someMethod(...) {...}}
消费对象名称: someService
处理对象名称: someService.handler
@Configuratiom
public class SomeConfiguration {@Bean@ServiceActivator(inputChannel = ...)public MessageHandler someHandler() {...}}
消费对象名称: someConfiguration.someHandler.serviceActivator
处理对象名称: someHandler(@Bean的名称)
@Configuratiom
public class SomeConfiguration {@Bean("someService.handler") @EndpointId("someService") @ServiceActivator(inputChannel = ...)public MessageHandler someHandler() {...}}
消费对象名称: someService.handler(bean的名称,只要符合@Bean名称末尾加.handler的约束)
处理对象名称: someService(endpoint ID)
@EndpointId("someAdapter")
@InboundChannelAdapter(channel = "channel3", poller = @Poller(fixedDelay = "5000"))
public String pojoSource() {...
}
消费对象名称: someAdapter
处理对象名称: someAdapter.source
@Bean("someAdapter.source")
@EndpointId("someAdapter")
@InboundChannelAdapter(channel = "channel3", poller = @Poller(fixedDelay = "5000"))
public MessageSource<?> source() {return () -> {...};
}
消费对象名称: someAdapter
处理对象名称: someAdapter.source(只要符合@Bean名称末尾加.source的约束)
一些最佳实践
如前面所说,integration框架包含三个基本概念:消息,通道和端点。消息和通道比较好理解,端点需要着重注意下。
AbstractEndpoint是整个框架广泛运用的接口,它有两个基本的实现:
- EventDrivenConsumer
用于从SubscribableChannel 订阅消息 - PollingConsumer
用于从PollableChannel拉取消息
一般来说,使用框架提供的注解就就可以完成端点的注入,比如@ServiceActivator。当然,高级的用户也可以用ConsumerEndpointFactoryBean自定义端点的注入策略。
处理输入消息流的端点可以分为两类:一种是轮询型的,一种是监听型的。监听型的端点比较简单,一般只需要一个类实现生产消息的功能。监听型的端点可以是单向的MessageProducerSupport 实现,也可以是请求-应答的MessagingGatewaySupport实现。轮询型的端点一般是没有提供监听api或者不支持监听的协议,比如FTP、RDBMS 、NoSQL等。轮询型端点一般包含两个组件:轮询配置和从目标读取数据并产生消息到下游的消息源类。消息源类的鼻祖是SourcePollingChannelAdapter,它是一个针对轮询策略的AbstractEndpoint 实现。可以使用注解@InboundChannelAdapter来声明这样的一个对象。
消息源组件在程序开发过程中是非常重要的,它们实现了MessageSource接口。下面代码展示了如何从JDBC读取RDBMS数据的配置:
@Bean
@InboundChannelAdapter(value = "fooChannel", poller = @Poller(fixedDelay="5000"))//轮询配置
public MessageSource<?> storedProc(DataSource dataSource) {//消息源类return new JdbcPollingChannelAdapter(dataSource, "SELECT * FROM foo where status = 0");
}
可以在spring integration框架的模块中找到指定协议的输入和输出端点类。比如spring-integration-websocket模块:
- WebSocketInboundChannelAdapter
实现MessageProducerSupport接口,监听socket的数据帧,并生产消息到通道中。 - WebSocketOutboundMessageHandler
单向的AbstractMessageHandler实现,把通道的消息转换成合适的数据帧,并且发送到websocket中。
POJO方法调用
尽量使用POJO对象,并且只有在不得已的时候才在代码中暴露框架相关的组件。建议使用下面例子所展示的那样使用POJO编程风格:
@ServiceActivator
public String myService(String payload) { ... }
上面例子中,框架提取一个String负载,执行方法,并把结果包装消息发送到数据流的下一个组件(原先消息的header被复制到新消息中)。
也可以从POJO方法中获取header信息,例子如下:
@ServiceActivator
public String myService(@Payload String payload, @Header("foo") String fooHeader) { ... }
也可以间接引用消息的属性:
@ServiceActivator
public String myService(@Payload("payload.foo") String foo, @Header("bar.baz") String barbaz) { ... }
spring integration-概述相关推荐
- Spring Integration概述
Spring Integration概述 1.1 背景 Spring Integration是Spring项目中秉承其相同目标和原则的新成员.它扩展了Spring的编程模型到消息领域,在Spring ...
- streaming api_通过Spring Integration消费Twitter Streaming API
streaming api 1.概述 众所周知, Spring Integration具有用于与外部系统交互的大量连接器. Twitter也不例外,而且很长一段时间以来,因为Spring Social ...
- amqp rabbitmq_通过Spring Integration和RabbitMQ获得高可用性的AMQP支持的消息通道
amqp rabbitmq Spring Integration消息通道默认情况下将消息存储在内存中. 这是因为内存速度快,易于实现,并且不会增加网络成本. 但是,在某些情况下,这可能会引起问题,因为 ...
- 通过Spring Integration消费Twitter Streaming API
1.概述 众所周知, Spring Integration具有用于与外部系统交互的大量连接器. Twitter也不例外,而且很长一段时间以来,因为Spring Social一直是一个开箱即用的解决方案 ...
- 通过Spring Integration和RabbitMQ获得高可用性的AMQP支持的消息通道
Spring Integration消息通道默认情况下将消息存储在内存中. 这是因为内存速度快,易于实现,并且不会增加网络成本. 但是,在某些情况下,这可能会引起问题,因为如果应用程序崩溃或服务器意外 ...
- Spring Integration 4.0:完整的无XML示例
1.简介 Spring Integration 4.0终于发布了 ,并且此版本具有非常好的功能. 本文介绍的一种可能性是完全不使用XML即可配置集成流程. 那些不喜欢XML的人仅使用JavaConfi ...
- Spring Integration Kafka
转自:http://www.cnblogs.com/yuanermen/p/5453339.html 一.概述 Spring Integration Kafka 是基于 Apache Kafka 和S ...
- Spring系列学习之Spring Integration
英文原文:https://spring.io/projects/spring-integration 目录 概述 介绍 特性 例子 Spring Boot配置 快速开始 学习 文档 指南 示例 概述 ...
- #翻译NO.3# --- Spring Integration Framework
为什么80%的码农都做不了架构师?>>> 2.4 Message Endpoints A Message Endpoint represents the "filte ...
- Spring Integration学习资料
Spring Integration学习资料 1.1 背景 Spring框架的一个重要主题是控制反转.从广义上来说,Spring处理其上下文中管理的组件的职责.只要组件减轻了职责,它们同时也被 ...
最新文章
- 2018-3-2线性表
- 银行卡大小的充电宝,买就送耳机!
- 小米某程序员的忧虑:感觉互联网这两年要凉,突然想回家种地
- 苹果 开发者账号区别
- 入围51CTO 2009年度“最受读者欢迎的IT图书作者”评选
- jQuery 中jQuery/$的数据类型是什么?
- UVA - 11694 Gokigen Naname(dfs)
- 前端学习(2382):js编码规范说明
- springboot 前缀_springboot搭配thymeleaf访问html页面的时候,什么时候需要自定义前缀和后缀呢...
- Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(二)
- 华为系统p40pro计算机,华为P40 Pro:我来了!
- 统计学习三要素的思考
- 面向过程和面向对象的区别,通俗易懂
- Atitit 信息安全常见基础技术 目录 1. 加密	1 2. 签名(防篡改)	1 2.1. 第4章 标识与认证技术 	1 2.2. 第5章 授权与访问控制技术 	1 2.3. 第9章 安全审计与责
- 论文阅读--异常检测中实时大数据处理的研究挑战
- Smartbi报表工具二次开发和集成能力怎么样?
- 我们来统计一个各大学中国学生会CSSA的list吧
- wordpress插件_如何使用适用于WordPress的长格式Storybuilder插件
- 线性方程组在计算机方面的应用,在线性方程组的简单应用》(安顺学院数学和计算机科.doc...
- 教授专栏37 | 黄昊: 发展虚拟资产, 须监管教育并行
热门文章
- [WinCE] Win CE 屏幕截图
- MTK tpd驱动框架
- 20条心灵鸡汤唯美句子,句句温情暖心!
- android studio百度地图教程,Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(4) 路线规划之起始点地址输入实现规划...
- 收藏了4年的android app源码下载
- 前端 各种API网站,教程网站,素材网站,工具网站,非常好用
- 给炫龙笔记本重装系统(其他牌子的大致相同)
- 我对WiCoNet,DCFAM,UDA Transformer的理解
- mysql.lib 是mtd mdd_动态、静态编译以及MD、MDd、MT、MTd编译
- 利用区块链技术解决传统物流贸易金融诸多痛点