我定义了两个队列 '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
服务器中的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());
}
}
因为'result.queue'不存在。
从您的代码中,您只需声明一个队列,应该是“request.queue”
你还需要声明'result.queue'
希望对你有帮助