该版本仍在开发中,尚未被视为稳定。请使用最新的稳定版本,使用 Spring AMQP 4.0.0!spring-doc.cadn.net.cn

急躁者的快速游览

介绍

这是春季AMQP入门的五分钟导览。spring-doc.cadn.net.cn

前提条件:安装并运行RabbitMQ代理(https://www.rabbitmq.com/download.html)。 然后获取Spring兔JAR及其所有依赖——最简单的方法是在构建工具中声明依赖。 例如,对于Maven,你可以做类似以下的事情:spring-doc.cadn.net.cn

<dependency>
  <groupId>org.springframework.amqp</groupId>
  <artifactId>spring-rabbit</artifactId>
  <version>3.1.13-SNAPSHOT</version>
</dependency>

对于Gradle,你可以做类似的作:spring-doc.cadn.net.cn

compile 'org.springframework.amqp:spring-rabbit:3.1.13-SNAPSHOT'

兼容性

Spring Framework 的最低版本依赖是 6.1.0。spring-doc.cadn.net.cn

最低限度AMQP-clientJava 客户端库版本为 5.18.0。spring-doc.cadn.net.cn

最低限度流客户端流队列的 Java 客户端库是 0.12.0。spring-doc.cadn.net.cn

非常非常快

本节提供了最快的入门介绍。spring-doc.cadn.net.cn

首先,添加以下内容进口使本节后面示例成立的陈述:spring-doc.cadn.net.cn

import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;

以下示例使用纯命令式 Java 发送和接收消息:spring-doc.cadn.net.cn

ConnectionFactory connectionFactory = new CachingConnectionFactory();
AmqpAdmin admin = new RabbitAdmin(connectionFactory);
admin.declareQueue(new Queue("myqueue"));
AmqpTemplate template = new RabbitTemplate(connectionFactory);
template.convertAndSend("myqueue", "foo");
String foo = (String) template.receiveAndConvert("myqueue");

注意还有一个连接工厂在原生 Java Rabbit 客户端中。 我们在前述代码中使用了 Spring 抽象。 它缓存通道(以及可选的连接)以便重复使用。 我们依赖经纪人中的默认交换(因为发送时未指定交换),以及所有队列通过名称绑定默认交换的默认链接(因此,我们可以在发送时使用队列名称作为路由密钥)。 这些行为在AMQP规范中有定义。spring-doc.cadn.net.cn

使用XML配置

以下示例与前例相同,但将资源配置外部化为 XML:spring-doc.cadn.net.cn

ApplicationContext context =
    new GenericXmlApplicationContext("classpath:/rabbit-context.xml");
AmqpTemplate template = context.getBean(AmqpTemplate.class);
template.convertAndSend("myqueue", "foo");
String foo = (String) template.receiveAndConvert("myqueue");
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/rabbit
           https://www.springframework.org/schema/rabbit/spring-rabbit.xsd
           http://www.springframework.org/schema/beans
           https://www.springframework.org/schema/beans/spring-beans.xsd">

    <rabbit:connection-factory id="connectionFactory"/>

    <rabbit:template id="amqpTemplate" connection-factory="connectionFactory"/>

    <rabbit:admin connection-factory="connectionFactory"/>

    <rabbit:queue name="myqueue"/>

</beans>

默认情况下,<rabbit:admin/>声明会自动查找类型为 的队列,交换捆绑并代表用户向经纪人声明。 因此,你不必在简单的 Java 驱动中明确使用那个豆子。 XML 模式中组件属性有很多配置选项。 你可以使用XML编辑器的自动补全功能来探索它们并查看文档。spring-doc.cadn.net.cn

使用Java 配置

以下示例重复了与前例相同的示例,但外部配置是用 Java 定义的:spring-doc.cadn.net.cn

ApplicationContext context =
    new AnnotationConfigApplicationContext(RabbitConfiguration.class);
AmqpTemplate template = context.getBean(AmqpTemplate.class);
template.convertAndSend("myqueue", "foo");
String foo = (String) template.receiveAndConvert("myqueue");

........

@Configuration
public class RabbitConfiguration {

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

    @Bean
    public RabbitAdmin amqpAdmin() {
        return new RabbitAdmin(connectionFactory());
    }

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

    @Bean
    public Queue myQueue() {
       return new Queue("myqueue");
    }
}

使用Spring Boot自动配置和异步POJO监听器

Spring Boot 会自动配置基础设施豆,如下示例所示:spring-doc.cadn.net.cn

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public ApplicationRunner runner(AmqpTemplate template) {
        return args -> template.convertAndSend("myqueue", "foo");
    }

    @Bean
    public Queue myQueue() {
        return new Queue("myqueue");
    }

    @RabbitListener(queues = "myqueue")
    public void listen(String in) {
        System.out.println(in);
    }

}