在spring中如何操作RabbitMQ?

168 阅读2分钟

(一) 添加依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
            <version>2.2.1.RELEASE</version>
</dependency>

(二) 设置配置信息

spring:
  application:
    name: RabbitMQ-Test # 应用名称
  rabbitmq:
    host: localhost #rabbitServer的地址
    port: 5672 # 端口
    username: guest # 用户名称
    password: guest # 连接密码
    virtual-host: /

server: 
  port: 9090

(三) 启动类添加EnableRabbit注解

@SpringBootApplication
@EnableRabbit
public class RabbitMqTestApplication {
    public static void main(String [] args){
        SpringApplication.run(RabbitMqTestApplication.class,args);
    }
}

Spring提供操作RabbitMQ的工具类

1、RabbitTemplate:  是Spring集成RabbitMQ而提供的一个工具类,跟JdbcTemplate一样,可以通过它进行消息的发送和接收。

2、RabbitAdmin :  主要用于管理交换机和队列的信息。

(二) 测试的公共执行代码

// 测试前加载RabbitAdmin
 private static AmqpAdmin amqpAdmin;

    private static ConnectionFactory connectionFactory;
    @BeforeClass
    public static void loadNeedBean(){
        com.rabbitmq.client.ConnectionFactory connFactory = new com.rabbitmq.client.ConnectionFactory();
        connFactory.setHost("47.91.198.211");
        connFactory.setPort(5672);
        connFactory.setUsername("guest");
        connFactory.setPassword("guest");
        connFactory.setVirtualHost("/");
        connectionFactory = new CachingConnectionFactory(connFactory);
        // RabbitAdmin 主要用于管理交换机和队列的信息
        amqpAdmin = new RabbitAdmin(connectionFactory);
    }

(三) 操作交换机(Exchange)

// 交换机操作
    @Test
    public void rabbitExchangeTest() throws Exception{
        // 创建交换机
        // 参数分别是: 交换机名称,是否持久化,是否自动删除
        Exchange exchange = new DirectExchange("direct_test",true,false);
        amqpAdmin.declareExchange(exchange);

        // 删除交换机
        amqpAdmin.deleteExchange("direct_test");
    }

(四) 操作队列(Queue)

// 操作队列
    @Test
    public void rabbitExchangeAndQueueTest() throws Exception{
        // 创建队列
        Queue queue = new Queue("queue_test111");
        amqpAdmin.declareQueue(queue);
        // 删除队列
        amqpAdmin.deleteQueue("queue_test111");
    }

(五) 交换机和队列的绑定

// 队列和交换机操作
    @Test
    public void rabbitQueueTest(){
        // 创建交换机
        Exchange exchange = new DirectExchange("direct_test2",true,false);
        amqpAdmin.declareExchange(exchange);
        // 创建队列
        Queue queue = new Queue("queue_test",true);
        amqpAdmin.declareQueue(queue);
        // 绑定交换机交换机
        //Binding binding = new Binding("direct_test2", Binding.DestinationType.EXCHANGE,"direct_test2","rount-key",null);
        // 队列绑定到交换机
        Binding binding = new Binding("queue_test", Binding.DestinationType.QUEUE,"direct_test2","rount-key",null);
        amqpAdmin.declareBinding(binding);
    }

(六) 消息生产者发送消息到消息队列中

    @Test
    public void messageProductTest(){
        // 消息操作模板
        RabbitTemplate rest = new RabbitTemplate(connectionFactory);
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setContentType(MessageProperties.CONTENT_TYPE_JSON);
        // 发送消息方式一
        String msg = "hello world";
        Message message = new Message(msg.getBytes(),messageProperties);
        // 发送消息方式二
        HashMap map = new HashMap();
        map.put("key","value");
        rest.convertAndSend("direct_test2","rount-key",map);
    }

(七) 消息消费者从队列中消费(手动执行的方式)

// 消息的消费者
    @Test
    public void messageConsumerTest() throws  Exception{
        RabbitTemplate rest = new RabbitTemplate(connectionFactory);
        // 从名为queue_test的队列中获取消息
        Message queue_test = rest.receive("queue_test");
        System.out.println(new String(queue_test.getBody(),"UTF-8"));
    }

(八) 消息消费者从队列中消费(自动监听,使用注解的方式)

@RestController
public class RabbitController {

    // 指定需要监听的队列名称,可以是多个
    @RabbitListener(queues = "queue_test")
    public void messageListener(Message data){
        System.out.println("收到数据:----------");
        System.out.println(data);
    }

}