消息

包含消息体和消息头。消息体可以是任意的类型;消息头是键值对,包含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-概述相关推荐

  1. Spring Integration概述

    Spring Integration概述 1.1  背景 Spring Integration是Spring项目中秉承其相同目标和原则的新成员.它扩展了Spring的编程模型到消息领域,在Spring ...

  2. streaming api_通过Spring Integration消费Twitter Streaming API

    streaming api 1.概述 众所周知, Spring Integration具有用于与外部系统交互的大量连接器. Twitter也不例外,而且很长一段时间以来,因为Spring Social ...

  3. amqp rabbitmq_通过Spring Integration和RabbitMQ获得高可用性的AMQP支持的消息通道

    amqp rabbitmq Spring Integration消息通道默认情况下将消息存储在内存中. 这是因为内存速度快,易于实现,并且不会增加网络成本. 但是,在某些情况下,这可能会引起问题,因为 ...

  4. 通过Spring Integration消费Twitter Streaming API

    1.概述 众所周知, Spring Integration具有用于与外部系统交互的大量连接器. Twitter也不例外,而且很长一段时间以来,因为Spring Social一直是一个开箱即用的解决方案 ...

  5. 通过Spring Integration和RabbitMQ获得高可用性的AMQP支持的消息通道

    Spring Integration消息通道默认情况下将消息存储在内存中. 这是因为内存速度快,易于实现,并且不会增加网络成本. 但是,在某些情况下,这可能会引起问题,因为如果应用程序崩溃或服务器意外 ...

  6. Spring Integration 4.0:完整的无XML示例

    1.简介 Spring Integration 4.0终于发布了 ,并且此版本具有非常好的功能. 本文介绍的一种可能性是完全不使用XML即可配置集成流程. 那些不喜欢XML的人仅使用JavaConfi ...

  7. Spring Integration Kafka

    转自:http://www.cnblogs.com/yuanermen/p/5453339.html 一.概述 Spring Integration Kafka 是基于 Apache Kafka 和S ...

  8. Spring系列学习之Spring Integration

    英文原文:https://spring.io/projects/spring-integration 目录 概述 介绍 特性 例子 Spring Boot配置 快速开始 学习 文档 指南 示例 概述 ...

  9. #翻译NO.3# --- Spring Integration Framework

    为什么80%的码农都做不了架构师?>>>    2.4 Message Endpoints A Message Endpoint represents the "filte ...

  10. Spring Integration学习资料

    Spring Integration学习资料 1.1     背景 Spring框架的一个重要主题是控制反转.从广义上来说,Spring处理其上下文中管理的组件的职责.只要组件减轻了职责,它们同时也被 ...

最新文章

  1. 2018-3-2线性表
  2. 银行卡大小的充电宝,买就送耳机!
  3. 小米某程序员的忧虑:感觉互联网这两年要凉,突然想回家种地
  4. 苹果 开发者账号区别
  5. 入围51CTO 2009年度“最受读者欢迎的IT图书作者”评选
  6. jQuery 中jQuery/$的数据类型是什么?
  7. UVA - 11694 Gokigen Naname(dfs)
  8. 前端学习(2382):js编码规范说明
  9. springboot 前缀_springboot搭配thymeleaf访问html页面的时候,什么时候需要自定义前缀和后缀呢...
  10. Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(二)
  11. 华为系统p40pro计算机,华为P40 Pro:我来了!
  12. 统计学习三要素的思考
  13. 面向过程和面向对象的区别,通俗易懂
  14. Atitit 信息安全常见基础技术 目录 1. 加密 1 2. 签名(防篡改) 1 2.1. 第4章 标识与认证技术  1 2.2. 第5章 授权与访问控制技术  1 2.3. 第9章 安全审计与责
  15. 论文阅读--异常检测中实时大数据处理的研究挑战
  16. Smartbi报表工具二次开发和集成能力怎么样?
  17. 我们来统计一个各大学中国学生会CSSA的list吧
  18. wordpress插件_如何使用适用于WordPress的长格式Storybuilder插件
  19. 线性方程组在计算机方面的应用,在线性方程组的简单应用》(安顺学院数学和计算机科.doc...
  20. 教授专栏37 | 黄昊: 发展虚拟资产, 须监管教育并行

热门文章

  1. [WinCE] Win CE 屏幕截图
  2. MTK tpd驱动框架
  3. 20条心灵鸡汤唯美句子,句句温情暖心!
  4. android studio百度地图教程,Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(4) 路线规划之起始点地址输入实现规划...
  5. 收藏了4年的android app源码下载
  6. 前端 各种API网站,教程网站,素材网站,工具网站,非常好用
  7. 给炫龙笔记本重装系统(其他牌子的大致相同)
  8. 我对WiCoNet,DCFAM,UDA Transformer的理解
  9. mysql.lib 是mtd mdd_动态、静态编译以及MD、MDd、MT、MTd编译
  10. 利用区块链技术解决传统物流贸易金融诸多痛点