Spring Integration提供了Spring框架的扩展,以支持著名的企业集成模式。 它在基于Spring的应用程序中启用轻量级消息传递,并支持与外部系统的集成。 Spring Integration的最重要目标之一是为构建可维护且可测试的企业集成解决方案提供一个简单的模型。
主要成分
消息:它是任何Java对象的通用包装器,与处理该对象时框架使用的元数据结合在一起。 它由有效负载和标头组成。 消息有效负载可以是任何Java对象,消息头是字符串/对象映射,覆盖头名称和值。 MessageBuilder用于创建覆盖有效载荷和标头的消息,如下所示:
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
Message message = MessageBuilder.withPayload("Message Payload")
.setHeader("Message_Header1", "Message_Header1_Value")
.setHeader("Message_Header2", "Message_Header2_Value")
.build();
消息通道:消息通道是通过其移动消息的组件,因此可以将其视为消息生产者和使用者之间的管道。 生产者将消息发送到渠道,而消费者从渠道接收消息。 消息通道可以遵循点对点或发布/订阅语义。 使用点对点通道,最多一个消费者可以接收发送到该通道的每条消息。 使用发布/订阅通道,多个订阅者可以接收发送到该通道的每个消息。 Spring Integration支持这两种方式。
在此示例项目中,使用直接通道和空通道。 直接通道是Spring Integration中的默认通道类型,也是最简单的点对点通道选项。 空通道是一个虚拟消息通道,主要用于测试和调试。 它不会将消息从发送方发送到接收方,但其send方法始终返回true,而receive方法返回null值。 除了DirectChannel和NullChannel,Spring Integration还提供了不同的消息通道实现,例如PublishSubscribeChannel,QueueChannel,PriorityChannel,RendezvousChannel,ExecutorChannel和ScopedChannel。
消息端点:消息端点将应用程序代码与基础结构隔离。 换句话说,它是应用程序代码和消息传递框架之间的抽象层。
主要消息端点
转换程序:消息转换程序负责转换消息的内容或结构并返回修改后的消息。 例如:它可用于将消息有效负载从一种格式转换为另一种格式或修改消息头值。
过滤器:消息过滤器确定是否将消息传递到消息通道。
路由器:消息路由器决定哪个信道(如果可用)接下来应接收消息。
拆分器:拆分器将传入的消息分解为多个消息,并将其发送到适当的通道。
聚合器:聚合器将多个消息组合为单个消息。
服务激活器:服务激活器是用于将服务实例连接到消息传递系统的通用端点。
通道适配器:通道适配器是将消息通道连接到外部系统的端点。 通道适配器可以是入站的或出站的。 入站通道适配器端点将外部系统连接到MessageChannel。 出站通道适配器端点将MessageChannel连接到外部系统。
消息传递网关:网关是消息传递系统的入口,它对外部系统隐藏消息传递API。 通过覆盖请求和回复通道,它是双向的。
Spring Integration还提供了各种通道适配器和消息传递网关(用于AMQP,文件,Redis,Gemfire,Http,Jdbc,JPA,JMS,RMI,Stream等),以支持与外部系统的基于消息的通信。 请访问Spring Integration Reference文档以获取详细信息。
以下示例货物消息传递实现显示了易于理解的基本消息端点的行为。 货运信息系统通过使用CargoGateway接口监听来自外部系统的货运信息。 通过使用CargoSplitter,CargoFilter,CargoRouter,CargoTransformer MessageEndpoints处理收到的货物消息。 之后,已处理的成功的国内和国际货运消息将发送到CargoServiceActivator。
货物信息系统的Spring整合流程如下:
让我们看一下示例货物消息传递实现。
二手技术
- JDK 1.8.0_25
- 春天4.1.2
- Spring Integration 4.1.0
- Maven 3.2.2
- Ubuntu 14.04
项目层次结构如下:
步骤1:依存关系
依赖关系已添加到Maven pom.xml。
<properties>
<spring.version>4.1.2.RELEASE</spring.version>
<spring.integration.version>4.1.0.RELEASE</spring.integration.version>
</properties>
<dependencies>
<!-- Spring 4 dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring Integration dependencies -->
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-core</artifactId>
<version>${spring.integration.version}</version>
</dependency>
</dependencies>
第2步:货柜机
创建CargoBuilder来构建货运请求。
public class Cargo {
public enum ShippingType {
DOMESTIC, INTERNATIONAL
}
private final long trackingId;
private final String receiverName;
private final String deliveryAddress;
private final double weight;
private final String description;
private final ShippingType shippingType;
private final int deliveryDayCommitment;
private final int region;
private Cargo(CargoBuilder cargoBuilder) {
this.trackingId = cargoBuilder.trackingId;
this.receiverName = cargoBuilder.receiverName;
this.deliveryAddress = cargoBuilder.deliveryAddress;
this.weight = cargoBuilder.weight;
this.description = cargoBuilder.description;
this.shippingType = cargoBuilder.shippingType;
this.deliveryDayCommitment = cargoBuilder.deliveryDayCommitment;
this.region = cargoBuilder.region;
}
// Getter methods...
@Override
public String toString() {
return "Cargo [trackingId=" + trackingId + ", receiverName="
+ receiverName + ", deliveryAddress=" + deliveryAddress
+ ", weight=" + weight + ", description=" + description
+ ", shippingType="