如何在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
相关产品推荐
相关产品推荐

