RabbitMQ Exception: operation queue.declare caused a channel exception not_found in server side

问题描述 投票:0回答:1

我定义了两个队列 'request.queue' 和 'result.queue' ,我的 Web UI 在 'request.queue' 中生成消息,然后我的 python 应用程序从 'request.queue' 中使用它并开始处理然后推送结果进入“result.queue”,最后从“result.queue”向用户显示结果,如this link。它在我的 labtop 上与 ubuntu 20.4 一起工作得很好但是当我将我的所有代码放入 ubuntu 20.4 操作系统的服务器时,它不起作用并且只创建'request.queue'然后抛出异常:(“操作queue.declare导致未找到通道异常:虚拟主机“/”中没有队列“result.queue” 和另一个日志: SimpleMessageListenerContainer:代理不可用;不能在启动期间强制队列声明:java.net.ConnectException: Connection refused (Connection refused)

消费者抛出异常,如果连接工厂支持,处理可以重新开始。异常汇总:org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused(连接被拒绝)

Caused by: com.rabbitmq.client.ShutdownSignalException: channel error;协议方法:#method(reply-code=404, reply-text=NOT_FOUND - vhost '/' 中没有队列 'result.queue', class-id=50, method-id=10)

服务器中的RabbitMq版本为3.8.8,Erlang版本为23.0.3.

任何人都可以帮助我为什么我在服务器上的代码抛出异常?

我的用于声明队列的 spring boot java 代码在这里:

@Configuration
public class RequestConfiguration extends RabbitMqConfiguration {
    
    @Value("${spring.rabbitmq.queue}")
    String queueName;

    @Value("${spring.rabbitmq.exchange}")
    String exchange;

    @Value("${spring.rabbitmq.routingkey}")
    String routingkey;

    @Bean
    Queue queue() {
        return new Queue(queueName, true);
   }

    @Bean
    DirectExchange exchange() {
        return new DirectExchange(exchange);
    }

    @Bean
    Binding binding(Queue queue, DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(routingkey);
    }

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

    @Bean
    public AmqpTemplate rabbitTemplate() {
        final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
        rabbitTemplate.setMessageConverter(jsonMessageConverter());
        return rabbitTemplate;
    }
}


#And for consumer:

@Configuration
public class ResultConsumerConfiguration extends RabbitMqConfiguration {

    @Value("${spring.rabbitmq.resultQueue}")
    String resultQueueName;

    @Value("${spring.rabbitmq.resultExchange}")
    String exchange;

    @Value("${spring.rabbitmq.resultRoutingkey}")
    String routingkey;

    @Bean
    Queue queue() {
        return new Queue(resultQueueName, true);
    }

    @Bean
    DirectExchange exchange() {
        return new DirectExchange(exchange);
    }

    @Bean
    Binding binding(Queue queue, DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(routingkey);
    }

    @Bean
    public MessageConverter jsonMessageConverter() {
        final Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
        converter.setClassMapper(classMapper());
        return converter;
    }
    
    @Bean
    public DefaultClassMapper classMapper() {
        DefaultClassMapper typeMapper = new DefaultClassMapper();
        typeMapper.setDefaultType(ResultMessageGeneral.class);

        return typeMapper;
    }
    
    @Bean
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate template = new RabbitTemplate(connectionFactory());
        template.setRoutingKey(this.resultQueueName);
        template.setMessageConverter(jsonMessageConverter());
        return template;
    }
    
    @Bean
    public SimpleMessageListenerContainer listenerContainer() {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory());
        container.setQueueNames(this.resultQueueName);
        container.setMessageListener(listenerAdapter());

        return container;
    }
    
    
     @Bean
        MessageListenerAdapter listenerAdapter() {
            return new MessageListenerAdapter(rabbitMqListener, jsonMessageConverter());
        }
 
}
java spring-boot rabbitmq amqp
1个回答
0
投票

因为'result.queue'不存在。

从您的代码中,您只需声明一个队列,应该是“request.queue”

你还需要声明'result.queue'

希望对你有帮助

© www.soinside.com 2019 - 2024. All rights reserved.