【问题标题】:Durable queues using Spring Rabbitmq Stomp使用 Spring Rabbitmq Stomp 的持久队列
【发布时间】:2016-05-18 07:19:28
【问题描述】:

我对 Spring 和 RabbitMQ 有以下配置:

春季启动:1.2.7

RabbitMQ:3.5.4

我正在使用以下 Spring bean 创建 Stomp 端点(我的配置类扩展 AbstractWebSocketMessageBrokerConfigurer):

    @Bean
    public TopicExchange streamingExchange(@Qualifier("admin") final RabbitAdmin rabbitAdmin) {
        TopicExchange topicExchange = new TopicExchange(exchangeName, true, false);
        topicExchange.setAdminsThatShouldDeclare(rabbitAdmin);
        return topicExchange;
    }

    @Override
    public void configureMessageBroker(final MessageBrokerRegistry config) {
        config.enableStompBrokerRelay("/my_stream", "/test").setRelayHost(host)
        .setSystemLogin(username).setSystemPasscode(password).setClientLogin(username)
                .setClientPasscode(password);
    }

    @Override
    public void registerStompEndpoints(final StompEndpointRegistry registry) {
        registry.addEndpoint("/test").setAllowedOrigins("*").withSockJS();
    }

现在,当客户端连接到此端点时,会创建一个临时队列,并通过队列流式传输响应数据。如果客户端断开连接,队列将被删除并且消息会丢失。

为了防止这种情况,我想创建持久队列(因为这些队列的持久设置为 false 并且自动删除设置为 true)如果没有,我想在这些队列上设置一些过期时间(例如 1 小时或其他时间) )。从 RabbitMQ documentation 看来,我们可以在标头中传递这些值,但是,这仅适用于 3.6.0 及更高版本,因为我们有 3.5.4,这不是一个选项。

还有其他方法可以配置吗? (另一种方法是为连接请求添加某种侦听器并以编程方式配置队列参数?我不确定这是否可行,因为我对 spring rabbitmq stomp 插件了解不多)

【问题讨论】:

    标签: java spring websocket rabbitmq stomp


    【解决方案1】:

    想知道您是否尝试过使用 rabbitmqadmin 工具将队列声明为持久队列?

    rabbitmqadmin declare queue name=your-queue durable=true
    

    可以从这里下载管理工具https://www.rabbitmq.com/management-cli.html

    【讨论】: