首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spring AMQP客户端自动重新连接,但不使用恢复

Spring AMQP客户端提供了自动重新连接的功能,但默认情况下,它使用的是Spring AMQP的恢复机制

以下是如何配置Spring AMQP客户端以自动重新连接但不使用恢复机制的步骤:

  1. 添加依赖项

确保您的项目中包含了Spring AMQP和RabbitMQ客户端的依赖项。例如,在Maven项目中,您需要添加以下依赖项:

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-rabbit</artifactId>
    <version>2.3.10.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.12.0</version>
</dependency>
  1. 配置连接工厂

创建一个自定义的CachingConnectionFactory,并设置cacheModeCACHE_NONE,以便禁用连接缓存。这将导致每次发送消息时都会创建一个新的连接。

代码语言:javascript
复制
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {

    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        connectionFactory.setCacheMode(CachingConnectionFactory.CacheMode.CACHE_NONE);
        return connectionFactory;
    }
}
  1. 配置RabbitTemplate

创建一个RabbitTemplate bean,并将其连接到自定义的ConnectionFactory

代码语言:javascript
复制
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {

    // ... 其他配置 ...

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        return new RabbitTemplate(connectionFactory);
    }
}
  1. 处理连接异常

为了实现自动重新连接,您需要捕获并处理连接异常。您可以在发送消息的方法中添加异常处理逻辑,例如使用try-catch语句。

代码语言:javascript
复制
import org.springframework.amqp.AmqpConnectException;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class RabbitSenderService {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendMessage(String queueName, String message) {
        int retryCount = 0;
        boolean sent = false;

        while (!sent && retryCount < 5) {
            try {
                rabbitTemplate.convertAndSend(queueName, message);
                sent = true;
            } catch (AmqpConnectException e) {
                retryCount++;
                try {
                    Thread.sleep(1000); // 等待1秒后重试
                } catch (InterruptedException ie) {
                    Thread.currentThread().interrupt();
                }
            }
        }

        if (!sent) {
            throw new RuntimeException("无法发送消息,重试次数已达上限");
        }
    }
}

这样,当连接异常发生时,sendMessage方法将自动重试发送消息,直到成功或达到最大重试次数。请注意,这种方法可能会导致消息重复发送,因此您可能需要在应用程序中实现幂等性处理。

总之,通过禁用连接缓存并手动处理连接异常,您可以实现Spring AMQP客户端的自动重新连接,而不使用恢复机制。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

万字详解数据中心的百万级消息服务实战

插件将自动在节点b中创建4个队列,并将它们连接到分片分区。已经传递的消息将不会被重新平衡,但新到达的消息将被分区到新的队列。...消费者连接到主机,无论它们连接到哪个节点,镜像会丢弃已在主设备上确认的消息。队列镜像因此增强了可用性,但不跨节点分配负载(所有参与节点都执行所有工作)。...Spring AMQP提供了一个API,可轻松访问AMQP消息代理。像往常一样,Spring模板作为技术细节的抽象。对于AMQP,AmqpTemplate可以做到这一点。...Spring-amqp项目拥有所有必要的通用接口(例如AmqpTemplate)和API类,而具体的实现则依赖spring-rabbitmq,Spring-rabbitmq依赖于RabbitMQ amqp-client...客户端应用程序仅依靠spring-amqp来实现松耦合。能够从一个AMQP代理切换到另一个AMQP代理,而不会在代码中进行任何重大更改。

1K20

多数据中心的百万级消息服务实战

插件将自动在节点b中创建4个队列,并将它们连接到分片分区。已经传递的消息将不会被重新平衡,但新到达的消息将被分区到新的队列。...消费者连接到主机,无论它们连接到哪个节点,镜像会丢弃已在主设备上确认的消息。队列镜像因此增强了可用性,但不跨节点分配负载(所有参与节点都执行所有工作)。...Spring AMQP提供了一个API,可轻松访问AMQP消息代理。像往常一样,Spring模板作为技术细节的抽象。对于AMQP,AmqpTemplate可以做到这一点。...Spring-amqp项目拥有所有必要的通用接口(例如AmqpTemplate)和API类,而具体的实现则依赖spring-rabbitmq,Spring-rabbitmq依赖于RabbitMQ amqp-client...客户端应用程序仅依靠spring-amqp来实现松耦合。能够从一个AMQP代理切换到另一个AMQP代理,而不会在代码中进行任何重大更改。

