【问题标题】:Load spring context even if rabbitmq is down即使 rabbitmq 已关闭,也加载 spring 上下文
【发布时间】:2016-02-25 12:27:59
【问题描述】:

即使 RabbitMQ 消息代理关闭,是否可以使用 @RabbitListener 加载 spring 上下文? 该行为应该与代理断开连接的情况类似。应用程序正在等待代理,当它恢复时,侦听器会自动重新连接。

Spring Boot 1.3.2.RELEASE

GitHub demo project

spring-amqp 配置:

@Bean
public MessageConverter jsonMessageConverter() {
    return new JsonMessageConverter();
}

@Bean
public ConnectionFactory connectionFactory() {
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host);
    connectionFactory.setUsername(username);
    connectionFactory.setPassword(password);
    return connectionFactory;
}

@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory());
    factory.setConcurrentConsumers(10);
    factory.setMaxConcurrentConsumers(10);
    factory.setMessageConverter(jsonMessageConverter());
    return factory;
}

@Bean
public AmqpAdmin amqpAdmin() {
    RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory());
    rabbitAdmin.setIgnoreDeclarationExceptions(true); // useless
    return rabbitAdmin;
}

监听器配置:

@Service
public class CalculatorServiceV2 {

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "calc_service_v2.multiply", durable = "false", autoDelete = "true"),
            exchange = @Exchange(value = "calc_service_v2", durable = "false", autoDelete = "true"),
            key = "multiply"))
    public Result multiply(Operands operands) {
        // do something..
    }
}

【问题讨论】:

    标签: java rabbitmq spring-amqp


    【解决方案1】:

    你使用的是什么版本的 Spring AMQP?

    你能提供一个堆栈跟踪吗? (编辑问题,不要尝试将其放在评论中)。

    我刚刚进行了测试,它按预期工作;侦听器容器每 5 秒尝试重新连接一次(默认恢复间隔)。

    rabbitAdmin.setIgnoreDeclarationExceptions(true); // 没用的

    在 1.6(目前处于里程碑 1)中,我们更改了该布尔值以跳过所有异常;以前它只适用于由代理返回的错误引起的异常。

    但是,在建立连接之前,管理员不会尝试声明元素,因此在这种情况下应该没有实际意义。

    我需要查看堆栈跟踪以了解您的情况。

    【讨论】:

    • 经过一些实验我发现,我很不耐烦。有 5 个侦听器和 10 个工作人员(并发消费者)大约需要 4 分钟才能完成连接到代理的所有尝试。然后最终加载了spring上下文。如果您愿意,我可以将示例项目发布到 GitHub。
    • 如果您不介意 - 我只是尝试使用 Boot 1.3.3 进行复制,并立即加载应用上下文,即使代理关闭。
    • 我刚刚用 Boot 1.3.3 尝试了演示项目:Started Application in 193.104 seconds
    • 嗯——我想我需要看看你的项目。
    • 点击问题中的链接:Github demo project
    猜你喜欢
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2011-04-17
    相关资源
    最近更新 更多