java - RabbitMQ Exchange 和 Queue 不是自动创建的

标签 java rabbitmq spring-amqp spring-rabbit

我创建了一个新的 spring 应用程序,它将消息推送到 rabbitmq 服务器。 我的 rabbitMQConfig java 文件如下所示:

@Configuration
public class RabbitMQConfig {

    private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQConfig.class);

    @Value("${spring.rabbitmq.host}")
    private String SPRING_RABBITMQ_HOST;

    @Value("${spring.rabbitmq.port}")
    private int SPRING_RABBITMQ_PORT;

    @Value("${spring.rabbitmq.username}")
    private String SPRING_RABBITMQ_USERNAME;

    @Value("${spring.rabbitmq.password}")
    private String SPRING_RABBITMQ_PASSWORD;

    @Bean
    public RabbitTemplate rabbitTemplate(){
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory(SPRING_RABBITMQ_HOST,SPRING_RABBITMQ_PORT);
        connectionFactory.setUsername(SPRING_RABBITMQ_USERNAME);
        connectionFactory.setPassword(SPRING_RABBITMQ_PASSWORD);
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setExchange("my.controller.exchange");
        rabbitTemplate.setRoutingKey("my.controller.key");
        return rabbitTemplate;
    }

    @Bean
    DirectExchange exchange() {
            return new DirectExchange("my.controller.exchange", true, false);
    }

    @Bean
    public Queue queue() {
            return new Queue("my.controller", true);
    }

    @Bean
    Binding exchangeBinding(DirectExchange exchange, Queue queue) {
            return BindingBuilder.bind(queue).to(exchange).with("my.controller.key");
    }
}

下面是我如何将消息推送到队列:

@Service
public class RabbitPublisher {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    private static Logger LOGGER = Logger.getLogger(RabbitPublisher.class);

    public  Boolean  pushToMyQueue(HashMap<String, Object> message) {
        try {
            rabbitTemplate.convertAndSend("my.controller.exchange","my.controller.key",message);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            LOGGER.error("Error in pushing to my queue", e);
        }
        return false;
    }
}

由于rabbitmq服务器上不存在exchange和queue,我希望它们能够自动创建并推送消息。但它会导致以下错误:

ERROR 18198 --- [168.201.18:5672] o.s.a.r.c.CachingConnectionFactory       : 
Channel shutdown: channel error; protocol method: #method<channel.close>
(reply-code=404, reply-text=NOT_FOUND - no exchange 
'my.controller.exchange' in vhost '/', class-id=60, method-id=40)

当我创建交换器和队列并在服务器上手动绑定(bind)它们时,一条消息被成功推送。 如果我遗漏了什么,请告诉我。谢谢。

最佳答案

您需要添加一个 RabbitAdmin @Bean。管理员将在首次打开连接时声明元素。

关于java - RabbitMQ Exchange 和 Queue 不是自动创建的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47748187/

相关文章:

java - getLongArrayExtra 返回 null

java - 关于从另一个对象访问的 protected 方法访问级别是什么

linux - Docker 在 docker 主机内部监听 RabbitMQ 而不是从外部监听,为什么?

java - Rabbitmq 队列为空,尽管队列中有消息

rabbitmq - 覆盖 SimpleMessageListenerContainer.setDefaultRequeueRejected(false) 行为

java - 如何在 Netbeans 中自定义 jTable 标题列字体大小?

java - 如何使用 JavaScript 显示托管 bean 的计时器?

java - 如何在运行多个服务时只获取一个 Redis 事件?

java - RabbitMQ 消息在消费时不会出队

java - Spring AMQP中事务的用例