You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JMS+RabbitMQ环境中禁止自动创建队列?

禁止RabbitMQ自动创建队列的JMS配置问题

我正在开发一个微服务,需求是禁止服务在RabbitMQ中自动创建队列。

我通过RabbitMQ GUI创建了一个用户,仅赋予读写权限,试图以此避免队列被自动创建,权限配置如下:

虚拟主机配置正则表达式写入正则表达式读取正则表达式
/^$.*.*

随后配置了JMS消费者:

@Component
public class MessageConsumer {
    @JmsListener(destination = "${rabbitmq.queueName}")
    public void onMessage(Message message) throws JMSException {
              // 业务逻辑
    }
}

尽管目标队列已经存在,但启动应用时仍报错:

com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=403, reply-text=ACCESS_REFUSED - configure access to exchange 'jms.durable.queues' in vhost '/' refused for user 'app-user', class-id=40, method-id=10)

显然JMS需要配置权限,但如果把“配置正则表达式”改为.*,错误会消失,但队列不存在时会被自动创建——这正是我要避免的,因为配置文件中队列名拼写错误会导致创建新队列,进而产生难以追踪的静默错误。

我需要找到一种方法,在JMS和RabbitMQ的配合下禁止自动创建队列,同时保证服务能正常消费已存在的队列消息。

相关的Bean配置如下:

@Configuration
@EnableJms
public class MessageConfiguration {
    @Bean
    public ConnectionFactory createConnectionFactory(//
            @Value("${rabbitmq.host}") String host, //
            @Value("${rabbitmq.port}") int port, //
            @Value("${rabbitmq.vhost}") String vhost, //
            @Value("${rabbitmq.username}") String username, //
            @Value("${rabbitmq.password}") String password//
    ) {
        RMQConnectionFactory factory = new RMQConnectionFactory();
        factory.setHost(host);
        factory.setPort(port);
        factory.setVirtualHost(vhost);
        factory.setUsername(username);
        factory.setPassword(password);
        return factory;
    }

    @Bean
    public JmsTemplate createJmsTemplate(@Autowired ConnectionFactory connectionFactory,
            @Autowired MessageConverter messageConverter) {
        JmsTemplate template = new JmsTemplate(connectionFactory);
        template.setMessageConverter(messageConverter);
        return template;
    }

    @Bean
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(
            @Autowired ConnectionFactory connectionFactory, @Autowired MessageConverter messageConverter) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setMessageConverter(messageConverter);
        factory.setSessionTransacted(true);
        return factory;
    }

    @Bean
    public MessageConverter createMessageConverter() {
        JacksonJsonMessageConverter converter = new JacksonJsonMessageConverter(//
                JsonMapper.builder()//
                        .changeDefaultPropertyInclusion(i -> i.withValueInclusion(JsonInclude.Include.NON_NULL))//
                        .build());
        converter.setTargetType(MessageType.TEXT);
        converter.setTypeIdPropertyName("type");
        return converter;
    }
}

内容的提问来源于stack exchange,提问作者marciel.deg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 22:14:49