Spring Integration消息通道默认情况下将消息存储在内存中。 这是因为内存速度快,易于实现,并且不会增加网络成本。 但是,在某些情况下,这可能会引起问题,因为如果应用程序崩溃或服务器意外关闭,所有消息都将丢失。 对于这种情况,Spring Integration引入了JMS&AMQP支持的消息通道,因此消息存储在JMS&AMQP代理内而不是内存中。
高级消息队列协议(AMQP)是消息协议的开放标准。 它允许应用程序异步,可靠和安全地进行通信。 RabbitMQ是支持AMQP标准的开源消息代理。 RabbitMQ最重要的功能之一就是高可用性队列。
在本文中,通过创建两个消息传递节点和一个覆盖两个RabbitMQ服务器的RabbitMQ集群来说明Spring Integration的AMQP支持的点对点消息通道方法。 两个消息传递节点开始使用RabbitMQ集群处理Order消息。 如果第一消息节点和第一RabbitMQ服务器意外关闭,第二消息节点和第二RabbitMQ服务器将继续处理Order消息,因此可以通过使用高可用性AMQP支持的通道来防止潜在的消息丢失和服务中断问题。
还建议使用Spring Integration进行消息处理文章介绍一下Spring Integration的主要组件。
订单消息系统的Spring集成流程如下:
订单列表通过Order Gateway发送到Order Splitter的输入通道。 订单拆分器将订单列表拆分为订单消息,然后将其发送到“订单流程服务激活器”。 processChannel是点对点AMQP支持的消息通道。 它创建了RabbitMQ集群管理的ha.rabbit.channel队列,并将订单消息发送到ha.rabbit.channel Rabbit队列以实现高可用性。
让我们看一下示例订单消息传递实现。
二手技术:
- JDK 1.8.0_25
- Spring4.1.4
- Spring Integration 4.1.2
- RabbitMQ服务器3.4.2
- Maven 3.2.2
- Ubuntu 14.04
项目层次结构如下:
步骤1:依存关系
Spring和Spring Integration Framework的依赖关系如下:
<properties>
<spring.version>4.1.4.RELEASE</spring.version>
<spring.integration.version>4.1.2.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>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-amqp</artifactId>
<version>${spring.integration.version}</version>
<scope>compile</scope>
</dependency>
<dependencies>
第2步:rabbitmq.config
第一RabbitMQ Server的配置文件(rabbitmq.config)如下。 它应该放在../rabbitmq_server-version/etc/rabbitmq/下
[
{rabbit, [ {tcp_listeners, [5672]},
{collect_statistics_interval, 10000},
{heartbeat,30},
{cluster_partition_handling, pause_minority},
{cluster_nodes, {[ 'rabbit@master',
'rabbit2@master'],
disc}} ] },
{rabbitmq_management, [ {http_log_dir,"/tmp/rabbit-mgmt"},{listener, [{port, 15672}]} ] },
{rabbitmq_management_agent, [ {force_fine_statistics, true} ] }
].
第二个RabbitMQ服务器的rabbitmq.config文件:
[
{rabbit, [ {tcp_listeners, [5673]},
{collect_statistics_interval, 10000},
{heartbeat,30},
{cluster_partition_handling, pause_minority},
{cluster_nodes, {[ 'rabbit@master',
'rabbit2@master'],
disc}} ] },
{rabbitmq_management, [ {http_log_dir,"/tmp/rabbit-mgmt&