spring-amqp 不会使用 AmqpTemplate.convertAndSend() 插入消息

spring-amqp will not insert message using AmqpTemplate.convertAndSend()

这里是一个 Spring 小程序,预计会向 rabbitmq 队列中插入一条消息:

public class Main {
  public static void main(String [] args) throws IOException {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(QueueConfiguration.class);
    AmqpTemplate template = context.getBean(AmqpTemplate.class);
    template.convertAndSend("asdflk ...");
    context.destroy();
  }
}

ApplicationContext如下:

@Configuration
public class QueueConfiguration {

  @Bean
  public ConnectionFactory connectionFactory() {
    return new CachingConnectionFactory("192.168.1.39");
  }

  @Bean
  public RabbitTemplate rabbitTemplate() {
    return new RabbitTemplate(connectionFactory());
  }
}

当我检查服务器上队列的内容时,没有插入任何内容。我还尝试在 RabbitTemplate 上设置交换名称或队列名称,但服务器上仍然没有任何显示。

应用程序的日志没有显示任何错误,但记录如下:

17:28:02.441 [main] DEBUG o.s.amqp.rabbit.core.RabbitTemplate - Executing callback on RabbitMQ Channel: Cached Rabbit Channel: AMQChannel(amqp://guest@192.168.1.39:5672/,1)
17:28:02.441 [main] DEBUG o.s.amqp.rabbit.core.RabbitTemplate - Publishing message on exchange [], routingKey = []

有什么问题吗?

我必须在调用 convertAndSend() 时将队列作为参数提供:

template.convertAndSend("hello2", "asdflk ...");

仍然想知道为什么 spring-amqp 不会抛出异常。有人知道没有队列的情况下消息投递到哪里吗?

我想我会按照 spring-amqp example 在 bean rabbitTemplate() 中保留路由键和队列名称。因为我目前正在使用多个队列,所以我对每个队列都有不同的 class,我在其中有这样的 rabbitTemplate:

@Bean
public RabbitTemplate rabbitTemplate() {
    RabbitTemplate template = new RabbitTemplate(connectionFactory());
    //The routing key = name of the queue in default exchange.
    template.setRoutingKey("MyQueue");
    // Queue name
    template.setQueue("MyQueue");
    return template;
}

您是否使用 tomcat 来部署它?如果是,那么这些可以在启动时加载,这将初始化所有 connection/channel/queues 等。