98420
  • RabbitMQ实战-消费端ACK、NACK及重回队列机制

    0 前言 当连接失败时,消息可能还在客户端和服务器之间传输 - 它们可能处于两侧的解码或编码的中间过程,在 TCP 堆栈缓冲区中,或在电线上飞行。...在这种情况下,传输中的信息将无法正常投递 - 它们需要被重新投递。Acknowledgements机制让服务器和客户端知道何时需要重新投递。...由于多种内容(客户端连接、消费者应用等)可能会失败,因此此决定是数据安全问题。消息传递协议通常提供一个确认机制,允许Con确认交付到他们连接到的节点。是否使用该机制由Con订阅时决定。...可选择显式关闭连接,消息会恢复到Ready状态并重新投递。消费者需要显式调用ack方法确认消息成功处理。...若不使用 ACK 机制,直接把出错消息存库,便于日后查bug或重新执行。

    3.4K30

    Spring Cloud 微服务(七)- 上:日志收集集成

    使用日志收集工具,将所有日志统一收集汇总分析,Spring 列举了两款日志收集工具: Kibana Splunk 笔者这里使用 Kibana 实现日志收集,Kibana 只做日志信息可视化,还需要使用到...添加 logback-spring.xml 配置文件,重要部分内容如下: logback-spring.xml <appender name="<em>AMQP</em>" class="org.springframework.<em>amqp</em>.rabbit.logback.AmqpAppender...启动项目 这里<em>使用</em>配置中心进行测试,启动应用后,会<em>自动</em>创建 logger 交换机: 日志消息通过路由键 应用名.类名.日志级别 发送到 logger 交换机;Logstash 从 logstash 队列上接收所有消息...<em>重新</em>查看 Kibana: Figure 2. <em>重新</em>查看 Kibana 现在通过 trace 过滤,就能查出整个请求涉及的相关日志。 7....比如访问外部<em>客户端</em>的 /message 接口,外部<em>客户端</em>会调接口网关,接口网关再调用资源服务 2. 未经证实

    2.7K60

    Spring Cloud 系列之消息总线 Bus

    1.1 简介 1.1.1 概述   Spring Cloud Bus 是用轻量的消息代理将分布式的节点连接起来,可以用于广播配置文件的更改或者服务的监控管理。...Spring Cloud Bus 是 Spring Cloud 的一个子项目,它基于 AMQP 协议(高级消息队列协议,用于消息的生产和消费),我们可以使用 RabbitMQ 或 Kafka 来实现一个基本的基于...我们可以借此来实现 Spring Cloud Config 自动刷新的策略,只需要架设好消息中间件,编写好属性服务端和远端仓库之间的连接,即可实现自动刷新(其实是半自动)。 ?...  需要注意的是在客户端除了需要增加以下配置连接 mq 以外,还需要在 controller 添加 @RefreshScope 注解 # 增加如下配置 spring: rabbitmq:...我们用 post 让 config server 去通知客户端刷新配置,其流程是访问的 actuator/bus-refresh 节点,来实现刷新本服务的同时,将刷新动作推送至消息中间件,通知其它连接了消息中间件的客户端进行自动刷新操作

    41520

    RabbitMQ 高可用集群搭建及电商平台使用经验总结

    大型应用插件(Sharding、Rederation) Queue镜像失败手动同步 各集群配置同步方式(RabbitMQ export\import) 客户端连接方式(尽量采用AMQP组来动态链接)...8.客户端连接方式(尽量采用AMQP组来动态链接) 由于RabbitMQ是AMQP协议的实现,所以在进行远程连接的时候尽量采用amqp协议的方式连接。...现在越来越多的方案倾向于在客户端做负载和故障转移,这有很多好处,消除了中间节点带来的故障概率。如果这三个点加在一起出现的可用性指标肯定是比直接在客户端连接的低的多。...第三个就是AutomaticRecoveryEnabled,自动连接重试,这致命重要。当上面的VIP切换之后这个可以保命。...第四个就是TopologyRecoveryEnabled,重新恢复Exchange、queue、binding。在出现网络断开之后,一旦恢复连接就会恢复这些设置以保证是最新的设置。

    2.6K101

    RabbitMQ在分布式系统中的应用

    接收应答 客户端接收消息的模式默认是自动应答,但是通过设置autoAck为false可以让客户端主动应答消息。...当客户端拒绝此消息或者未应答便断开连接时,就会使得此消息重新入队(在版本2.7.0以前是到重新加入到队尾,2.7.0及以后是保留消息在队列中的原来位置)。...当重新恢复网络连接时,它们彼此都认为是对方挂了-_-||,便可以判断出有网络分区出现了。...可以更改配置使得连接恢复时,会根据配置自动恢复: ignore:默认,不做任何处理 pause-minority:断开连接时,判断当前节点是否属于少数派(节点数少于或者等于一半),如果是,则暂停直到恢复连接...这种策略下,当恢复连接时,可能会有多个分区存活,所以,最后一个参数决定它们怎么合并。 autoheal:当恢复连接时,选择客户端连接数最多的节点状态为主,重启其他节点。

    96830

    Rabbitmq---消息队列

    客户端可以使用各种其他技术或者语言 都不是rabbitmq自身的技术 2 rabbitmq内部组件 ?...    客户端连接发送消息,多种情况都需要并发的发送,如果从客户端执行并发的发送逻辑,rabbitmq的并发能力就限制在了客户端     exchange基于erlang语言开发的(并发,可控制线程)...;生产端逻辑实现简单;) 3 )二次封装   springboot   自动配置:扫描同名,下级包 根据依赖的文件自动配置需要的内容(一旦依赖了jdbc,不配置datasource...就报错)    springboot就会根据依赖的amqp自动创建连接消息队列的内部connection,封装一个对外调用的对象rabbitTemplate模板对象;做生产逻辑   利用底层连接... spring-boot-starter-amqp 2 配置文件

    71430

    RabbitMQ 高可用集群搭建及电商平台使用经验总结

    plugin 大型应用插件(Sharding、Rederation) Queue镜像失败手动同步 各集群配置同步方式(RabbitMQ export\import) 客户端连接方式(尽量采用AMQP组来动态链接...8.客户端连接方式(尽量采用AMQP组来动态链接) 由于RabbitMQ是AMQP协议的实现,所以在进行远程连接的时候尽量采用amqp协议的方式连接。...现在越来越多的方案倾向于在客户端做负载和故障转移,这有很多好处,消除了中间节点带来的故障概率。如果这三个点加在一起出现的可用性指标肯定是比直接在客户端连接的低的多。...第三个就是AutomaticRecoveryEnabled,自动连接重试,这致命重要。当上面的VIP切换之后这个可以保命。...第四个就是TopologyRecoveryEnabled,重新恢复Exchange、queue、binding。在出现网络断开之后,一旦恢复连接就会恢复这些设置以保证是最新的设置。

    69220

    工作任务项杂记_201904

    spring boot应用中使用redis缓存 如子标题,有需求要在spring boot应用中使用redis缓存,这个还是比较简单的,如下: 添加maven依赖 <groupId...min-idle: 0 # 连接池最大连接数(使用负值表示没有限制) max-active: 8 # 连接池最大阻塞等待时间(使用负值表示没有限制)...spring boot应用中使用rabbitmq 如子标题,有需求要在spring boot应用中使用redis缓存,这个还是比较简单的,如下: 添加maven依赖 ...username: spring 配置队列、交换器、路由等高级信息,一般会用到org.springframework.amqp.core.Queue、org.springframework.amqp.core.QueueBuilder...如果是微服务架构的应用,可使用swagger-editor生成相应语言的客户端代码,这样服务间的调用直接用客户端代码组合形成的SDK即可,不再需要手动发送HTTP请求及解析HTTP响应了。

    55320

    RabbitMQ 学习(二)---- HelloWorld 简单模型

    学习(二)---- HelloWorld 简单模型 开放 rabbitMQ 端口号 5672 之前我们使用rabbitMq 网页客户端 开放了 15672 的端口,要想是的 java客户端访问服务器成功...connectionFactory 在工厂中需要设置连接的主机名、端口号、客户端的用户名、密码、虚拟主机等,为之后的连接做好预先准备。...这里的持久化以及就是队列信息写入磁盘,如果rabbitmq服务器重启也会恢复队列信息,但不是信息持久化,信息会失去 * @Params3 exclusive: 该队列是否支持独占?...这里的持久化以及就是队列信息写入磁盘,如果rabbitmq服务器重启也会恢复队列信息,但不是信息持久化,信息会失去 * @Params1 exclusive: 该队列是否支持独占...(1)发送消息 从使用信道发送消息开始,使用 basicConsume() /** * 参数1 : 队列的名字 * 参数2 : 是否自动确认,如果接收方接受了消息之后是否确认收到

    27410

    Docker下RabbitMQ四部曲之四:高可用实战

    ://admin@172.19.0.3:5672/, localPort= 37818] 从日志中可以清晰的看到,停止hacluster_rabbit1_1容器是,消息生产者会立即报异常,但是不会自动重连.../:2.0.3.RELEASE] 如上所示,也是连接失败,并且,日志的最后会发现应用在自动尝试重新连接RabbitMQ; 至此,RabbitMQ集群宕机模拟就完成了,结果说明在HA模式下,只要还有可用的节点...,应用就会尝试连接,如果连接成功,消息的消费是不受影响的; 目前RabbitMQ集群的所有容器都停掉了,接下来我们逐个恢复刚才停下来的容器,看看服务能否恢复; 逐个恢复集群中的RabbitMQ容器 先恢复...RabbitMQ失败的错误; 从上述现象可以发现:恢复集群服务时,只恢复一台机器是不够的; 再恢复hacluster_rabbit2_1,执行命令docker start hacluster_rabbit12..._1; 管理页面依旧不可用,发送消息失败,并且生产者和消费者容器都无法连接到RabbitMQ容器上去; 再恢复hacluster_rabbit3_1,执行命令docker start hacluster_rabbit3

    52140

    一起来学SpringBoot | 第十二篇:初探RabbitMQ消息队列

    SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物, 自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个...erlanng语言开发而成,用在实时的对可靠性要求比较高的消息传递上,支持多种语言客户端。...,一个 broker里可以开设多个 vhost,用作不同用户的权限分离 producer:消息生产者,就是投递消息的程序 consumer:消息消费者,就是接受消息的程序 channel:消息通道,在客户端的每个连接里...手动ACK 不开启自动ACK模式,目的是防止报错后未正确处理消息丢失 默认 为 none spring.rabbitmq.listener.simple.acknowledge-mode=manual...具体推荐使用 listenerManualAck() * 默认情况下,如果没有配置手动ACK, 那么Spring Data AMQP 会在消息消费完毕后自动帮我们去ACK

    61510

    【云原生进阶之PaaS中间件】第四章RabbitMQ-4.1-原理机制与进阶特性

    1 RabbitMQ原理剖析 1.1 消息队列执行过程 1.客户端连接到消息队列服务器,打开一个Channel。 2.客户端声明一个Exchange,并设置相关属性。...3.客户端声明一个Queue,并设置相关属性。 4.客户端使用Routing key,在Exchange和Queue之间建立好绑定关系。 5.客户端投递消息到Exchange。...这样只有app本身才可以使用这个queue。queue也可以自动删除,被标为auto-delete的queue在最后一个Consumer unsubscribe后就会被自动删除。...这个方法在RabbitMQ各版本都支持,这样做的坏处就是连接断开增加了RabbitMQ的额外负担,特别是consumer出现异常每条消息都无法正常处理的时候。...RabbitMQ 2.0.0可以使用 basic.reject 命令,收到该命令RabbitMQ会重新投递到其它的Consumer。

    24310

    微服务架构Day10-SpringBoot之消息

    支持: 1.spring-jms提供了对JMS的支持 2.spring-rabbit提供了对AMQP的支持 3.需要ConnectionFactory的实现来连接消息代理 4.提供JMSTemplate...Connection: 网络连接,如TCP连接 Channel: 信道 多路复用连接中的一条独立的双向数据流通道 信道是建立在真实的TCP连接内的虚拟连接 AMQP命令都是通过信道发出去的,不管是发布消息...,订阅队列还是接收消息,这些动作都是通过信道完成的 对于操作系统来说,建立和销毁TCP都是非常昂贵的开销,所以引入信道的概念,以复用一条TCP连接 Consumer: 消息消费者,从消息队列中取得消息的客户端应用程序...隔开 会识别两个通配符: "#" 和 "*" , "#" 匹配0个或多个单词, " * " 匹配一个单词 整合RabbitMQ 引入spring-boot-starter-amqp依赖 application.yml...setConnectionTimeout); factory.afterPropertiesSet(); return factory; } } } 自动配置了连接工厂

    36520
    领券