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) { ... }

你可能感兴趣的:(服务器)